ZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmNWI0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTYxOTMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAyLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUGx1Z2luLnByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YThjY2ZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9WYWxpZGF0aW9uUHJlZnNfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTxjb250ZXh0cz4KLQk8IS0tIEVjbGlwc2UgVmFsaWRhdGlvbiBwcmVmZXJlbmNlcyAtLT4KLTxjb250ZXh0IGlkPSJqdmdwMDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgcGFnZSBhbGxvd3MgeW91IHRvIHZpZXcgb3IgY2hhbmdlIHRoZSBkZWZhdWx0IHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIGFsbCB3b3JrYmVuY2ggcHJvamVjdHMuIEEgdmFsaWRhdG9yIGlzIGEgdG9vbCB0aGF0IGNoZWNrcyB0aGF0IHJlc291cmNlcyBjb25mb3JtIHRvIGEgc3BlY2lmaWNhdGlvbiwgRFRELCBvciBzb21lIG90aGVyIHNldCBvZiBydWxlcy4KLQotRWFjaCB2YWxpZGF0b3IgY2FuIGFwcGx5IHRvIGNlcnRhaW4gdHlwZXMgb2YgZmlsZXMsIGNlcnRhaW4gcHJvamVjdCBuYXR1cmVzLCBhbmQgY2VydGFpbiBwcm9qZWN0IGZhY2V0cy4gV2hlbiBhIHZhbGlkYXRvciBhcHBsaWVzIHRvIGEgcHJvamVjdCBmYWNldCBvciBuYXR1cmUsIHRoZSB3b3JrYmVuY2ggdXNlcyB0aGF0IHZhbGlkYXRvciBvbmx5IG9uIHByb2plY3RzIHRoYXQgaGF2ZSB0aGF0IGZhY2V0IG9yIG5hdHVyZS4gTGlrZXdpc2UsIG1vc3QgdmFsaWRhdG9ycyBhcHBseSBvbmx5IHRvIGNlcnRhaW4gdHlwZXMgb2YgZmlsZXMsIHNvIHRoZSB3b3JrYmVuY2ggdXNlcyB0aG9zZSB2YWxpZGF0b3JzIG9ubHkgb24gdGhvc2UgdHlwZXMgb2YgZmlsZXMuCi0KLVNlbGVjdCB0aGUgPGI+QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5nczwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRvIGFsbG93IGluZGl2aWR1YWwgcHJvamVjdHMgdG8gc2V0IHRoZWlyIG93biB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiBUbyBjb25maWd1cmUgbmV3IHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIGFuIGluZGl2aWR1YWwgcHJvamVjdCwgc2VsZWN0IHRoZSBwcm9qZWN0IGluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2sgYW5kIHNlbGVjdCA8Yj5Qcm9wZXJ0aWVzPC9iPiAgICZndDsgPGI+VmFsaWRhdGlvbjwvYj4gLgotCi1TZWxlY3QgdGhlIDxiPlN1c3BlbmQgYWxsIHZhbGlkYXRvcnM8L2I+IGNoZWNrIGJveCB0byBwcmV2ZW50IHZhbGlkYXRpb24gYXQgdGhlIGdsb2JhbCBsZXZlbC4gSWYgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgeW91IGNhbiBzdGlsbCBlbmFibGUgdmFsaWRhdGlvbiBhdCB0aGUgcHJvamVjdCBsZXZlbC4KLQotU2VsZWN0IHRoZSA8Yj5TYXZlIGFsbCBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBwcmlvciB0byB2YWxpZGF0aW5nPC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8gc2F2ZSBhbnkgcmVzb3VyY2VzIHlvdSBoYXZlIG1vZGlmaWVkIGJlZm9yZSB0aGUgdmFsaWRhdGlvbiBiZWdpbnMuCi0KLUluIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMsIHNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byBlYWNoIHZhbGlkYXRvciB5b3Ugd2FudCB0byB1c2UgYXQgdGhlIGdsb2JhbCBsZXZlbC4gRWFjaCB2YWxpZGF0b3IgaGFzIGEgY2hlY2sgYm94IHRvIHNwZWNpZnkgd2hldGhlciBpdCBpcyB1c2VkIG9uIG1hbnVhbCB2YWxpZGF0aW9uIG9yIG9uIGJ1aWxkIHZhbGlkYXRpb24uIENob29zZSBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZm9yIGEgdmFsaWRhdG9yIGJ5IGNsaWNraW5nIHRoZSBidXR0b24gaW4gdGhlIDxiPlNldHRpbmdzPC9iPiBjb2x1bW4uIE5vdCBhbGwgdmFsaWRhdG9ycyBoYXZlIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMuCi0KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIGxhYmVsPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIGxhYmVsPSJPdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbCIgbGFiZWw9IkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25Qcm9qUHJlZnNfSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9WYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OWFmMzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25Qcm9qUHJlZnNfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTxjb250ZXh0cz4KLQk8IS0tIFZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIHByb2plY3QgLS0+Ci0KLTxjb250ZXh0IGlkPSJqdnBwMDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIHByb2plY3QgdmFsaWRhdGlvbiBwYWdlIGFsbG93cyB5b3UgdG8gdmlldyBvciBjaGFuZ2UgdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIGEgcHJvamVjdC4gQSB2YWxpZGF0b3IgaXMgYSB0b29sIHRoYXQgY2hlY2tzIHRoYXQgcmVzb3VyY2VzIGNvbmZvcm0gdG8gYSBzcGVjaWZpY2F0aW9uLCBEVEQsIG9yIHNvbWUgb3RoZXIgc2V0IG9mIHJ1bGVzLgotCi1FYWNoIHZhbGlkYXRvciBjYW4gYXBwbHkgdG8gY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgY2VydGFpbiBwcm9qZWN0IG5hdHVyZXMsIGFuZCBjZXJ0YWluIHByb2plY3QgZmFjZXRzLiBXaGVuIGEgdmFsaWRhdG9yIGFwcGxpZXMgdG8gYSBwcm9qZWN0IGZhY2V0IG9yIG5hdHVyZSwgdGhlIHdvcmtiZW5jaCB1c2VzIHRoYXQgdmFsaWRhdG9yIG9ubHkgb24gcHJvamVjdHMgdGhhdCBoYXZlIHRoYXQgZmFjZXQgb3IgbmF0dXJlLiBMaWtld2lzZSwgbW9zdCB2YWxpZGF0b3JzIGFwcGx5IG9ubHkgdG8gY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgc28gdGhlIHdvcmtiZW5jaCB1c2VzIHRob3NlIHZhbGlkYXRvcnMgb25seSBvbiB0aG9zZSB0eXBlcyBvZiBmaWxlcy4KLQotU2VsZWN0IHRoZSA8Yj5PdmVycmlkZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBzZXQgaW4gdGhlIHdvcmtiZW5jaCBQcmVmZXJlbmNlcyBwYWdlLiBJZiB0aGUgPGI+T3ZlcnJpZGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYj4gY2hlY2sgYm94IGlzIG5vdCBlbmFibGVkLCBnbyB0byA8Yj5XaW5kb3c8L2I+ICAgJmd0OyA8Yj5QcmVmZXJlbmNlczwvYj4gICAmZ3Q7IDxiPlZhbGlkYXRpb248L2I+IGFuZCBzZWxlY3QgdGhlIDxiPkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3M8L2I+IGNoZWNrIGJveC4KLQotU2VsZWN0IHRoZSA8Yj5TdXNwZW5kIGFsbCB2YWxpZGF0b3JzPC9iPiBjaGVjayBib3ggdG8gcHJldmVudCB2YWxpZGF0aW9uIGZvciB0aGlzIHByb2plY3QuCi0KLUluIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMsIHNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byBlYWNoIHZhbGlkYXRvciB5b3Ugd2FudCB0byB1c2UgZm9yIHRoaXMgcHJvamVjdC4gRWFjaCB2YWxpZGF0b3IgaGFzIGEgY2hlY2sgYm94IHRvIHNwZWNpZnkgd2hldGhlciBpdCBpcyB1c2VkIG9uIG1hbnVhbCB2YWxpZGF0aW9uIG9yIG9uIGJ1aWxkIHZhbGlkYXRpb24uIENob29zZSBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZm9yIGEgdmFsaWRhdG9yIGJ5IGNsaWNraW5nIHRoZSBidXR0b24gaW4gdGhlIDxiPlNldHRpbmdzPC9iPiBjb2x1bW4uIE5vdCBhbGwgdmFsaWRhdG9ycyBoYXZlIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMuCi0KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIGxhYmVsPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIGxhYmVsPSJPdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbCIgbGFiZWw9IkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhZGJlOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgVmFsaWRhdGlvblByZWZzX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgVmFsaWRhdGlvblByb2pQcmVmc19IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMwNzA5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRyYW5zbGF0aW9uIEluc3RydWN0aW9uOiBzZWN0aW9uIHRvIGJlIHRyYW5zbGF0ZWQKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1QbHVnaW4ubmFtZSA9IFdTVCB2YWxpZGF0aW9uIGluZm9wb3AgcGx1Zy1pbgotUGx1Z2luLnByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmMjdiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgIDxjb250ZXh0cyBmaWxlPSJWYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkiIC8+Ci0JPGNvbnRleHRzIGZpbGU9IlZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpIiAvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxZTFlYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvZGVzY3JpcHRpb24udHh0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvZGVzY3JpcHRpb24udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZjNmQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2Rlc2NyaXB0aW9uLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhlIEhFQUQgYnJhbmNoIG9mIHRoaXMgcGF0Y2ggZmVhdHVyZSBpcyBpbnRlbnRpb25hbGx5IGVtcHR5LCAKLXRvIGF0dGVtcHQgdG8gdHJ5IGFuZCBhdm9pZCBjb25mdXNpb24uIAotCi1QbGVhc2UgbG9hZCB0aGUgY29ycmVjdCB2ZXJzaW9uIGZyb20gdGhlIGJyYW5jaCBvZiB0aGUgcmVsYXRlZCBwYXRjaC4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIwY2FhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTJmNDYyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0NDgwYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkMjIzZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgQ29tbW9uIENvcmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgY29tbW9uIGNvcmUgZnVuY3Rpb25hbGl0eS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjMDlkOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiB2ZXJzaW9uPSIxLjEuMjAwIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIiB2ZXJzaW9uPSIyLjAuMTAwIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0IiB2ZXJzaW9uPSIyLjQuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIiB2ZXJzaW9uPSIyLjQuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIgdmVyc2lvbj0iMS4xLjIwMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiIHZlcnNpb249IjMuNC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiB2ZXJzaW9uPSIzLjQuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdmVyc2lvbj0iMS4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIHZlcnNpb249IjEuMy4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiIHZlcnNpb249IjMuNC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIiB2ZXJzaW9uPSIxLjAuMjAzIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMiIHZlcnNpb249IjMuNC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHZlcnNpb249IjEuMC4yMDAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiIHZlcnNpb249IjEuNy4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmFudC5jb3JlIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5vc2dpLnV0aWwiIHZlcnNpb249IjMuMS4zMDAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIiB2ZXJzaW9uPSIyLjQuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgdmVyc2lvbj0iMS4xLjIwMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIiB2ZXJzaW9uPSIxLjEuMzAxIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5pYm0uaWN1IiB2ZXJzaW9uPSIzLjguMS4xIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnV0aWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhYmZiNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0OWU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDBmNTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBDb21tb24gQ29yZSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBjb21tb24gY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+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+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3NGZjMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIENvbW1vbiBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI1YjBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gQ29tbW9uIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM5MjViLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKLWJ1aWxkLnhtbAotZmVhdHVyZXMKLXBsdWdpbnMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjg2MjUwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzE3ZmMwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZSwgZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5zb3VyY2UKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NmUwMGUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgQ29tbW9uIFBsdWctaW4gRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBjb21tb24gdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NTgzOTIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0gICAgICAgIAotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwYWY3ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMTE2NGYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDg3YTkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBDb21tb24gVUkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgY29tbW9uIFVJIGZ1bmN0aW9uYWxpdHkuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2ZjE1Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIiB2ZXJzaW9uPSIxLjAuMjAzIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIgdmVyc2lvbj0iMS4wLjMwNSIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiIHZlcnNpb249IjMuNC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiB2ZXJzaW9uPSIzLjQuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiIHZlcnNpb249IjEuMS4yMDAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjMuNC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIgdmVyc2lvbj0iMy40LjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnV0aWwiIHZlcnNpb249IjIuMC4xMDAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIgdmVyc2lvbj0iMS4wLjIwMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5mb3JtcyIgdmVyc2lvbj0iMy4zLjEwMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIgdmVyc2lvbj0iMS4zLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZ2VmIiB2ZXJzaW9uPSIzLjQuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIgdmVyc2lvbj0iMy40LjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIgdmVyc2lvbj0iMy40LjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmlibS5pY3UiIHZlcnNpb249IjMuOC4xIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIgdmVyc2lvbj0iMy40LjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIiB2ZXJzaW9uPSIxLjEuMTAxIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiIHZlcnNpb249IjEuMS4zMDEiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0IiB2ZXJzaW9uPSIzLjQuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIHZlcnNpb249IjEuMS4yMDAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHZlcnNpb249IjEuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlMjU3YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUKLWJpbi5pbmNsdWRlcyA9IGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODYxY2ZiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIENvbW1vbiBVSS4KLQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzE0ZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gQ29tbW9uIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwYjczYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBDb21tb24gVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTg4OTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamVtdXRpbCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamVtdXRpbC1ub253b3JrYm5lY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0M2NjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2NTQxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2d0cmFjZT1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2VmaWxlPWZhbHNlCi1vcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dsZXZlbD1XQVJOSU5HClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTQxMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmplbS51dGlsPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzI5NTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gQXByIDE1IDIxOjE1OjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTc5Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotI1R1ZSBKdWwgMzEgMjA6Mzk6NDggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGUxYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEZlYiAyMSAxMDowOToxOSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWZvcm1hdHRlcl9wcm9maWxlPV9qdmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEwCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO29yZy5lY2xpcHNlLnd0cDtvcmcuZWNsaXBzZS5qZW07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkZTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qY207b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamF2YTtvcmcuZWNsaXBzZS52ZTtjb207Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0NmIyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jRnJpIE1heSAxMyAxMDoxMDowNCBFRFQgMjAwNQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0yCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0yCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0yCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg1MWJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLnV0aWw7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlciwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHksCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMS4xLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUEVSRk1TUl9SRUFETUUudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9QRVJGTVNSX1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTEyNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9QRVJGTVNSX1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUgY29kZSBjYW4gYmUgZm91bmQgaW4gdGhlIHBlcmZtc3IuamFyIGxvYWRlZCBhcyBiaW5hcnkgaW4gdGhpcwotcHJvamVjdC4gU2luY2UgdGhpcyBpcyBvcHRpb25hbCwgd2UgbmVlZGVkIHRvIGJlIGFibGUgdG8gY29tcGlsZSB3aXRob3V0IHRoZSB0cnVlCi1wbHVnaW4gYmVpbmcgYXZhaWxhYmxlLiBTbyB3ZSBjcmVhdGVkIHRoZSBzdHViIGphciBjb250YWluaW5nIGp1c3Qgd2hhdCB3ZSBuZWVkZWQuCi0KLUlmIHRoZXJlIGlzIGEgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhlIHN0dWIgamFyLCB5b3Ugd2lsbCBuZWVkIHRvIGNoZWNrb3V0Ci10aGUgZm9sZGVyIG9yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLiBUaGlzIHdpbGwgdGhlbgotYmUgYSBzZXBhcmF0ZSBwcm9qZWN0LiBZb3UgY2FuIHRoZW4gbWFrZSB0aGUgY2hhbmdlcyB0aGVyZSwgYW5kIHRoZW4gZm9sbG93aW5nIHRoZQotUkVBRE1FIGluIHRoYXQgcHJvamVjdCB0byBjcmVhdGUgYW5kIGNvbW1pdCB0aGUgY2hhbmdlcy4gCi0KLVRoZSBqYXIgaXMgaW4gdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoLCBidXQgaXQgaXMgbm90IGV4cG9ydGVkIGFuZCBpcyBub3QgaW4KLXRoZSBwbHVnaW4ueG1sIG9yIGJ1aWxkLnByb3BlcnRpZXMuIFRoaXMgbWVhbnMgaXQgd2lsbCBiZSBhdmFpbGFibGUgZm9yIGNvbXBpbGF0aW9uCi1idXQgaXQgd29uJ3Qgc2hvdyB1cCBpbiB0aGUgcnVudGltZSB3b3JrYmVuY2guClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUkVBRF9NRV9CRUZPUkVfQ0hBTkdJTkdfTUFOSUZFU1RcMDQxXDA0MVwwNDEiICJiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUkVBRF9NRV9CRUZPUkVfQ0hBTkdJTkdfTUFOSUZFU1RcMDQxXDA0MVwwNDEiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MThlOTRhLi4wMDAwMDAwCi0tLSAiYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1JFQURfTUVfQkVGT1JFX0NIQU5HSU5HX01BTklGRVNUXDA0MVwwNDFcMDQxIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotRG8gbm90IGluY2x1ZGUgYSBuZXcgZGVwZW5kZW5jeSBwbHVnaW4gdG8gdGhlIE1BTklGRVNUIGZvciB0aGlzIHBsdWdpbmQhISEKLQotVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoaXMgcGx1Z2luIGlzIGFsc28gZXhlY3V0ZWQgb3V0c2lkZSBvZiBFY2xpcHNlIGZyYW1ld29yaywgc3VjaCBJQk0gV2Vic3BoZXJlIEFwcGxpY2F0aW9uIFNlcnZlciAoYykgSUJNLiBXZSBjYW5ub3QgYWRkCi1uZXcgZGVwZW5kZW5jaWVzIHRvIHRoZSBwbHVnaW4gYmVjYXVzZSB0aGUgY3VycmVudCBzZXQgaXMgY29uc2lkZXJlZCB0byBiZSBBUEkuIEFkZGluZyBhIG5ldyBzZXQgd2l0aG91dCBjb25zdWx0aW5nIHRob3NlIHVzZXJzIHdvdWxkIGJyZWFrCi10aGVtLgotCi1UaGUgZXh0ZXJuYWwgQVBJIGlzIGFueXRoaW5nIGluIHRoZSBqZW11dGlsLW5vbndvcmtiZW5jaCBmb2xkZXIuIElmIGl0IGlzIG9ubHkgZm9yIGEgY2xhc3MgaW4gdGhlIG90aGVyIHNvdXJjZSBmb2xkZXIocykgaXQgbWF5IGJlIE9LIHNpbmNlIHRoZXkgd291bGQgbm90IGJlIAotdXNpbmcgdGhhdCBjb2RlLiBCdXQgaXQgd291bGQgYmUgYmVzdCB0byBjb25zdWx0IHdpdGggdGhlbSBmaXJzdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjcxN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+PGhlYWQ+PHRpdGxlPkFib3V0PC90aXRsZT4KLQotCi0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjwvaGVhZD48Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwZDg1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBqZW11dGlsLyxcCi0gICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLyxcCi0gICAgICAgICAgIGplbXV0aWwtbm9ud29ya2JuZWNoLwotamFycy5jb21waWxlLm9yZGVyID0gLgotZXh0cmEuLiA9IC4vb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL0xvZ0VudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9Mb2dFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTBiYWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL0xvZ0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgd2hlbiBsb2dnaW5nIGluZm9ybWF0aW9uIHdoaWNoIHNob3VsZCBiZSBncm91cGVkIHRvZ2V0aGVyLiBJbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZXZlcnkgdGltZSBpdAotICogaXMgbmVlZGVkLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgY3JlYXRlIGFuIGluc3RhbmNlIGFuZCByZXVzZSBpdC4KLSAqIDxwPgotICogQ3VycmVudGx5IHRoZSBvbmx5IGZpZWxkcyB0aGF0IGFyZSBsb2dnZWQgYXJlIHRoZSB7QGxpbmsgI2dldFRleHQoKX0gYW5kIHtAbGluayAjZ2V0VGFyZ2V0RXhjZXB0aW9uKCl9LgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIExvZ0VudHJ5IHsKLQotCXByaXZhdGUgaW50IF9leGVjdXRpb25NYXAgPSAwOwotCi0JcHJpdmF0ZSBUaHJvd2FibGUgX2NhdWdodEV4Y2VwdGlvbiA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBfcHJvcGVydGllc0ZpbGVOYW1lID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGxvY2FsZU9mT3JpZ2luID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHNvdXJjZUlkZW50aWZpZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGFwc2VkVGltZTsKLQotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlVHlwZUlkZW50aWZpZXI7Ci0KLQkvKioKLQkgKiBUaGUgZmlsZSBuYW1lIHBhcmFtZXRlciBtdXN0IGJlIGEgbmFtZSB3aGljaCBjYW4gYmUgdXNlZCBieSBSZXNvdXJjZUJ1bmRsZSB0byBsb2FkIHRoZSBzdHJpbmcgZnJvbSB0aGUgLnByb3BlcnRpZXMgZmlsZS4gVGhlIHBhcmFtZXRlciBtdXN0IG5vdAotCSAqIGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydGllc0ZpbGVOYW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIExvZ0VudHJ5KFN0cmluZyBwcm9wZXJ0aWVzRmlsZU5hbWUpIHsKLQkJc2V0UHJvcGVydGllc0ZpbGVOYW1lKHByb3BlcnRpZXNGaWxlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBMb2dFbnRyeSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZXhlY3V0aW9uIG1hcAotCSAqIAotCSAqIEByZXR1cm4gZXhlY3V0aW9uIG1hcAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhlY3V0aW9uTWFwKCkgewotCQlyZXR1cm4gX2V4ZWN1dGlvbk1hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb3BlcnRpZXMgZmlsZSBuYW1lCi0JICogCi0JICogQHJldHVybiBwcm9wZXJ0aWVzIGZpbGUgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gX3Byb3BlcnRpZXNGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGFyZ2V0IGV4Y2VwdGlvbgotCSAqIAotCSAqIEByZXR1cm4gdGFyZ2V0IGV4Y2VwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgewotCQlyZXR1cm4gX2NhdWdodEV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbG9jYWxlIG9mIG9yaWdpbgotCSAqIAotCSAqIEByZXR1cm4gbG9jYWxlIG9mIG9yaWdpbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxlT2ZPcmlnaW4oKSB7Ci0JCXJldHVybiBsb2NhbGVPZk9yaWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc291cmNlIGlkZW50aWZpZXIuCi0JICogCi0JICogQHJldHVybiBzb3VyY2UgaWRlbnRpZmllciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlaWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIHNvdXJjZUlkZW50aWZpZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IGVsYXBzZWQgdGltZQotCSAqIAotCSAqIEByZXR1cm4gZWxhcHNlZCB0aW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIGVsYXBzZWRUaW1lOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbWVzc2FnZSB0eXBlIGlkZW50aWZpZXIKLQkgKiAKLQkgKiBAcmV0dXJuIG1lc3NhZ2UgdHlwZSBpZGVudGlmaWVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlVHlwZUlkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBtZXNzYWdlVHlwZUlkZW50aWZpZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IGV4ZWN1dGlvbiBtYXAKLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhlY3V0aW9uTWFwKGludCBtYXApIHsKLQkJX2V4ZWN1dGlvbk1hcCA9IG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgcHJvcGVydGllcyBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZk5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzRmlsZU5hbWUoU3RyaW5nIGZOYW1lKSB7Ci0JCV9wcm9wZXJ0aWVzRmlsZU5hbWUgPSBmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGFyZ2V0IGV4Y2VwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBleGMKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFeGNlcHRpb24oVGhyb3dhYmxlIGV4YykgewotCQlfY2F1Z2h0RXhjZXB0aW9uID0gZXhjOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBzdGFja3RyYWNlIG9mIGN1cnJlbnQgc3RhY2sgKGF0IHRoZSB0aW1lIG9mIGNhbGwgdG8gdGhpcyBtZXRob2QpIHRvIHRoZSB0ZXh0IGJ1ZmZlci4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRTdGFja1RyYWNlKCkgewotCQkvLyBHcmFiIHRoZSBzdGFjayB0cmFjZSBmcm9tIHRoZSBUaHJlYWQgLi4uCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlT3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihieXRlT3V0cHV0KTsKLQkJLy8gQ2FuJ3QgY2FsbCBUaHJlYWQuZHVtcFN0YWNrKCkgYmVjYXVzZSBpdCBkb2Vzbid0IHRha2UgYSB3cml0ZXIgYXMgaW5wdXQuCi0JCS8vIENvcHkgaXRzIG1lY2hhbmlzbSBpbnN0ZWFkLgotCQluZXcgRXhjZXB0aW9uKCJTdGFjayB0cmFjZSIpLnByaW50U3RhY2tUcmFjZShwcmludFdyaXRlcik7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbnRXcml0ZXIuZmx1c2goKTsKLQotCQkvLyBhbmQgdXBkYXRlIHRoZSB0ZXh0IHRvIHRoZSBMb2dFbnRyeSdzIHRleHQuCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0VGV4dCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGJ5dGVPdXRwdXQudG9TdHJpbmcoKSk7Ci0JCXNldFRleHQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRleHQgb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGV4dAotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzdHJpbmcpIHsKLQkJdGV4dCA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZXZlcnkgZW50cnkgdG8gdGhlIGRlZmF1bHQgdmFsdWUgZXhjZXB0IHRoZSBwcm9wZXJ0aWVzIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc2V0RXhlY3V0aW9uTWFwKDApOwotCQlzZXRUYXJnZXRFeGNlcHRpb24obnVsbCk7Ci0JCWxvY2FsZU9mT3JpZ2luID0gbnVsbDsKLQkJc291cmNlSWRlbnRpZmllciA9IG51bGw7Ci0JCWVsYXBzZWRUaW1lID0gbnVsbDsKLQkJc2V0VGV4dChudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbG9jYWxlIG9mIG9yaWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gb3JpZ2luCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxlT2ZPcmlnaW4oU3RyaW5nIG9yaWdpbikgewotCQlsb2NhbGVPZk9yaWdpbiA9IG9yaWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc291cmNlIGlkLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUlEKFN0cmluZyBpZCkgewotCQlzb3VyY2VJZGVudGlmaWVyID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IGVsYXBzZWQgdGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGltZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsYXBzZWRUaW1lKGxvbmcgdGltZSkgewotCQllbGFwc2VkVGltZSA9IFN0cmluZy52YWx1ZU9mKHRpbWUpOwotCX0KLQotCS8qKgotCSAqIFNldCBzb3VyY2UgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlSWRlbnRpZmllcihTdHJpbmcgc3RyaW5nKSB7Ci0JCXNldFNvdXJjZUlEKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IG1lc3NhZ2UgdHlwZSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRUZXh0KFN0cmluZyl9IGluc3RlYWQgYW5kIGNhbGxpbmcgaXQgd2l0aCB0aGUgcmVzdWx0IG9mIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKX0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlVHlwZUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZykgewotCQltZXNzYWdlVHlwZUlkZW50aWZpZXIgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0IG1lc3NhZ2UgdHlwZSBpZC4gU2FtZSBhcyA8Y29kZT5zZXRNZXNzYWdlVHlwZUlkZW50aWZpZXIuPC9jb2RlPgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRUZXh0KFN0cmluZyl9IGluc3RlYWQgYW5kIGNhbGxpbmcgaXQgd2l0aCB0aGUgcmVzdWx0IG9mIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKX0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlVHlwZUlEKFN0cmluZyBzdHJpbmcpIHsKLQkJc2V0TWVzc2FnZVR5cGVJZGVudGlmaWVyKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRva2Vucy4gKEN1cnJlbnRseSB0aGlzIGlzIGlnbm9yZWQpLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmdzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0VGV4dChTdHJpbmcpfSBpbnN0ZWFkIGFuZCBjYWxsaW5nIGl0IHdpdGggdGhlIHJlc3VsdCBvZiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSl9Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VG9rZW5zKFN0cmluZ1tdIHN0cmluZ3MpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlT3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihieXRlT3V0cHV0KTsKLQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCXByaW50V3JpdGVyLnByaW50bG4odGV4dCk7Ci0JCWlmIChfY2F1Z2h0RXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCV9jYXVnaHRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsKLQkJfQotCQlwcmludFdyaXRlci5mbHVzaCgpOwotCQlyZXR1cm4gYnl0ZU91dHB1dC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZTk1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHk7Ci0KLS8qKgotICogQmFzaWMgbG9nIHJlbmRlcmVyIGludGVyZmFjZS4gSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGV4dGVuc2lvbiA8Y29kZT5JTG9nUmVuZGVyZXIyLjwvY29kZT4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZ1JlbmRlcmVyIHsKLQotCS8qKgotCSAqIExvZ2dlZCB0byBjb25zb2xlLgotCSAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTlNPTEVfREVTQ1JJUFRJT04gPSAiY29uc29sZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExvZ2dlZCB0byB3b3JrYmVuY2guCi0JICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgV09SS0JFTkNIX0RFU0NSSVBUSU9OID0gIndvcmtiZW5jaCBsb2ciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBOb3QgbG9nZ2VkLgotCSAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PTE9HX0RFU0NSSVBUSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExvZyBsZXZlbHMuIFRoZXNlIGFyZSBkZXByZWNhdGVkLCB1c2UgPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw8L2NvZGU+IGNvZGVzIGluc3RlYWQuCi0JICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTE9HX0VSUk9SID0gMDsKLQotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IExPR19UUkFDRSA9IDE7Ci0KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBMT0dfV0FSTklORyA9IDI7Ci0KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBMT0dfSU5GTyA9IDM7Ci0KLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0UGx1Z2luSUQgPSAib3JnLmVjbGlwc2UuamVtLnV0aWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMb2cgdGhlIHN0cmluZyBhdCB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFN0cmluZyBtc2csIGludCB0eXBlKTsKLQotCS8qKgotCSAqIFN0YXJ0IG9yIHN0b3AgdGhlIHRyYWNpbmcuCi0JICogCi0JICogQHBhcmFtIEZsYWcKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIHN0YXJ0IHRoZSB0cmFjaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYWNlTW9kZShib29sZWFuIEZsYWcpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlcjIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhNjcwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0gCi0vKioKLSAqIExvZyByZW5kZXJlciB0aGF0IHByb3ZpZGVzIG1vcmUgZnVuY3Rpb24uIEJhc2ljYWxseSBpdCBjYW4gaGFuZGxlCi0gKiB0aGUgbG9nZ2luZyBvZiBzcGVjaWZpYyB0eXBlcyBpbiBhIGRpZmZlcmVudCBtYW5uZXIgdGhhbiB0aGUgZGVmYXVsdAotICogY29udmVyc2lvbiB0byBzdHJpbmcgc3VwcGxpZWQgYnkgTG9nZ2VyLgotICogCi0gKiBJdCBhbHNvIHVzZXMgdGhlIExldmVsIGNsYXNzZXMgZnJvbSBqYXZhLnV0aWwubG9nZ2luZyBhcyB0aGUgbG9nZ2luZyBsZXZlbHMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2dSZW5kZXJlcjIgZXh0ZW5kcyBJTG9nUmVuZGVyZXIgewotCQotCS8qKgotCSAqIFdoZW4gTG9nZ2VyLnNldExldmVsKERFRkFVTFQpOiByZXN0b3JlIHRvIHdoYXQgdGhlIGRlZmF1bHQgbGV2ZWwgd2FzLgotCSAqIFdoZW4gbG9nKC4uLixERUZBVUxUKTogTG9nIGF0IHRoZSBkZWZhdWx0IGxldmVsIGZvciB0aGUgdHlwZSBvZiBvYmplY3QuCi0JICovCi0Jc3RhdGljIGZpbmFsIExldmVsIERFRkFVTFQgPSBuZXcgTG9nZ2VyLkxvY2FsTGV2ZWwoIkRFRkFVTFQiLCBJbnRlZ2VyLk1BWF9WQUxVRS0xKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFdoZW4gbG9nKC4uLixUUkFDRSkgOiBMb2cgb25seSB3aGVuIGluIHRyYWNlIG1vZGUuCi0JICogRG9uJ3QgdXNlIGluIExvZ2dlci5zZXRMZXZlbCgpLiBIYXMgbm8gbWVhbmluZyBpbiB0aGF0IGNhc2UuCi0JICovCi0Jc3RhdGljIGZpbmFsIExldmVsIFRSQUNFID0gbmV3IExvZ2dlci5Mb2NhbExldmVsKCJUUkFDRSIsIEludGVnZXIuTUFYX1ZBTFVFLTIpOwkgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTG9nIHRoZSB0aHJvd2FibGUgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSB0aHJvd2FibGUpLgotCSAqIAotCSAqIEBwYXJhbSB0Ci0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coVGhyb3dhYmxlIHQsIExldmVsIGxldmVsKTsKLQkKLQkvKioKLQkgKiBMb2cgdGhlIG9iamVjdCBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhbiBvYmplY3QpLgotCSAqIAotCSAqIEBwYXJhbSBvCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coT2JqZWN0IG8sIExldmVsIGxldmVsKTsKLQkKLQkvKioKLQkgKiBMb2cgdGhlIGJvb2xlYW4gYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBib29sZWFuKS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGJvb2xlYW4gYiwgTGV2ZWwgbGV2ZWwpOwkKLQotCS8qKgotCSAqIExvZyB0aGUgY2hhciBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGNoYXIpLgotCSAqIAotCSAqIEBwYXJhbSBjCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coY2hhciBjLCBMZXZlbCBsZXZlbCk7CQotCQotCS8qKgotCSAqIExvZyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGJ5dGUpLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coYnl0ZSBiLCBMZXZlbCBsZXZlbCk7Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzaG9ydCBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIHNob3J0KS4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKHNob3J0IHMsIExldmVsIGxldmVsKTsKLQkKLQkvKioKLQkgKiBMb2cgdGhlIGludCBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhbiBpbnQpLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coaW50IGksIExldmVsIGxldmVsKTsKLQotCS8qKgotCSAqIExvZyB0aGUgbG9uZyBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGxvbmcpLgotCSAqIAotCSAqIEBwYXJhbSBsCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2cobG9uZyBsLCBMZXZlbCBsZXZlbCk7Ci0KLQkvKioKLQkgKiBMb2cgdGhlIGZsb2F0IGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgZmxvYXQpLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coZmxvYXQgZiwgTGV2ZWwgbGV2ZWwpOwotCi0JLyoqCi0JICogTG9nIHRoZSBkb3VibGUgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBkb3VibGUpLgotCSAqIAotCSAqIEBwYXJhbSBkCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coZG91YmxlIGQsIExldmVsIGxldmVsKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0pES0NvbnNvbGVSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSkRLQ29uc29sZVJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YzlkNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSkRLQ29uc29sZVJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLS8qKgotICogRGVmYXVsdCBsb2cgcmVuZGVyZXIgdG8gdXNlIHdoZW4gbm90IHJ1bm5pbmcgdW5kZXIgRWNsaXBzZS4gSXQgbG9ncyB0byBzeXNvdXQgYW5kIHN5c2Vyci4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIEpES0NvbnNvbGVSZW5kZXJlciBpbXBsZW1lbnRzIElMb2dSZW5kZXJlcjIgewotCi0JcHJpdmF0ZSBib29sZWFuIGZUcmFjZU1vZGUgPSBmYWxzZTsgLy8gd2lsbCB3ZSBhY3R1YWxseSBwdW5jaCB0cmFjZSBtZXNzYWdlZCBvciBub3QKLQotCXByaXZhdGUgYm9vbGVhbiBmU2V0dGluZ1RyYWNlID0gZmFsc2U7Ci0KLQlwcml2YXRlIExvZ2dlciBmTXlMb2dnZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0ZXIgdGFraW5nIGEgbG9nZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSkRLQ29uc29sZVJlbmRlcmVyKExvZ2dlciBsb2dnZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk15TG9nZ2VyID0gbG9nZ2VyOwotCQlmVHJhY2VNb2RlID0gZk15TG9nZ2VyLmdldFRyYWNlTW9kZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlciNsb2coamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFN0cmluZyBtc2csIGludCB0eXBlKSB7Ci0KLQkJaWYgKHR5cGUgPT0gSUxvZ1JlbmRlcmVyLkxPR19UUkFDRSAmJiAhZlRyYWNlTW9kZSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICh0eXBlID09IElMb2dSZW5kZXJlci5MT0dfRVJST1IpCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJZWxzZQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCXJldHVybiBJTG9nUmVuZGVyZXIuQ09OU09MRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIjc2V0VHJhY2VNb2RlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhY2VNb2RlKGJvb2xlYW4gZmxhZykgewotCi0JCWlmIChmU2V0dGluZ1RyYWNlKQotCQkJcmV0dXJuOwotCQlmU2V0dGluZ1RyYWNlID0gdHJ1ZTsKLQkJZlRyYWNlTW9kZSA9IGZsYWc7Ci0JCWZNeUxvZ2dlci5zZXRUcmFjZU1vZGUoZmxhZyk7Ci0JCWZTZXR0aW5nVHJhY2UgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHN0cmluZyBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4gPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvZyhTdHJpbmcgbXNnLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gTGV2ZWwuU0VWRVJFKQotCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCWVsc2UKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkNPTlNPTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGlmIGxvZ2dpbmcgYXQgdGhlIGdpdmVuIGxldmVsCi0JICogCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBsb2dnaW5nIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvZ2dpbmcoTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJcmV0dXJuIGZUcmFjZU1vZGUgfHwgZk15TG9nZ2VyLmlzTG9nZ2luZ0xldmVsKGxvZ0xldmVsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhib29sZWFuLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhib29sZWFuIGIsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihiKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhieXRlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhieXRlIGIsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihiKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhjaGFyLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhjaGFyIGMsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihjKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhkb3VibGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGRvdWJsZSBkLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoZCksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coZmxvYXQsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGZsb2F0IGYsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihmKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhpbnQsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGludCBpLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoaSksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2cobG9uZywgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2cobG9uZyBsLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YobCksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coT2JqZWN0IG8sIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihvKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhzaG9ydCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coc2hvcnQgcywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKHMpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGphdmEubGFuZy5UaHJvd2FibGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFRocm93YWJsZSB0LCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuU0VWRVJFOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coZk15TG9nZ2VyLmV4Y2VwdGlvblRvU3RyaW5nKHQpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2YWQwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLS8qKgotICogVGhpcyBpcyBhIGJhc2UsIFVJIGluZGVwZW5kZW50IGxvZ2dlci4gICBJdCB3aWxsCi0gKiBjb25zdHJ1Y3QgYSBjb25zaXN0ZW50IG1zZy4gYm9keSwgYW5kIGNhbGwgYW4gZW5maXJvbm1lbnQgc3BlY2lmaWMgSUxvZ1JlbmRlcmVyLgotICogQnkgZGVmYXVsdCwgdGhpcyBsb2dnZXIgd2lsbCB1c2UgYSBjb25zb2xlIGJhc2VkIElMb2dSZW5kZXJlciwKLSAqIGFuZCBhIEoyRUUgUGx1Z2luIGlkZW50aWZpY2F0aW9uLgotICogCi0gKiA8cD4KLSAqIFdoZW4gcnVubmluZyBvdXRzaWRlIG9mIEVjbGlwc2UsIHRoZSB0cmFjZSBhbmQgbG9nZ2luZyBsZXZlbCBjb21lIGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzCi0gKiA8dWw+Ci0gKiAJCTxsaT4iZGVidWciICg9InRydWUiKSAtIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4gCi0gKiAJCTxsaT4ibG9nTGV2ZWwiICg9ImxldmVsIiB3aGVyZSAibGV2ZWwiIGlzIGEgbGV2ZWwgc3RyaW5nLCBlLmcuIFNFVkVSRSwgV0FSTklORywgZXRjLiBmcm9tIHRoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbDwvY29kZT4gY2xhc3MpLgotICogCQkJVGhlIGRlZmF1bHQgaXMgIldBUk5JTkciLgotICogPC91bD4KLSAqIAotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JCi0JLy8gVGhpcyBpcyB1c2VkIGJ5IElMb2dSZW5kZXJlcjIgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IGxldmVsLgotCXN0YXRpYyBjbGFzcyBMb2NhbExldmVsIGV4dGVuZHMgTGV2ZWwgewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYyNzMzNTcwNzQ3Njc4NTQ4ODNMOwotCi0JCXB1YmxpYyBMb2NhbExldmVsKFN0cmluZyBuYW1lLCBpbnQgbGV2ZWwpIHsKLQkJCXN1cGVyKG5hbWUsIGxldmVsKTsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSBib29sZWFuIGZUcmFjZU1vZGUgPSBmYWxzZTsgLy8gd2lsbCB3ZSBhY3R1YWxseSBwdW5jaCB0cmFjZSBtZXNzYWdlZCBvciBub3QgICAgICAgICAgICAgIAotCXByaXZhdGUgU3RyaW5nIGZQbHVnaW5JRDsKLQlwcml2YXRlIElMb2dSZW5kZXJlciBmUmVuZGVyZXIgPSBudWxsOwotCXByaXZhdGUgSUxvZ1JlbmRlcmVyMiByZW5kZXJlcjIgPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgZkxpbmVTZXBlcmF0b3I7Ci0JcHJpdmF0ZSBMZXZlbCBsZXZlbDsKLQlwcml2YXRlIExldmVsIGRlZmF1bHRMZXZlbCA9IExldmVsLlNFVkVSRTsJLy8gQnkgZGVmYXVsdCBvbmx5IHNldmVyZSBvciBncmVhdGVyIGFyZSBsb2dnZWQuCi0JcHJpdmF0ZSBTdHJpbmcgbG9nRmlsZU5hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERlZmF1bHRMb2dnZXJQbHVnaW4gPSBJTG9nUmVuZGVyZXIuRGVmYXVsdFBsdWdpbklEOwotCXN0YXRpYyBwcml2YXRlIEhhc2h0YWJsZSBMb2dnZXJzID0gbmV3IEhhc2h0YWJsZSgpOyAvLyBLZWVwIHRyYWNrIG9mIGFsbCB0aGUgTG9nZ2VycwotCWZpbmFsIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gTG9nTWFyayA9IHsgIioqKiBFUlJPUiAqKiogIiwgLy8kTk9OLU5MUy0xJAotCQkiW1RyYWNlXSAiLCAvLyROT04tTkxTLTEkCi0JCSIrKysgV2FybmluZyArKysgIiwgLy8kTk9OLU5MUy0xJAotCQkiSW5mbyAiIH07IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEZpbGxlciA9ICIgICAgIjsgLy8gVXNlIHRoaXMgdG8gaW5kZW50IG1zZy4gYm9keSAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIExvZ2dlcigpIHsKLQkJdGhpcyhJTG9nUmVuZGVyZXIuRGVmYXVsdFBsdWdpbklEKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvZ2dlcihTdHJpbmcgcGx1Z2luSUQpIHsKLQkJZlBsdWdpbklEID0gcGx1Z2luSUQ7Ci0JCXNldFJlbmRlcmVyKG5ldyBKREtDb25zb2xlUmVuZGVyZXIodGhpcykpOwkvLyBTZXQgdXAgZGVmYXVsdCB0byB0aGlzLiBTb21lb25lIGNhbiBjaGFuZ2UgaXQgbGF0ZXIuCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdGFja3RyYWNlIGFzIGEgcHJpbnQgZm9ybWF0dGVkIHN0cmluZy4KLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gdGhlIHN0YWNrdHJhY2UgYXMgYSBzdHJpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBleGNlcHRpb25Ub1N0cmluZyhUaHJvd2FibGUgZSkgewotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKSk7Ci0JCXJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzeXN0ZW0gZGVmYXVsdCBsb2dnZXIuIFRoaXMgaXMgdXNlZCBmb3IgY2xpZW50cyB0aGF0IGRvbid0IGtub3cgaWYgdGhleQotCSAqIGFyZSBydW5uaW5nIGluIEVjbGlwc2Ugb3Igb3V0c2lkZSBvZiBpdC4gVGhpcyB3YXkgdGhleSBoYXZlIGEgY29tbW9uIGxvZ2dlciBmb3JtYXQKLQkgKiB3aGljaCBzd2l0Y2ggY29ycmVjdGx5LgotCSAqIEByZXR1cm4gZGVmYXVsdCBsb2dnZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jc3RhdGljIHB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlMb2dnZXIgZGVmYXVsdExvZ2dlciA9IChMb2dnZXIpIExvZ2dlcnMuZ2V0KERlZmF1bHRMb2dnZXJQbHVnaW4pOwotCQlpZiAoZGVmYXVsdExvZ2dlciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0TG9nZ2VyID0gbmV3IExvZ2dlcigpOwotCQkJZGVmYXVsdExvZ2dlci5pbml0KCk7Ci0JCQlMb2dnZXJzLnB1dChEZWZhdWx0TG9nZ2VyUGx1Z2luLCBkZWZhdWx0TG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdExvZ2dlcjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBsb2dnZXIgZm9yIGEgc3BlY2lmaWMgcGx1Z2luLgotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqIEByZXR1cm4gbG9nZ2VyIGZvciBhIHNwZWNpZmljIHBsdWdnaW4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jc3RhdGljIHB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKFN0cmluZyBwbHVnaW5JZCkgewotCQlpZiAocGx1Z2luSWQgPT0gbnVsbCkKLQkJCXJldHVybiBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCUxvZ2dlciBMb2dnZXIgPSAoTG9nZ2VyKSBMb2dnZXJzLmdldChwbHVnaW5JZCk7Ci0JCWlmIChMb2dnZXIgPT0gbnVsbCkgewotCQkJTG9nZ2VyID0gbmV3IExvZ2dlcihwbHVnaW5JZCk7Ci0JCQlMb2dnZXIuaW5pdCgpOwotCQkJTG9nZ2Vycy5wdXQocGx1Z2luSWQsIExvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIExvZ2dlcjsKLQl9Ci0JCi0JLyoqCi0JICogVXNlZCBieSBzdWJjbGFzcyB0byBnZXQgYSBsb2dnZXIgaWYgaXQgZXhpc3RzLCBidXQgbm90IGNyZWF0ZSBvbmUuCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHJldHVybiBsb2dnZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jc3RhdGljIHByb3RlY3RlZCBMb2dnZXIgZ2V0TG9nZ2VySWZFeGlzdHMoU3RyaW5nIHBsdWdpbklkKSB7Ci0JCWlmIChwbHVnaW5JZCA9PSBudWxsKQotCQkJcmV0dXJuIExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIChMb2dnZXIpIExvZ2dlcnMuZ2V0KHBsdWdpbklkKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBsdWdpbiBpZCBmb3IgdGhpcyBsb2dnZXIuCi0JICogQHJldHVybiBwbHVnaW5pZAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBmUGx1Z2luSUQ7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdHJhY2UgbW9kZSBmb3IgdGhpcyBsb2dnZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRyYWNpbmcgaXMgZ29pbmcgb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0VHJhY2VNb2RlKCkgewotCQlyZXR1cm4gZlRyYWNlTW9kZTsKLQl9Ci0JCi0JLyoKLQkgKiBJbmRlbnQgdGhlIE1zZy4gQm9keSB0byBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoZSBsb2cKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZW50TXNnKFN0cmluZyBtc2csIFN0cmluZ0J1ZmZlciBsb2dNc2cpIHsKLQkJLy8gTGluZSBzZXBlcmF0b3IgaXMgZGlmZmVyZW50IG9uIGRpZmZlcmVudCBwbGF0Zm9ybSwgdW5peCA9IFxuLCB3aW5kb3dzIFxyXG4gYW5kIG1hYyBccgotCQlTdHJpbmcgc2VwID0gZkxpbmVTZXBlcmF0b3I7Ci0JCWlmIChtc2cuaW5kZXhPZigiXHJcbiIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQlzZXAgPSAiXHJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAobXNnLmluZGV4T2YoIlxuIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCXNlcCA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAobXNnLmluZGV4T2YoIlxyIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCXNlcCA9ICJcciI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobXNnLCBzZXApOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJbG9nTXNnLmFwcGVuZChGaWxsZXIgKyB0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfSBlbHNlCi0JCQkJbG9nTXNnLmFwcGVuZChmTGluZVNlcGVyYXRvciArIEZpbGxlciArIHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBJZiBFY2xpcHNlIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgLVhEZWJ1ZyBvciAtZGVidWcgdHVybiB0cmFjZXMgb24gZm9yIHRoaXMgTG9nZ2VyCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMjMvMjAwMSA3OjM3OjA0IFBNKQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJkZWJ1ZyIpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCWZUcmFjZU1vZGUgPSB0cnVlOwotCQlsZXZlbCA9IGRlZmF1bHRMZXZlbCA9IExldmVsLnBhcnNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgibG9nTGV2ZWwiLCBMZXZlbC5XQVJOSU5HLmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0cnkgewotCQkJZkxpbmVTZXBlcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vIERpZmYgb24gV2luL1VuaXgvTWFjIC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZMaW5lU2VwZXJhdG9yID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qCi0JICogR2VuZXJpYyBsb2cuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMjQvMjAwMSAxOjU1OjM0IFBNKQotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBtc2cgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0eXBlIGludAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxvZ0FueShTdHJpbmcgbXNnLCBpbnQgdHlwZSkgewotCQlTdHJpbmdCdWZmZXIgbG9nTXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlsb2dNc2cuYXBwZW5kKGZMaW5lU2VwZXJhdG9yKTsKLQkJbG9nTXNnLmFwcGVuZChMb2dNYXJrW3R5cGVdKTsKLQkJcmV0dXJuIHB1bmNoTG9nKGxvZ1Jlc3QobXNnLCBsb2dNc2cpLCB0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyB0byBiZSB1c2VkIGJ5IHJlbmRlcmVycyB0aGF0IHdhbnQgdG8gcHV0IGEgbXNnIG91dAotCSAqIGluIGEgZ2VuZXJpYyBmb3JtYXQuIFRoaXMganVzdCByZXR1cm5zIHRoZSBzdHJpbmcgdGhhdAotCSAqIHNob3VsZCBiZSBsb2dnZWQuIEl0IHB1dHMgdGhpbmdzIGxpa2UgaGVhZGVycyBvbiBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEByZXR1cm4gVGhlIGdlbmVyaWMgbWVzc2FnZSBmb3IgdGhlIHN0cmluZyBhbmQgbGV2ZWwuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHZW5lcmljTXNnKFN0cmluZyBtc2csIExldmVsIGFMZXZlbCkgewotCQlTdHJpbmdCdWZmZXIgZ2VuTXNnID0gbmV3IFN0cmluZ0J1ZmZlcihtc2cubGVuZ3RoKCkrMTYpOwotCQlnZW5Nc2cuYXBwZW5kKGZMaW5lU2VwZXJhdG9yKTsKLQkJZ2VuTXNnLmFwcGVuZChnZXRMZXZlbEhlYWRlcihhTGV2ZWwpKTsKLQkJZ2VuTXNnLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlnZW5Nc2cuYXBwZW5kKG5ldyBEYXRlKCkpOwotCQlpbmRlbnRNc2cobXNnLCBnZW5Nc2cpOwotCQlyZXR1cm4gZ2VuTXNnLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExldmVsW10gTEVWRUxfU0VBUkNIID0gbmV3IExldmVsW10gewotCQlMZXZlbC5TRVZFUkUsCi0JCUxldmVsLldBUk5JTkcsCi0JCUxldmVsLklORk8sCi0JCUlMb2dSZW5kZXJlcjIuVFJBQ0UKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExFVkVMX01BUksgPSBuZXcgU3RyaW5nW10gewotCQkiKioqIEVSUk9SICoqKiIsIC8vJE5PTi1OTFMtMSQKLQkJIisrKyBXYXJuaW5nICsrKyIsIC8vJE5PTi1OTFMtMSQKLQkJIkluZm8iLCAvLyROT04tTkxTLTEkCi0JCSJbVHJhY2VdIiAvLyROT04tTkxTLTEkCi0JfTsKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRMZXZlbEhlYWRlcihMZXZlbCBhTGV2ZWwpIHsKLQkJZm9yIChpbnQgaT0wOyBpPExFVkVMX1NFQVJDSC5sZW5ndGg7IGkrKykKLQkJCWlmIChMRVZFTF9TRUFSQ0hbaV0gPT0gYUxldmVsKQotCQkJCXJldHVybiBMRVZFTF9NQVJLW2ldOwotCQlyZXR1cm4gYUxldmVsLmdldE5hbWUoKTsJLy8gTm90IGZvdW5kLCBqdXN0IHVzZSBsZXZlbCBzdHJpbmcuCi0JfQotCQotCS8vIFRoZSB3cml0ZSdzIGFyZSBoZXJlIGZvciBoaXN0b3J5LiBXaWxsIGltcGxlbWVudCB1c2luZyBsb2cob2JqLCBMZXZlbCkgZm9yIGFsbCBvZiB0aGUgdHlwZXMuCi0KLQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhMZXZlbCwgRXhjZXB0aW9uKQotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcGFyYW0gZXgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB3cml0ZShMZXZlbCBhTGV2ZWwsIEV4Y2VwdGlvbiBleCkgewotCQlyZXR1cm4gbG9nKGFMZXZlbCwgZXgpOwotCX0KLQkKLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coVGhyb3dhYmxlKQotCSAqIEBwYXJhbSBleAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHdyaXRlKFRocm93YWJsZSBleCkgewotCQlyZXR1cm4gbG9nKGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKE9iamVjdCwgTGV2ZWwpCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEBwYXJhbSBsb2dFbnRyeQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHdyaXRlKExldmVsIGFMZXZlbCwgT2JqZWN0IGxvZ0VudHJ5KSB7Ci0JCXJldHVybiBsb2cobG9nRW50cnksIGFMZXZlbCk7Ci0JfQotCQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhTdHJpbmcsIExldmVsKQotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgd3JpdGUoTGV2ZWwgYUxldmVsLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBsb2coc3RyaW5nLCBhTGV2ZWwpOwotCX0KLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coVGhyb3dhYmxlLCBMZXZlbCkKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHBhcmFtIGV4Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgd3JpdGUoTGV2ZWwgYUxldmVsLCBUaHJvd2FibGUgZXgpIHsKLQkJcmV0dXJuIGxvZyhleCwgYUxldmVsKTsKLQl9Ci0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKFRocm93YWJsZSwgTGV2ZWwpCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEBwYXJhbSBleAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhMZXZlbCBhTGV2ZWwsIEV4Y2VwdGlvbiBleCkgewotCQlyZXR1cm4gbG9nKGV4LCBhTGV2ZWwpOwotCX0KLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coVGhyb3dhYmxlLCBMZXZlbCkKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHBhcmFtIGV4Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKExldmVsIGFMZXZlbCwgVGhyb3dhYmxlIGV4KSB7Ci0JCXJldHVybiBsb2coZXgsIGFMZXZlbCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbG9nZ2luZyBsZXZlbAotCSAqIEByZXR1cm4gbG9nZ2luZyBsZXZlbAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBMZXZlbCBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIGxldmVsOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIGxldmVsIGlzIGJlaW5nIGxvZ2dlZC4gKGUuZy4gaWYgY3VycmVudCBsZXZlbCBpcyBTRVZFUkUsIHRoZW4gRklORSB3aWxsIG5vdCBiZSBsb2dnZWQpLgotCSAqIEBwYXJhbSByZXF1ZXN0bGV2ZWwKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsZXZlbCB3aWxsIGJlIGxvZ2dlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvZ2dpbmdMZXZlbChMZXZlbCByZXF1ZXN0bGV2ZWwpIHsKLQkJaWYgKHJlcXVlc3RsZXZlbCA9PSBJTG9nUmVuZGVyZXIyLlRSQUNFICYmICFnZXRUcmFjZU1vZGUoKSkKLQkJCXJldHVybiBmYWxzZTsJLy8gV2UgYXJlbid0IHRyYWNpbmcgYnV0IHJlcXVlc3RlZCB0cmFjZS4KLQkJCi0JCXJldHVybiAhKHJlcXVlc3RsZXZlbC5pbnRWYWx1ZSgpIDwgZ2V0TGV2ZWwoKS5pbnRWYWx1ZSgpIHx8IGdldExldmVsKCkgPT0gTGV2ZWwuT0ZGKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgYW4gZXJyb3Igc3RyaW5nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dFcnJvcihTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBsb2cobXNnLCBMZXZlbC5TRVZFUkUpOwotCX0KLQotCS8qKgotCSAqIExvZyBhbiBlcnJvciB0aHJvd2FibGUKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ0Vycm9yKFRocm93YWJsZSBlKSB7Ci0JCXJldHVybiBsb2coZSwgTGV2ZWwuU0VWRVJFKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgYW4gaW5mbyBtZXNzYWdlLgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dJbmZvKFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIGxvZyhtc2csIExldmVsLklORk8pOwotCX0KLQkKLS8qKgotICogTG9nIGEgdGhyb3dhYmxlIGFzIGEgd2FybmluZy4KLSAqIEBwYXJhbSBlCi0gKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi0JcHVibGljIFN0cmluZyBsb2dJbmZvKFRocm93YWJsZSBlKSB7Ci0JCXJldHVybiBsb2coZSwgTGV2ZWwuSU5GTyk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzdHJpbmcgdG8gbG9nTXNnIGJ1ZmZlciBwYXNzZWQgaW4uIEFwcGVuZCB0aGUgZGF0ZSBhbmQgZm9ybWF0IHRoZQotCSAqIHN0cmluZyB3aXRoIG5pY2UgaW5kZW50YXRpb24uCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSBsb2dNc2cKLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgZnJvbSB0aGUgbG9nTXNnIGFmdGVyIGxvZ2dpbmcgdGhlIHJlc3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2dSZXN0KFN0cmluZyBtc2csIFN0cmluZ0J1ZmZlciBsb2dNc2cpIHsKLQkJbG9nTXNnLmFwcGVuZChuZXcgRGF0ZSgpKTsKLQkJaW5kZW50TXNnKG1zZywgbG9nTXNnKTsKLQkJcmV0dXJuIGxvZ01zZy50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgbXNnIGFzIHRyYWNlIG9ubHkuCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ1RyYWNlKFN0cmluZyBtc2cpIHsKLQkJaWYgKGZUcmFjZU1vZGUpCi0JCQlyZXR1cm4gbG9nKG1zZywgSUxvZ1JlbmRlcmVyMi5UUkFDRSk7Ci0JCWVsc2UKLQkJCXJldHVybiBJTG9nUmVuZGVyZXIuTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSB0aHJvd2FibGUgYXMgdHJhY2Ugb25seS4KLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ1RyYWNlKFRocm93YWJsZSBlKSB7Ci0JCXJldHVybiBsb2coZSwgSUxvZ1JlbmRlcmVyMi5UUkFDRSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBtZXNzYWdlIGFzIHdhcm5pbmcuCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ1dhcm5pbmcoU3RyaW5nIG1zZykgewotCQlyZXR1cm4gbG9nKG1zZywgTGV2ZWwuV0FSTklORyk7Ci0JfQotCS8qKgotCSAqIExvZyB0aGUgdGhyb3dhYmxlIGFzIGEgd2FybmluZy4KLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ1dhcm5pbmcoVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIGxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQl9Ci0JCi0JLyoqCi0JICogQXNrIHRoZSBSZW5kZXJlciB0byBwdW5jaCB0aGUgbXNnLiBpbiB0aGUgbG9nLi4gb25lCi0JICogY2FsbGVyIGF0IHRoZSB0aW1lCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMjQvMjAwMSA5OjE5OjE3IEFNKQotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBtc2cgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0eXBlIGludAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgU3RyaW5nIHB1bmNoTG9nKFN0cmluZyBtc2csIGludCB0eXBlKSB7Ci0JCXJldHVybiBmUmVuZGVyZXIubG9nKG1zZywgdHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgcmVuZGVyZXIgdG8gdXNlLgotCSAqIEBwYXJhbSByZW5kZXJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKElMb2dSZW5kZXJlciByZW5kZXJlcikgewotCQlmUmVuZGVyZXIgPSByZW5kZXJlcjsKLQkJcmVuZGVyZXIyID0gKHJlbmRlcmVyIGluc3RhbmNlb2YgSUxvZ1JlbmRlcmVyMikgPyAoSUxvZ1JlbmRlcmVyMikgcmVuZGVyZXIgOiBudWxsOwotCQlyZW5kZXJlci5zZXRUcmFjZU1vZGUoZ2V0VHJhY2VNb2RlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHRyYWNlIG1vZGUuCi0JICogQHBhcmFtIGZsYWcgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gdHVybiBvbiB0cmFjaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYWNlTW9kZShib29sZWFuIGZsYWcpIHsKLQkJZlRyYWNlTW9kZSA9IGZsYWc7Ci0JCWlmIChmUmVuZGVyZXIgIT0gbnVsbCkKLQkJCWZSZW5kZXJlci5zZXRUcmFjZU1vZGUoZmxhZyk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgbGV2ZWwgY3V0b2ZmIGZvciBsb2dnaW5nLiBBbnl0aGluZyBiZWxvdyB0aGlzIGxldmVsIHdpbGwgbm90IGxvZy4KLQkgKiBEbyBub3Qgc2V0IGxldmVsIHRvIDxjb2RlPklMb2dSZW5kZXJlcjIuVFJBQ0U8L2NvZGU+LiBJdCBkb2Vzbid0IG1ha2Ugc2Vuc2UuCi0JICogCi0JICogQHBhcmFtIGxldmVsIChVc2UgPGNvZGU+SUxvZ1JlbmRlcmVyMi5ERUZBVUxUPC9jb2RlPiB0byByZXN0b3JlIHRvIGRlZmF1bHQgZm9yIHRoaXMgbG9nZ2VyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsKExldmVsIGxldmVsKSB7Ci0JCXRoaXMubGV2ZWwgPSBsZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IGRlZmF1bHRMZXZlbDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBkZWZhdWx0IGxldmVsIGZvciB0aGlzIGxvZ2dlci4gSXQgd29uJ3QgdG91Y2ggdGhlIGN1cnJlbnQgbGV2ZWwuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdExldmVsKExldmVsIGxldmVsKSB7Ci0JCXRoaXMuZGVmYXVsdExldmVsID0gbGV2ZWw7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbG9nIGZpbGUgbmFtZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvZ0ZpbGVOYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9nRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBsb2dGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxvZyBmaWxlIG5hbWUuCi0JICogQHBhcmFtIGxvZ0ZpbGVOYW1lIFRoZSBsb2dGaWxlTmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9nRmlsZU5hbWUoU3RyaW5nIGxvZ0ZpbGVOYW1lKSB7Ci0JCXRoaXMubG9nRmlsZU5hbWUgPSBsb2dGaWxlTmFtZTsKLQl9Ci0JCi0JLy8gTm93IGFsbCBvZiB0aGUgbG9nKCkgdHlwZXMgdGhhdCB1c2UgYSBMZXZlbC4KLQotCS8qKgotCSAqIExvZyB0aGUgdGhyb3dhYmxlIGF0IHRoZSBkZWZhdWx0IGxldmVsIGZvciBhIHRocm93YWJsZS4gCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIGxvZyhlLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIHRocm93YWJsZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coVGhyb3dhYmxlIGUsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coZSwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlTdHJpbmcgc3RhY2tUcmFjZSA9IGV4Y2VwdGlvblRvU3RyaW5nKGUpOwotCQkJcmV0dXJuIGxvZ0FueShzdGFja1RyYWNlLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuU0VWRVJFKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBsb2coT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGxvZyhvLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIG9iamVjdCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coT2JqZWN0IG8sIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2cobywgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKG8pLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9CQotCQotCS8vIFRoZSBmb2xsb3dpbmcgYXJlIGFkZGVkIHRvIG1hdGNoIHVwIHdpdGggSHlhZGVzIHNvIHRoYXQgcHJpbWl0aXZlcyBjYW4gYmUgbG9nZ2VkIHRvby4KLQkKLQkvKioKLQkgKiBMb2cgYSBib29sZWFuIGF0IHRoZSBkZWZhdWx0IGxldmVsLiAKLQkgKiBAcGFyYW0gYgotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhib29sZWFuIGIpIHsKLQkJcmV0dXJuIGxvZyhiLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgYSBib29sZWFuIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gYgotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhib29sZWFuIGIsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coYiwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGIpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIExvZyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBkZWZhdWx0IGxldmVsLgotCSAqIEBwYXJhbSBjCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGNoYXIgYykgewotCQlyZXR1cm4gbG9nKGMsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gYwotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhjaGFyIGMsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coYywgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGMpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBieXRlIGF0IHRoZSBkZWZhdWx0IGxldmVsLgotCSAqIEBwYXJhbSBiCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJ5dGUgYikgewotCQlyZXR1cm4gbG9nKGIsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIGIKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYnl0ZSBiLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGIsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihiKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNob3J0IGF0IHRoZSBkZWZhdWx0IGxldmVsLgotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKHNob3J0IHMpIHsKLQkJcmV0dXJuIGxvZyhzLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNob3J0IGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gcwotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhzaG9ydCBzLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKHMsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihzKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgaW50IGF0IHRoZSBkZWZhdWx0IGxldmVsLgotCSAqIEBwYXJhbSBpCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGludCBpKSB7Ci0JCXJldHVybiBsb2coaSwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBpbnQgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGkKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coaW50IGksIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coaSwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGkpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBsb25nIGF0IHRoZSBkZWZhdWx0IGxldmVsLgotCSAqIEBwYXJhbSBsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGxvbmcgbCkgewotCQlyZXR1cm4gbG9nKGwsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgbG9uZyBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIGwKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2cobG9uZyBsLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGwsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihsKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBMb2cgdGhlIGZsb2F0IGF0IHRoZSBkZWZhdWx0IGxldmVsLgotCSAqIEBwYXJhbSBmCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGZsb2F0IGYpIHsKLQkJcmV0dXJuIGxvZyhmLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGZsb2F0IGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhmbG9hdCBmLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGYsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihmKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgZG91YmxlIGF0IHRoZSBkZWZhdWx0IGxldmVsCi0JICogQHBhcmFtIGQKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZG91YmxlIGQpIHsKLQkJcmV0dXJuIGxvZyhkLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGRvdWJsZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwKLQkgKiAKLQkgKiBAcGFyYW0gZAotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhkb3VibGUgZCwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhkLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoZCksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0JCi0JCi0JLyoKLQkgKiBUdXJuIG5ldyB0eXBlIGludG8gb2xkIHR5cGUuIFRoZSBkZWZhdWx0TGV2ZWwgaXMgdGhlCi0JICogbGV2ZWwgdG8gdXNlIGlmIHRoZSBpbmNvbWluZyBsZXZlbCBpcyBtYXJrZWQgYXMgZGVmYXVsdC4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRPbGRUeXBlKExldmVsIGFMZXZlbCkgewotCQlpZiAoYUxldmVsID09IExldmVsLlNFVkVSRSkKLQkJCXJldHVybiBJTG9nUmVuZGVyZXIuTE9HX0VSUk9SOwotCQllbHNlIGlmIChhTGV2ZWwgPT0gTGV2ZWwuV0FSTklORykKLQkJCXJldHVybiBJTG9nUmVuZGVyZXIuTE9HX1dBUk5JTkc7Ci0JCWVsc2UgaWYgKGFMZXZlbCA9PSBMZXZlbC5JTkZPKQotCQkJcmV0dXJuIElMb2dSZW5kZXJlci5MT0dfSU5GTzsKLQkJZWxzZSBpZiAoYUxldmVsID09IElMb2dSZW5kZXJlcjIuVFJBQ0UpCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19UUkFDRTsKLQkJZWxzZQotCQkJcmV0dXJuIElMb2dSZW5kZXJlci5MT0dfSU5GTzsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThhNDM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjQgJCQgICQkRGF0ZTogMjAwNS8wNi8xNiAyMDoxNDoyNyAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0KLQotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5ICB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSBJTlNUQU5DRTsKLQkKLQlzdGF0aWMgewotCQlJTlNUQU5DRSA9IGNyZWF0ZUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQlwcml2YXRlIGZpbmFsIENsYXNzIENPTlRSSUJVVE9SX0NMQVNTID0gSUVNRkNvbnRleHRDb250cmlidXRvci5jbGFzczsKLQlwcm90ZWN0ZWQgTWFwIGVtZkNvbnRleHRDYWNoZSA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgY3JlYXRlRmFjdG9yeUluc3RhbmNlKCkgewotCQlFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSBmYWN0b3J5ID0gY3JlYXRlRmFjdG9yeUluc3RhbmNlRnJvbUV4dGVuc2lvbigpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJZmFjdG9yeSA9IG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSgpOwotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgY3JlYXRlRmFjdG9yeUluc3RhbmNlRnJvbUV4dGVuc2lvbigpIHsKLQkJZmluYWwgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlbXSBmYWN0b3J5SG9sZGVyID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5WzFdOwotCQlSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBuZXcgUmVnaXN0cnlSZWFkZXIoSkVNVXRpbFBsdWdpbi5JRCwgImludGVybmFsV29ya2JlbmNoQ29udGV4dEZhY3RvcnkiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygiZmFjdG9yeUNsYXNzIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCWZhY3RvcnlIb2xkZXJbMF0gPSAoRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkpZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXJlYWRlci5yZWFkUmVnaXN0cnkoKTsKLQkJcmV0dXJuIGZhY3RvcnlIb2xkZXJbMF07Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVNRk5hdHVyZUZhY3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCi0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjYWNoZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QsIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGVtZkNvbnRleHQpIHsKLQkJaWYgKGFQcm9qZWN0ICE9IG51bGwgJiYgZW1mQ29udGV4dCAhPSBudWxsKQotCQkJZW1mQ29udGV4dENhY2hlLnB1dChhUHJvamVjdCwgZW1mQ29udGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldENhY2hlZEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJaWYgKGFQcm9qZWN0ICE9IG51bGwpCi0JCQlyZXR1cm4gKEVNRldvcmtiZW5jaENvbnRleHRCYXNlKSBlbWZDb250ZXh0Q2FjaGUuZ2V0KGFQcm9qZWN0KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YVByb2plY3Q8L2NvZGU+IGlzIGVpdGhlciBiZWluZyBjbG9zZWQgb3IgZGVsZXRlZCBzbyB3ZSBuZWVkIHRvIGNsZWFudXAgb3VyIGNhY2hlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNhY2hlZFByb2plY3QoSVByb2plY3QgYVByb2plY3QpIHsKLQkJaWYgKGFQcm9qZWN0ICE9IG51bGwpIAotCQkJZW1mQ29udGV4dENhY2hlLnJlbW92ZShhUHJvamVjdCk7IAotCQkKLQl9Ci0JLyoqCi0JICogUmV0dXJuIGEgbmV3IG9yIGV4aXN0aW5nIEVNRk5hdHVyZSBvbiA8Y29kZT5hUHJvamVjdDwvY29kZT4uIEFsbG93IHRoZSA8Y29kZT5jb250cmlidXRvcjwvY29kZT4KLQkgKiB0byBjb250cmlidXRlIHRvIHRoZSBuZXcgb3IgZXhpc3RpbmcgbmF0dXJlIHByaW9yIHRvIHJldHVybmluZy4KLQkgKi8KLQlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgY3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCwgSUVNRkNvbnRleHRDb250cmlidXRvciBjb250cmlidXRvcikgewotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIltFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV0iICsgRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlfVUlfMCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmICghYVByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJbRU1GV29ya2JlbmNoQ29udGV4dEJhc2VdIiArIEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5X1VJXzEiLCBuZXcgT2JqZWN0W117YVByb2plY3QuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgY29udGV4dCA9IGdldENhY2hlZEVNRkNvbnRleHQoYVByb2plY3QpOwotCQlib29sZWFuIGNvbnRyaWJ1dG9yRm91bmQgPSBmYWxzZTsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkJY29udGV4dCA9IHByaW1DcmVhdGVFTUZDb250ZXh0KGFQcm9qZWN0KTsKLQkJCWNhY2hlRU1GQ29udGV4dChhUHJvamVjdCwgY29udGV4dCk7Ci0JCQljb250cmlidXRvckZvdW5kID0gaW5pdGlhbGl6ZUVNRkNvbnRleHRGcm9tQ29udHJpYnV0b3JzKGFQcm9qZWN0LCBjb250ZXh0LCBjb250cmlidXRvcik7Ci0JCX0KLQkJaWYgKGNvbnRyaWJ1dG9yICE9IG51bGwgJiYgY29udGV4dCAhPSBudWxsICYmICFjb250cmlidXRvckZvdW5kKQotCQkJY29udHJpYnV0b3IucHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoY29udGV4dCk7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplRU1GQ29udGV4dEZyb21Db250cmlidXRvcnMoSVByb2plY3QgYVByb2plY3QsIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGVtZkNvbnRleHQsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJYm9vbGVhbiBjb250cmlidXRvckZvdW5kID0gZmFsc2U7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsIHx8IGVtZkNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBjb250cmlidXRvckZvdW5kOwotCQlMaXN0IHJ1bnRpbWVzID0gRU1GTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lcyhhUHJvamVjdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlQcm9qZWN0TmF0dXJlIG5hdHVyZSA9IChJUHJvamVjdE5hdHVyZSkgcnVudGltZXMuZ2V0KGkpOwotCQkJaWYgKG5hdHVyZSAhPSBudWxsICYmIENPTlRSSUJVVE9SX0NMQVNTLmlzSW5zdGFuY2UobmF0dXJlKSkgewotCQkJCWlmIChuYXR1cmUgPT0gY29udHJpYnV0b3IpCi0JCQkJCWNvbnRyaWJ1dG9yRm91bmQgPSB0cnVlOwotCQkJCSgoSUVNRkNvbnRleHRDb250cmlidXRvcikgbmF0dXJlKS5wcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChlbWZDb250ZXh0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udHJpYnV0b3JGb3VuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05hdHVyZUVuYWJsZWQoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBuYXR1cmVJZCkgewotCQl0cnkgewotCQkJcmV0dXJuIGFQcm9qZWN0LmlzTmF0dXJlRW5hYmxlZChuYXR1cmVJZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE5hdHVyZUlkcyhJUHJvamVjdCBhUHJvamVjdCkgewotCQl0cnkgewotCQkJaWYgKGFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJCXJldHVybiBhUHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldE5hdHVyZUlkcygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3ROYXR1cmUgZ2V0TmF0dXJlKElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgbmF0dXJlSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhUHJvamVjdC5nZXROYXR1cmUobmF0dXJlSWQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIHByaW1DcmVhdGVFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UoYVByb2plY3QpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZXhpc3RpbmcgRU1GTmF0dXJlIG9uIDxjb2RlPmFQcm9qZWN0PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZ2V0RU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gZ2V0Q2FjaGVkRU1GQ29udGV4dChhUHJvamVjdCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGNyZWF0ZVN5bmNocm9uaXplcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQsIElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIoYVJlc291cmNlU2V0LCBhUHJvamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzY4ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFJlc291cmNlU2V0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogUHJvamVjdFJlc291cmNlU2V0SW1wbC5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIxICQkICAkJERhdGU6IDIwMDgvMDQvMjEgMTQ6NTA6MTYgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsIGV4dGVuZHMgUmVzb3VyY2VTZXRJbXBsIGltcGxlbWVudHMgRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQgewotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE1vZHVsZVVSSSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQl9QUk9UT0NPTF9JTkRYID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPSkVDVF9OQU1FX0lORFggPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RVTEVfTkFNRV9JTkRYID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0lORFggPSAzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGVhc2luZyA9IGZhbHNlOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQlwcm90ZWN0ZWQgTGlzdCByZXNvdXJjZUhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXI7Ci0JcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZVNldEltcGwoKSB7Ci0JCXNldFVSSVJlc291cmNlTWFwKG5ldyBIYXNoTWFwKDEwKSk7CS8vIFRlbGwgaXQgdG8gY2FjaGUgdXJpLT5yZXNvdXJjZSBhY2Nlc3MuCi0JCWdldExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfUEFSU0VSX1BPT0wsIEVNRk5hdHVyZS5TSEFSRURfUEFSU0VSX1BPT0wpOwotCX0KLQlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0SW1wbChJUHJvamVjdCBhUHJvamVjdCkgewotCQl0aGlzKCk7Ci0JCXNldFByb2plY3QoYVByb2plY3QpOwotCQlpbml0aWFsaXplU2hhcmVkQ2FjaGVMaXN0ZW5lcigpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2hhcmVkQ2FjaGVMaXN0ZW5lcigpIHsKLQkJSkVNVXRpbFBsdWdpbi5nZXRTaGFyZWRDYWNoZSgpLmJlZ2luTGlzdGVuaW5nKHRoaXMpOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbGVhc2luZygpIHsKLQkJcmV0dXJuIGlzUmVsZWFzaW5nOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNkZWxlZ2F0ZWRHZXRSZXNvdXJjZShVUkksIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRlbGVnYXRlZEdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCVJlc291cmNlIHJlcyA9IHN1cGVyLmRlbGVnYXRlZEdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmVzID0gZ2V0UmVzb3VyY2VGcm9tSGFuZGxlcnModXJpKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChpc1JlbGVhc2luZykgcmV0dXJuIG51bGw7Ci0JCS8vQ2hlY2sgdGhlIG1hcCBmaXJzdCB3aGVuIGNyZWF0aW5nIHRoZSByZXNvdXJjZSBhbmQgZG8gbm90Ci0JCS8vbm9ybWFsaXplIGlmIGEgdmFsdWUgaXMgZm91bmQuCi0JCWJvb2xlYW4gaXNNYXBwZWQgPSBkZXRlY3RVUklNYXBwaW5nKHVyaSk7Ci0JCWJvb2xlYW4gaGFzQ29udGVudFR5cGUgPSAoZ2V0Q29udGVudFR5cGVOYW1lKHVyaSkgIT0gbnVsbCk7Ci0JCVVSSSBjb252ZXJ0ZWQgPSB1cmk7Ci0JCWlmICghaXNNYXBwZWQpCi0JCQljb252ZXJ0ZWQgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJZWxzZSBpZiAoaGFzQ29udGVudFR5cGUpCi0JCQljb252ZXJ0ZWQgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJCi0JCVJlc291cmNlIHJlc3VsdCA9IGNyZWF0ZVJlc291cmNlRnJvbUhhbmRsZXJzKGNvbnZlcnRlZCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkgICAgUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkgPSBnZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnkodXJpKTsKLQkJICAgIGlmIChyZXNvdXJjZUZhY3RvcnkgIT0gbnVsbCkKLQkJICAgIHsvL1dlIGdvdCB0aGUgcmlnaHQgZmFjdG9yeSwgbm93IHVzZSB0aGUgcmlnaHQgVVJJCi0JCSAgICAgIHJlc3VsdCA9IHJlc291cmNlRmFjdG9yeS5jcmVhdGVSZXNvdXJjZShjb252ZXJ0ZWQpOwotCQkgICAgICBnZXRSZXNvdXJjZXMoKS5hZGQocmVzdWx0KTsKLQkJICAgIH0KLQkJfQotCQkJCi0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIENvbnRlbnRIYW5kbGVyLlVOU1BFQ0lGSUVEX0NPTlRFTlRfVFlQRSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRldGVjdFVSSU1hcHBpbmcoVVJJIHVyaSkgewotCQlpZiAodXJpID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuICEoKChVUklDb252ZXJ0ZXJJbXBsLlVSSU1hcClnZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKHVyaSkuZXF1YWxzKHVyaSkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElGaWxlIGZvciB0aGUgPGNvZGU+dXJpPC9jb2RlPiB3aXRoaW4gdGhlIFdvcmtzcGFjZS4gVGhpcyBVUkkgaXMgYXNzdW1lZCB0byBiZQotCSAqIGFic29sdXRlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBwbGF0Zm9ybTovcmVzb3VyY2UvLi4uLgotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBVUkkuZGVjb2RlKHVyaS5wYXRoKCkpOwotCQkJZmlsZVN0cmluZyA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UubGVuZ3RoKCkgKyAxKTsKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZVN0cmluZykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQkJLy9DaGVjayB0aGUgbWFwIGZpcnN0IHdoZW4gY3JlYXRpbmcgdGhlIHJlc291cmNlIGFuZCBkbyBub3QKLQkJLy9ub3JtYWxpemUgaWYgYSB2YWx1ZSBpcyBmb3VuZC4KLQkJYm9vbGVhbiBpc01hcHBlZCA9IGRldGVjdFVSSU1hcHBpbmcodXJpKTsKLQkJYm9vbGVhbiBoYXNDb250ZW50VHlwZSA9IChnZXRDb250ZW50VHlwZU5hbWUodXJpKSAhPSBudWxsKTsKLQkJVVJJIGNvbnZlcnRlZCA9IHVyaTsKLQkJaWYgKCFpc01hcHBlZCkKLQkJCWNvbnZlcnRlZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQllbHNlIGlmIChoYXNDb250ZW50VHlwZSkKLQkJCWNvbnZlcnRlZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQlSZXNvdXJjZSByZXN1bHQgPSBjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhjb252ZXJ0ZWQpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQotCQkgICAgaWYgKHJlc291cmNlRmFjdG9yeSAhPSBudWxsKQotCQkgICAgewotCQkgICAgICByZXN1bHQgPSByZXNvdXJjZUZhY3RvcnkuY3JlYXRlUmVzb3VyY2UoY29udmVydGVkKTsKLQkJICAgICAgZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc3VsdCk7Ci0JCSAgICAgIGdldFVSSVJlc291cmNlTWFwKCkucHV0KHVyaSwgcmVzdWx0KTsKLQkJICAgICAgcmV0dXJuIHJlc3VsdDsKLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcmV0dXJuIG51bGw7Ci0JCSAgICB9Ci0JCSAgCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVtYW5kTG9hZChSZXNvdXJjZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZW1hbmRMb2FkKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIWlzUmVsZWFzaW5nKQotCQkJc3VwZXIuZGVtYW5kTG9hZChyZXNvdXJjZSk7Ci0JfQotCQotCS8qKgotCSAqIFNlZSBpZiBhbnkgcmVzb3VyY2UgaGFuZGxlcnMgZnJvbSB0aGUgV29ya2JlbmNoQ29udGV4dAotCSAqIGRlY2lkZSB0byBjcmVhdGUgdGhlIFJlc291cmNlIGluIGFub3RoZXIgbWFubmVyLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlSGFuZGxlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWhhbmRsZXIgPSAoUmVzb3VyY2VIYW5kbGVyKSByZXNvdXJjZUhhbmRsZXJzLmdldChpKTsKLQkJCXJlc291cmNlID0gaGFuZGxlci5jcmVhdGVSZXNvdXJjZSh0aGlzLCB1cmkpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc291cmNlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBTZWUgaWYgYW55IHJlc291cmNlIGhhbmRsZXJzIGZyb20gdGhlIFdvcmtiZW5jaENvbnRleHQKLQkgKiBjYW4gcmV0dXJuIGEgUmVzb3VyY2UgZnJvbSBhIDxjb2RlPnVyaTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSB1cmkpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoUmVzb3VyY2VIYW5kbGVyKSByZXNvdXJjZUhhbmRsZXJzLmdldChpKSkuZ2V0UmVzb3VyY2UodGhpcywgdXJpKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiByZXNvdXJjZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gU2VuZCBvdXQgbm90aWZpY2F0aW9uIG9mIHJlbGVhc2UuCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJZU5vdGlmeShuZXcgTm90aWZpY2F0aW9uSW1wbChTUEVDSUFMX05PVElGSUNBVElPTl9UWVBFLCBudWxsLCBudWxsLCBOb3RpZmljYXRpb24uTk9fSU5ERVgsIGZhbHNlKSB7Ci0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsI2dldEZlYXR1cmVJRChqYXZhLmxhbmcuQ2xhc3MpCi0JCQkJICovCi0JCQkJcHVibGljIGludCBnZXRGZWF0dXJlSUQoQ2xhc3MgZXhwZWN0ZWRDbGFzcykgewotCQkJCQlyZXR1cm4gUFJPSkVDVFJFU09VUkNFU0VUX0FCT1VUX1RPX1JFTEVBU0VfSUQ7Ci0JCQkJfQotCQkJCQotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXROb3RpZmllcigpCi0JCQkJICovCi0JCQkJcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJCQkJcmV0dXJuIFByb2plY3RSZXNvdXJjZVNldEltcGwudGhpczsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlzZXRJc1JlbGVhc2luZyh0cnVlKTsKLQkJaWYgKHN5bmNocm9uaXplciAhPSBudWxsKQotCQkJc3luY2hyb25pemVyLmRpc3Bvc2UoKTsKLQkJc3luY2hyb25pemVyID0gbnVsbDsKLQkJcmVtb3ZlQW5kVW5sb2FkQWxsUmVzb3VyY2VzKCk7Ci0JCXJlc291cmNlSGFuZGxlcnMgPSBudWxsOwotCQllQWRhcHRlcnMoKS5jbGVhcigpOwotCQlzZXRQcm9qZWN0KG51bGwpOwotCQlKRU1VdGlsUGx1Z2luLmdldFNoYXJlZENhY2hlKCkuc3RvcExpc3RlbmluZyh0aGlzKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5kVW5sb2FkQWxsUmVzb3VyY2VzKCkgewotCQlib29sZWFuIGNhdWdodEV4Y2VwdGlvbiA9IGZhbHNlOwotCQlpZiAoZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSByZXR1cm47Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZ2V0UmVzb3VyY2VzKCkpOwotCQlnZXRSZXNvdXJjZXMoKS5jbGVhcigpOwotCQlSZXNvdXJjZSByZXM7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIGxpc3QuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlyZXMudW5sb2FkKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQljYXVnaHRFeGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChjYXVnaHRFeGNlcHRpb24pCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uKHMpIHVubG9hZGluZyByZXNvdXJjZXMgLSBjaGVjayBsb2cgZmlsZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJc1JlbGVhc2luZyhib29sZWFuIGFCb29sZWFuKSB7Ci0JCWlzUmVsZWFzaW5nID0gYUJvb2xlYW47Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIHByb2plY3QuCi0JICogQHJldHVybiBSZXR1cm5zIGEgSVByb2plY3QKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHByb2plY3QuCi0JICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKHVyaS50cmltRnJhZ21lbnQoKSwgbG9hZE9uRGVtYW5kKTsKLQkJRU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc0xvYWRlZCgpKQotCQkJcmVzdWx0ID0gcmVzb3VyY2UuZ2V0RU9iamVjdCh1cmkuZnJhZ21lbnQoKSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGdldEVPYmplY3RGcm9tSGFuZGxlcnModXJpLCBsb2FkT25EZW1hbmQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBTZWUgaWYgYW55IHJlc291cmNlIGhhbmRsZXJzIGZyb20gdGhlIFdvcmtiZW5jaENvbnRleHQKLQkgKiBjYW4gcmV0dXJuIGEgRU9iamVjdCBmcm9tIGEgPGNvZGU+dXJpPC9jb2RlPiBhZnRlcgotCSAqIGZhaWxpbmcgdG8gZmluZCBpdCB1c2luZyB0aGUgbm9ybWFsIG1lY2hhbmlzbXMuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RU9iamVjdEZyb21IYW5kbGVycyhVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlFT2JqZWN0IG9iaiA9IG51bGw7Ci0JCVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQloYW5kbGVyID0gKFJlc291cmNlSGFuZGxlcikgcmVzb3VyY2VIYW5kbGVycy5nZXQoaSk7Ci0JCQlvYmogPSBoYW5kbGVyLmdldEVPYmplY3RGYWlsZWQodGhpcywgdXJpLCBsb2FkT25EZW1hbmQpOwotCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCXJldHVybiBvYmo7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFkZChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKSB7Ci0JCXJldHVybiByZXNvdXJjZUhhbmRsZXJzLmFkZChyZXNvdXJjZUhhbmRsZXIpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGRGaXJzdChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKSB7Ci0JCXJlc291cmNlSGFuZGxlcnMuYWRkKDAsIHJlc291cmNlSGFuZGxlcik7Ci0JfQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKSB7Ci0JCXJldHVybiByZXNvdXJjZUhhbmRsZXJzLnJlbW92ZShyZXNvdXJjZUhhbmRsZXIpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeW5jaHJvbml6ZXIuCi0JICogQHJldHVybiBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBnZXRTeW5jaHJvbml6ZXIoKSB7Ci0JCXJldHVybiBzeW5jaHJvbml6ZXI7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHN5bmNocm9uaXplci4KLQkgKiBAcGFyYW0gc3luY2hyb25pemVyIFRoZSBzeW5jaHJvbml6ZXIgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY2hyb25pemVyKFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQl0aGlzLnN5bmNocm9uaXplciA9IHN5bmNocm9uaXplcjsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQjc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5IGZhY3RvcnlSZWcpIHsKLQkJaWYgKHJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5ICE9IG51bGwgJiYgZmFjdG9yeVJlZyAhPSBudWxsKSB7Ci0JCQlwcmVzZXJ2ZUVudHJpZXMoZmFjdG9yeVJlZy5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKSwgcmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkpOwotCQkJcHJlc2VydmVFbnRyaWVzKGZhY3RvcnlSZWcuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKSwgcmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKSk7Ci0JCX0KLQkJc3VwZXIuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoZmFjdG9yeVJlZyk7Ci0JfQotCS8qCi0JICogUHJlc2VydmUgdGhlIGVudHJpZXMgZnJvbSBtYXAyIGluIG1hcDEgaWYgbm8gY29sbGlzaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByZXNlcnZlRW50cmllcyhNYXAgbWFwMSwgTWFwIG1hcDIpIHsKLQkJaWYgKG1hcDIuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IG1hcDIuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJaWYgKCFtYXAxLmNvbnRhaW5zS2V5KGVudHJ5LmdldEtleSgpKSkKLQkJCQltYXAxLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQotCSAgICBNYXA8VVJJLCBSZXNvdXJjZT4gbWFwID0gZ2V0VVJJUmVzb3VyY2VNYXAoKTsKLQkgICAgaWYgKG1hcCAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXAuZ2V0KHVyaSk7Ci0JICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgZGVtYW5kTG9hZEhlbHBlcihyZXNvdXJjZSk7Ci0JICAgICAgICB9ICAgICAgICAKLQkgICAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIFVSSUNvbnZlcnRlciB0aGVVUklDb252ZXJ0ZXIgPSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkgICAgVVJJIG5vcm1hbGl6ZWRVUkkgPSB0aGVVUklDb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JICAgIExpc3QgcmVzb3VyY2VzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgIGZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBnZXRSZXNvdXJjZXMoKSkKLQkgICAgewotCSAgICAgIGlmICh0aGVVUklDb252ZXJ0ZXIubm9ybWFsaXplKHJlc291cmNlLmdldFVSSSgpKS5lcXVhbHMobm9ybWFsaXplZFVSSSkpIHsKLQkgICAgCQkgIAotCSAgICAJaWYgKGdldENvbnRlbnRUeXBlTmFtZSh1cmkpID09IG51bGwpIHsgLy8gbG9hZGluZyBmcm9tIGxlZ2FjeSBhcmNoaXZlIGFwaSBvciBub24tdHlwZWQgcmVzb3VyY2UKLQkJICAgICAgICBpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCQkgICAgICAgIH0KLQkJICAgICAgICAKLQkJICAgICAgICBpZiAobWFwICE9IG51bGwpCi0JCSAgICAgICAgewotCQkgICAgICAgICAgbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkJICAgICAgICB9IAotCQkgICAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgCX0gZWxzZSAgey8vIGNvbnRlbnQgdHlwZSBpcyBrbm93bgotCSAgICAJCWJvb2xlYW4gcmVzb3VyY2VFeGlzdHMgPSBmYWxzZTsKLQkgICAgCQlJRmlsZSBmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKHJlc291cmNlKTsKLQkgICAgCQlpZiAoZmlsZSAhPSBudWxsKQotCSAgICAJCQlyZXNvdXJjZUV4aXN0cyA9IGZpbGUuZXhpc3RzKCk7Ci0JICAgIAkJU3RyaW5nIHJlc291cmNlQ29udGVudFR5cGVJRCA9IGdldENvbnRlbnRUeXBlSUQocmVzb3VyY2UpOwotCSAgICAJCVN0cmluZyB1cmlDb250ZW50VHlwZUlEID0gZ2V0Q29udGVudFR5cGVOYW1lKHVyaSk7Ci0JICAgIAkJU3RyaW5nIGV4aXN0aW5nTWFwS2V5VHlwZSA9IChmaW5kS2V5KHJlc291cmNlKSAhPSBudWxsKSA/IGdldENvbnRlbnRUeXBlTmFtZShmaW5kS2V5KHJlc291cmNlKSkgOiBudWxsOwotCSAgICAJCWlmKCghbWFwLmNvbnRhaW5zVmFsdWUocmVzb3VyY2UpIHx8ICgobWFwLmdldCh1cmkpICE9IG51bGwpICYmIG1hcC5nZXQodXJpKS5lcXVhbHMocmVzb3VyY2UpKSkgLy8gZXhpc3RpbmcgcmVzb3VyY2UgIHdpdGggYWx0ZXJuYXRlIG1hcHBpbmcgZG9lc24ndCBleGlzdCBpbiBtYXAKLQkgICAgCQkJfHwgICgocmVzb3VyY2VDb250ZW50VHlwZUlEICE9IG51bGwgJiYgcmVzb3VyY2VDb250ZW50VHlwZUlELmVxdWFscyh1cmlDb250ZW50VHlwZUlEKSkpKSB7Ci0JCQkJCQlpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQkJZGVtYW5kTG9hZEhlbHBlcihyZXNvdXJjZSk7Ci0JCQkJCQl9IC8vIGlmIGVtYmVkZGVkIHVyaSBjb250ZW50IHR5cGUgaXMgZGlmZmVyZW50IHRoYW4gcmVzb3VyY2UgY29udGVudCB0eXBlLCBjb250aW51ZSBzZWFyY2hpbmcKLQkJCQkJCWlmIChyZXNvdXJjZUNvbnRlbnRUeXBlSUQgIT0gbnVsbAotCQkJCQkJCQkmJiB1cmlDb250ZW50VHlwZUlEICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoKHJlc291cmNlQ29udGVudFR5cGVJRC5lcXVhbHModXJpQ29udGVudFR5cGVJRCkpICYmIGV4aXN0aW5nTWFwS2V5VHlwZSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkJCQlpZiAoKCFyZXNvdXJjZUNvbnRlbnRUeXBlSUQuZXF1YWxzKHVyaUNvbnRlbnRUeXBlSUQpKSB8fCAoZXhpc3RpbmdNYXBLZXlUeXBlICE9IG51bGwgJiYgIWV4aXN0aW5nTWFwS2V5VHlwZQotCQkJCQkJCQkJLmVxdWFscyh1cmlDb250ZW50VHlwZUlEKSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCWVsc2UgaWYgKGV4aXN0aW5nTWFwS2V5VHlwZSA9PSBudWxsICYmICFyZXNvdXJjZUV4aXN0cykgewotCQkJCQkJCQlyZXNvdXJjZXNUb1JlbW92ZS5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKHVyaUNvbnRlbnRUeXBlSUQgIT0gbnVsbCAmJiByZXNvdXJjZUNvbnRlbnRUeXBlSUQgPT0gbnVsbCAmJiAhcmVzb3VyY2VFeGlzdHMpIHsKLQkJCQkJCQlyZXNvdXJjZXNUb1JlbW92ZS5hZGQocmVzb3VyY2UpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCWlmIChtYXAgIT0gbnVsbCAmJiAobWFwLmdldCh1cmkpID09IG51bGwpKSB7Ci0JCQkJCQkJbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiByZXNvdXJjZTsKLQkJCQkJfQotCSAgICAJfQotCSAgICAgIH0KLQkgICAgfQotCSAgICAvLyBDbGVhbnVwIGludmFsaWQgcmVzb3VyY2VzCi0JICAgIGdldFJlc291cmNlcygpLnJlbW92ZUFsbChyZXNvdXJjZXNUb1JlbW92ZSk7Ci0JICAgIFJlc291cmNlIGRlbGVnYXRlZFJlc291cmNlID0gZGVsZWdhdGVkR2V0UmVzb3VyY2UodXJpLCBsb2FkT25EZW1hbmQpOwotCSAgICBpZiAoZGVsZWdhdGVkUmVzb3VyY2UgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBtYXAucHV0KHVyaSwgZGVsZWdhdGVkUmVzb3VyY2UpOwotCSAgICAgIH0KLQkgICAgICByZXR1cm4gZGVsZWdhdGVkUmVzb3VyY2U7Ci0JICAgIH0KLQotCSAgICBpZiAobG9hZE9uRGVtYW5kKQotCSAgICB7Ci0JICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBkZW1hbmRDcmVhdGVSZXNvdXJjZSh1cmkpOwotCSAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGEgcmVzb3VyY2UgZm9yICciICsgdXJpICsgIic7IGEgcmVnaXN0ZXJlZCByZXNvdXJjZSBmYWN0b3J5IGlzIG5lZWRlZCIpOwotCSAgICAgIH0KLQkgICAgICAKLQkgICAgICBpZiAobWFwICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkgICAgICB9ICAKLQotCSAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCi0JICAgICAgICAgIAotCSAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgfQotCi0JICAgIHJldHVybiBudWxsOwotCSAgCi0JfQotCXByaXZhdGUgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKFJlc291cmNlIHJlcykgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXMuZ2V0VVJJKCkpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlpZiAocmVzLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSByZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlVUkkgY29udmVydGVkVXJpID0gY29udmVydGVyLm5vcm1hbGl6ZShyZXMuZ2V0VVJJKCkpOwotCQkJCWlmICghcmVzLmdldFVSSSgpLmVxdWFscyhjb252ZXJ0ZWRVcmkpKQotCQkJCQlmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKGNvbnZlcnRlZFVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldENvbnRlbnRUeXBlSUQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXNvdXJjZSk7Ci0JCUlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZXNjID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGRlc2MgIT0gbnVsbCAmJiBkZXNjLmdldENvbnRlbnRUeXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjLmdldENvbnRlbnRUeXBlKCkuZ2V0SWQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgVVJJIGZpbmRLZXkoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJTWFwIGFNYXAgPSBnZXRVUklSZXNvdXJjZU1hcCgpOwotCQlTZXQga2V5cyA9IGFNYXAua2V5U2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVVSSSBuYW1lID0gKFVSSSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFNYXAuZ2V0KG5hbWUpLmVxdWFscyhyZXNvdXJjZSkpCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldENvbnRlbnRUeXBlTmFtZShVUkkgdXJpKSB7Ci0JCQotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpIHx8ICFpc1ZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkodXJpKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVJZGVudGlmaWVyID0gKHVyaS5zZWdtZW50Q291bnQoKSA+IDMgPyB1cmkuc2VnbWVudChNb2R1bGVVUkkuQ09OVEVOVF9UWVBFX0lORFgpIDogbnVsbCk7Ci0JCWlmIChjb250ZW50VHlwZUlkZW50aWZpZXIgIT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZSh1cmkuc2VnbWVudChNb2R1bGVVUkkuQ09OVEVOVF9UWVBFX0lORFgpKSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkoVVJJIGFNb2R1bGVVUkkpIHsKLQkJaWYgKGFNb2R1bGVVUkkuc2VnbWVudENvdW50KCkgPCAzKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kLCBSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCQkKLQotCSAgICBNYXA8VVJJLCBSZXNvdXJjZT4gbWFwID0gZ2V0VVJJUmVzb3VyY2VNYXAoKTsKLQkgICAgaWYgKG1hcCAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXAuZ2V0KHVyaSk7Ci0JICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgZGVtYW5kTG9hZEhlbHBlcihyZXNvdXJjZSk7Ci0JICAgICAgICB9ICAgICAgICAKLQkgICAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIFVSSUNvbnZlcnRlciB0aGVVUklDb252ZXJ0ZXIgPSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkgICAgVVJJIG5vcm1hbGl6ZWRVUkkgPSB0aGVVUklDb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JICAgIGZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBnZXRSZXNvdXJjZXMoKSkKLQkgICAgewotCSAgICAgIGlmICh0aGVVUklDb252ZXJ0ZXIubm9ybWFsaXplKHJlc291cmNlLmdldFVSSSgpKS5lcXVhbHMobm9ybWFsaXplZFVSSSkpCi0JICAgICAgewotCSAgICAgICAgaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgZGVtYW5kTG9hZEhlbHBlcihyZXNvdXJjZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICAKLQkgICAgICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkgICAgICAgIH0gCi0JICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIAotCSAgICBSZXNvdXJjZSBkZWxlZ2F0ZWRSZXNvdXJjZSA9IGRlbGVnYXRlZEdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkgICAgaWYgKGRlbGVnYXRlZFJlc291cmNlICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBpZiAobWFwICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgbWFwLnB1dCh1cmksIGRlbGVnYXRlZFJlc291cmNlKTsKLQkgICAgICB9Ci0JICAgICAgcmV0dXJuIGRlbGVnYXRlZFJlc291cmNlOwotCSAgICB9Ci0KLQkgICAgaWYgKGxvYWRPbkRlbWFuZCkKLQkgICAgewotCSAgICAgIFJlc291cmNlIHJlc291cmNlID0gZGVtYW5kQ3JlYXRlUmVzb3VyY2UodXJpLHJlc291cmNlRmFjdG9yeSk7Ci0JICAgICAgaWYgKHJlc291cmNlID09IG51bGwpCi0JICAgICAgewotCSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgYSByZXNvdXJjZSBmb3IgJyIgKyB1cmkgKyAiJzsgYSByZWdpc3RlcmVkIHJlc291cmNlIGZhY3RvcnkgaXMgbmVlZGVkIik7Ci0JICAgICAgfQotCi0JICAgICAgZGVtYW5kTG9hZEhlbHBlcihyZXNvdXJjZSk7Ci0KLQkgICAgICBpZiAobWFwICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkgICAgICB9ICAgICAgCi0JICAgICAgcmV0dXJuIHJlc291cmNlOwotCSAgICB9Ci0KLQkgICAgcmV0dXJuIG51bGw7Ci0JICAKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldCNyZXNldE5vcm1hbGl6ZWRVUklDYWNoZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXROb3JtYWxpemVkVVJJQ2FjaGUoKSB7Ci0JCWlmIChnZXRVUklSZXNvdXJjZU1hcCgpICE9IG51bGwpCi0JCQlnZXRVUklSZXNvdXJjZU1hcCgpLmNsZWFyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBSZXNvdXJjZSBkZW1hbmRDcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBGYWN0b3J5IHJlc291cmNlRmFjdG9yeSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmkscmVzb3VyY2VGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtzcGFjZVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzQxMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gcmVkaXJlY3QsIGlmIG5lY2Vzc2FyeSwgdG8gYW5vdGhlciAKLSAqIFJlc291cmNlU2V0LiAgVGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIKLSAqIHNvIHRoYXQgdGhlIFVSSXMgcGFzc2VkIHdpbGwgdXNlIHRoZSBwbGF0Zm9ybSBwcm90b2NvbC4gIEFueXRoaW5nIGVsc2Ugd2lsbCBiZSBjb25zaWRlcmVkCi0gKiB0byBiZSBhbWJpZ3VvdXMgYW5kIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gcmVkaXJlY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIgaW1wbGVtZW50cyBSZXNvdXJjZUhhbmRsZXIgewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIuCi0JICovCi0JcHVibGljIFdvcmtzcGFjZVJlc291cmNlSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoKLQkqIEBzZWUgSVJlc291cmNlSGFuZGxlciNnZXRSZXNvdXJjZShSZXNvdXJjZVNldCwgVVJJKQotCSovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkKLQkJCXJldHVybiBnZXRSZXNvdXJjZUZvclBsYXRmb3JtUHJvdG9jb2wob3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgdXJpKTsKLQkJVVJJIG1hcHBlZFVSSSA9ICgoVVJJQ29udmVydGVySW1wbC5VUklNYXApb3JpZ2luYXRpbmdSZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKHVyaSk7Ci0JCWlmIChpc0dsb2JhbFBsdWdpbkxvYWQobWFwcGVkVVJJKSkKLQkJCXJldHVybiBnZXRSZXNvdXJjZUZvclBsYXRmb3JtUGx1Z2luUHJvdG9jb2wob3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgdXJpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIFJlZGlyZWN0IHRvIHRoZSBjb3JyZWN0IHByb2plY3QgYmFzZWQgb24gdGhlIHByb2plY3QgbmFtZSBpbiB0aGUgPGNvZGU+dXJpPC9jb2RlPi4KLQkgKiBUaGUgPGNvZGU+dXJpPC9jb2RlPiB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiAgIHBsYXRmb3JtOi9yZXNvdXJjZS9bcHJvamVjdCBuYW1lXS4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VGb3JQbGF0Zm9ybVByb3RvY29sKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gdXJpLnNlZ21lbnQoMSk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQocHJvamVjdCk7Ci0JCQlpZiAob3JpZ2luYXRpbmdSZXNvdXJjZVNldCAhPSBzZXQpCi0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSwgc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JCSAqIFJlZGlyZWN0IHRvIHRoZSBjb3JyZWN0IHByb2plY3QgYmFzZWQgb24gdGhlIHByb2plY3QgbmFtZSBpbiB0aGUgPGNvZGU+dXJpPC9jb2RlPi4KLQkJICogVGhlIDxjb2RlPnVyaTwvY29kZT4gd2lsbCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogICBwbGF0Zm9ybTovcmVzb3VyY2UvW3Byb2plY3QgbmFtZV0uCi0JCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUZvclBsYXRmb3JtUGx1Z2luUHJvdG9jb2woUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQkJCi0JCVJlc291cmNlU2V0IHNldCA9IEpFTVV0aWxQbHVnaW4uZ2V0UGx1Z2luUmVzb3VyY2VTZXQoKTsKLQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSwgc2V0KTsKLQkJfQotCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZVNldCByZWRpcmVjdGVkUmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIHJlZGlyZWN0ZWRSZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCX0KLQkvKioKLQkgKiBSZWRpcmVjdCB0byB0aGUgY29ycmVjdCBwcm9qZWN0IGJhc2VkIG9uIHRoZSBmaXJzdCBzZWdtZW50IGluIHRoZSBmaWxlIG5hbWUuCi0JICogVGhpcyBpcyBmb3IgY29tcGF0YWJpbGl0eSBwdXJwb3NlcyBmb3IgcGVvcGxlIHVzaW5nIHRoZSBwbGF0Zm9ybTovcmVzb3VyY2UgcHJvdG9jb2wuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlRm9yUGxhdGZvcm1Qcm90b2NvbChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IHVyaS5zZWdtZW50KDEpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJUmVzb3VyY2VTZXQgc2V0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpOwotCQkJaWYgKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQgIT0gc2V0KQotCQkJCXJldHVybiBnZXRSZXNvdXJjZSh1cmksIHNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCQkgKiBSZWRpcmVjdCB0byB0aGUgY29ycmVjdCBwcm9qZWN0IGJhc2VkIG9uIHRoZSBmaXJzdCBzZWdtZW50IGluIHRoZSBmaWxlIG5hbWUuCi0JCSAqIFRoaXMgaXMgZm9yIGNvbXBhdGFiaWxpdHkgcHVycG9zZXMgZm9yIHBlb3BsZSB1c2luZyB0aGUgcGxhdGZvcm06L3Jlc291cmNlIHByb3RvY29sLgotCQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2VGb3JQbGF0Zm9ybVBsdWdpblByb3RvY29sKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJCQotCQlSZXNvdXJjZVNldCBzZXQgPSBKRU1VdGlsUGx1Z2luLmdldFBsdWdpblJlc291cmNlU2V0KCk7Ci0JCXJldHVybiBnZXRSZXNvdXJjZSh1cmksIHNldCk7Ci0JCQkKLQl9Ci0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIFJlc291cmNlU2V0IHJlZGlyZWN0ZWRSZXNvdXJjZVNldCkgewotCQlyZXR1cm4gcmVkaXJlY3RlZFJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlJV29ya3NwYWNlIHdzID0gZ2V0V29ya3NwYWNlKCk7Ci0JCWlmICh3cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB3cy5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UHJvamVjdChyZXNvdXJjZVNldCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVzb3VyY2VIYW5kbGVyI2NyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0LCBVUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkKLQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUZvclBsYXRmb3JtUHJvdG9jb2wob3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgdXJpKTsKLQkJVVJJIG1hcHBlZFVSSSA9ICgoVVJJQ29udmVydGVySW1wbC5VUklNYXApb3JpZ2luYXRpbmdSZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKHVyaSk7Ci0JCWlmIChpc0dsb2JhbFBsdWdpbkxvYWQobWFwcGVkVVJJKSkKLQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUZvclBsYXRmb3JtUGx1Z2luUHJvdG9jb2wob3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgdXJpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVzb3VyY2VIYW5kbGVyI2dldEVPYmplY3RGYWlsZWQoUmVzb3VyY2VTZXQsIFVSSSwgYm9vbGVhbikKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0RmFpbGVkKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dsb2JhbFBsdWdpbkxvYWQoVVJJIGFVUkkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkoYVVSSSkpIHsKLQkJCVN0cmluZ1tdIGdsb2JhbFBsdWdpbnMgPSBKRU1VdGlsUGx1Z2luLmdldEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpOwotCQkJZm9yIChpbnQgaT0wO2k8Z2xvYmFsUGx1Z2lucy5sZW5ndGg7aSsrKSB7Ci0JCQkJaWYgKGFVUkkuc2VnbWVudCgxKS5zdGFydHNXaXRoKGdsb2JhbFBsdWdpbnNbaV0pKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEwYWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtzcGFjZVJlc291cmNlTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpZXJJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNhcHR1cmUgYWxsIEFERCBhbmQgUkVNT1ZFIG5vdGlmaWNhdGlvbnMgZnJvbSBlYWNoIFByb2plY3RSZXNvdXJjZVNldAotICogYW5kIGZvcndhcmQgaXQgb24gdG8gYW55IGludGVycmVzdGVkIGxpc3RlbmVycy4gIFRoaXMgaXMgdG8gYWxsb3cgeW91IHRvIGxpc3RlbiB0byBvbmUgb2JqZWN0Ci0gKiB0byBnYWluIGFsbCBBREQgYW5kIFJFTU9WRSBub3RpZmljYXRpb25zIGZvciBlYWNoIFJlc291cmNlU2V0IHdpdGhpbiB0aGUgc3lzdGVtLgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllciBleHRlbmRzIE5vdGlmaWVySW1wbCB7Ci0JcHJvdGVjdGVkIEFkYXB0ZXIgcHJvamVjdEFkYXB0ZXIgPSBuZXcgV29ya3NwYWNlUmVzb3VyY2VDYWNoZUFkYXB0ZXIoKTsKLQotCWNsYXNzIFdvcmtzcGFjZVJlc291cmNlQ2FjaGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQkvKioKLQkJICogRm9yd2FyZCBBREQgYW5kIFJFTU9WRSBub3RpZmljYXRpb24uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0JCQkJCWVOb3RpZnkobXNnKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgV29ya3NwYWNlUmVzb3VyY2VDYWNoZS4KLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBCZWdpbiBsaXN0ZW5pbmcgdG8gYSBQcm9qZWN0UmVzb3VyY2VTZXQuCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5MaXN0ZW5pbmcoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpZiAoYVJlc291cmNlU2V0ICE9IG51bGwpIHsgCi0JCQlpZiAoYVJlc291cmNlU2V0LmVBZGFwdGVycygpID09IG51bGwgfHwgIAotCQkJIWFSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5jb250YWlucyhwcm9qZWN0QWRhcHRlcikpCi0JCQlhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkuYWRkKHByb2plY3RBZGFwdGVyKTsKLQkJfQotCX0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byBhIFByb2plY3RSZXNvdXJjZVNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJaWYgKGFSZXNvdXJjZVNldCAhPSBudWxsKQotCQkJYVJlc291cmNlU2V0LmVBZGFwdGVycygpLnJlbW92ZShwcm9qZWN0QWRhcHRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmF0dXJlL0VNRk5hdHVyZVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg1ZjdiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogRU1GTmF0dXJlUmVnaXN0cnkuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi1wdWJsaWMgY2xhc3MgRU1GTmF0dXJlUmVnaXN0cnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRV9SRUdJU1RSQVRJT05fUE9JTlQgPSAib3JnLmVjbGlwc2UuamVtLnV0aWwubmF0dXJlX3JlZ2lzdHJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFICA9ICJuYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHJpdmF0ZSBFTUZOYXR1cmVSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVNRk5hdHVyZVJlZ2lzdHJ5IHNpbmdsZXRvbjsKLQkKLQlwdWJsaWMgZmluYWwgU2V0IFJFR0lTVEVSRURfTkFUVVJFX0lEUyA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0JcHVibGljIHN0YXRpYyBFTUZOYXR1cmVSZWdpc3RyeSBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXNpbmdsZXRvbiA9IG5ldyBFTUZOYXR1cmVSZWdpc3RyeSgpOwotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JLy8gcmVnaXN0ZXIgTmF0dXJlIElEcyBmb3IgdGhlIEoyRUVOYXR1cmVzCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2UgPSByLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihOQVRVUkVfUkVHSVNUUkFUSU9OX1BPSU5UKTsKLQkJU3RyaW5nIG5hdHVyZUlkOwotCQlmb3IgKGludCBpPTA7IGk8Y2UubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjZVtpXS5nZXROYW1lKCkuZXF1YWxzKE5BVFVSRSkpIHsKLQkJCQluYXR1cmVJZCA9IGNlW2ldLmdldEF0dHJpYnV0ZShTVEFUSUNfSUQpOwotCQkJCWlmIChuYXR1cmVJZCAhPSBudWxsKQotCQkJCQlyZWdpc3Rlck5hdHVyZUlEKG5hdHVyZUlkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3Rlck5hdHVyZUlEKFN0cmluZyBuYXR1cmVJZCkgewotCQlpZiAoIVJFR0lTVEVSRURfTkFUVVJFX0lEUy5jb250YWlucyhuYXR1cmVJZCkpCi0JCQlSRUdJU1RFUkVEX05BVFVSRV9JRFMuYWRkKG5hdHVyZUlkKTsKLQkJZWxzZQotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRk5hdHVyZVJlZ2lzdHJ5X0VSUk9SXzAiLCBuZXcgT2JqZWN0W10ge25hdHVyZUlkfSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9ubHMvRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9ubHMvRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYThlNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmxzL0VNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImVtZndvcmtiZW5jaCIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nLCBTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0JCQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JdHJ5IHtyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHtyZXR1cm4gZ2V0U3RyaW5nKGtleSk7fQotCi19Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncywgaW50IHgpIHsKLQotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL0NoYXJhY3RlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9DaGFyYWN0ZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTJiMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL0NoYXJhY3RlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5VVEYxNjsKLSAKLQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIHRvIGhhbmRsZSBjaGFyYWN0ZXJzIGluIHRoZSBuZXcgVVRGIG11bHRpLWNoYXIgZm9ybWF0LgotICogSXQgaXMgbmVlZGVkIGJlY2F1c2UgSUNVNEogY3VycmVudGx5IGRvZXNuJ3QgaGFuZGxlIHNvbWUgY29ycmVjdGx5IHlldCB0aGF0IHdlCi0gKiBuZWVkIHRvIGhhdmUgd29ya2luZy4gQXMgSUNVNEogZ2V0cyB0aGVtIHdvcmtpbmcsIHRoZSBtZXRob2RzIGhlcmUgd2lsbCBiZWNvbWUKLSAqIGRlcHJlY2F0ZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hhcmFjdGVyVXRpbCB7Ci0KLQlwcml2YXRlIENoYXJhY3RlclV0aWwoKSB7Ci0JCQotCX0KLQkKLQkKLQkvKioKLQkgKiBUT0RPIFNvIHVudGlsIElDVTRKIGRvZXMgd29yayBjb3JyZWN0bHkgdGhpcyB1dGlsIHdpbGwgYmUgbmVlZGVkLiBJdCB3aWxsCi0JICogc3RheSBhcm91bmQgYmVjYXVzZSBpdCBpcyBBUEksIGJ1dCBhdCB0aGF0IHRpbWUgaXQgd2lsbCBiZSBtYXJrZWQgZGVwcmVjYXRlZC4gSXQgc2hvdWxkCi0JICogYWxzbyB0aGVuIHJlcm91dGUgdG8gSUNVNEogaW5zdGVhZCBvZiBkb2luZyB0aGUgbWV0aG9kIHJlZmxlY3Rpb25zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIE1ldGhvZCBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJULCBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQ7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gVHJ5IHRvIGdldCB0aGUgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXIoaW50KSBtZXRob2QuIElmIHRoZXJlLCB0aGVuIHdlIGFyZSBpbiAxLjUgb3IgYWJvdmUuIEVsc2UgdXNlIHRoZSBjaGFyIGZvcm0uCi0JCXRyeSB7Ci0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJUID0gQ2hhcmFjdGVyLmNsYXNzLmdldE1ldGhvZCgiaXNKYXZhSWRlbnRpZmllclN0YXJ0IiwgbmV3IENsYXNzW10ge0ludGVnZXIuVFlQRX0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEZWZhdWx0IHRvIHVzZSAoY2hhcikgdHlwZSBpbnN0ZWFkLgotCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVCA9IG51bGw7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEZWZhdWx0IHRvIHVzZSAoY2hhcikgdHlwZSBpbnN0ZWFkLgotCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVCA9IG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCU1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVCA9IENoYXJhY3Rlci5jbGFzcy5nZXRNZXRob2QoImlzSmF2YUlkZW50aWZpZXJQYXJ0IiwgbmV3IENsYXNzW10ge0ludGVnZXIuVFlQRX0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEZWZhdWx0IHRvIHVzZSAoY2hhcikgdHlwZSBpbnN0ZWFkLgotCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9QQVJUID0gbnVsbDsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERlZmF1bHQgdG8gdXNlIChjaGFyKSB0eXBlIGluc3RlYWQuCi0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQgPSBudWxsOwotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBJcyBzdGFydCBvZiBqYXZhIGlkZW50aWZpZXIKLQkgKiBAcGFyYW0gaW50Q2hhciBpbnQgY2hhcmFjdGVyIChVVEYgbXVsdGktY2hhciBpcyB2YWxpZCkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN0YXJ0IG9mIGphdmEgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAc2VlIENoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyU3RhcnQoY2hhcikKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclN0YXJ0KGludCBpbnRDaGFyKSB7Ci0JCWlmIChNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJUICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoQm9vbGVhbikgTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpbnRDaGFyKX0pKS5ib29sZWFuVmFsdWUoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KChjaGFyKSBpbnRDaGFyKTsKLQl9Ci0JCi0JLyoqCi0JICogSXMgc3RhcnQgb2YgamF2YSBpZGVudGlmaWVyCi0JICogQHBhcmFtIGludENoYXIgaW50IGNoYXJhY3RlciAoVVRGIG11bHRpLWNoYXIgaXMgdmFsaWQpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdGFydCBvZiBqYXZhIGlkZW50aWZpZXIuCi0JICogCi0JICogQHNlZSBDaGFyYWN0ZXIjaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXIpCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJQYXJ0KGludCBpbnRDaGFyKSB7Ci0JCWlmIChNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChCb29sZWFuKSBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW50Q2hhcil9KSkuYm9vbGVhblZhbHVlKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KChjaGFyKSBpbnRDaGFyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENoYXJJdGVyYXRvciB7Ci0KLQkJCi0JCXByb3RlY3RlZCBmaW5hbCBDaGFyU2VxdWVuY2UgY2hhclNlcTsKLQkJcHJpdmF0ZSBpbnQgcG9zID0gMDsKLQkJcHJpdmF0ZSBpbnQgbGFzdENoYXJJbmRleCA9IDA7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSB3aXRoIGEgc3RyaW5nLgotCQkgKiBAcGFyYW0gY2hhclNlcQotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgQWJzdHJhY3RDaGFySXRlcmF0b3IoQ2hhclNlcXVlbmNlIGNoYXJTZXEpIHsKLQkJCXRoaXMuY2hhclNlcSA9IGNoYXJTZXE7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTZXQgdGhlIG5leHQgY2hhciBpbmRleC4KLQkJICogQHBhcmFtIGluZGV4Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpbmRleCkgewotCQkJcG9zID0gaW5kZXg7Ci0JCX0KLQotCQkvKioKLQkJICogSGFzIGFub3RoZXIgY2hhci4KLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhbm90aGVyIGNoYXIgdG8gcmV0dXJuLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHBvcyA8IGNoYXJTZXEubGVuZ3RoKCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBIYXMgYW5vdGhlciBjaGFyIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4gRG9pbmcgcHJldmlvdXMKLQkJICogd2lsbCByZXR1cm4gdGhlIGNoYXIgdGhhdCB3YXMganVzdCByZXR1cm5lZC4KLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJCXJldHVybiBwb3MgPiAwOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIG5leHQgY2hhciBmcm9tIHRoZSBvbmUgdGhhdCB3YXMganVzdCByZXR1cm5lZC4KLQkJICogQHJldHVybiBuZXh0IGNoYXIuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBpbnQgbmV4dCgpIHsKLQkJCWlmICghaGFzTmV4dCgpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQotCQkJaW50IG5leHQgPSB1dGZDaGFyQXQocG9zKTsKLQkJCWxhc3RDaGFySW5kZXggPSBwb3M7Ci0JCQlwb3MgKz0gVVRGMTYuZ2V0Q2hhckNvdW50KG5leHQpOwotCQkJcmV0dXJuIG5leHQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIFVURi0zMiBjaGFyIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KLQkJICogQHBhcmFtIHBvcwotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgdXRmQ2hhckF0KGludCBwb3MpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGZyb20gdGhlIG9uZSB0aGF0IHdhcyBqdXN0IHJldHVybmVkLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBpbnQgcHJldmlvdXMoKSB7Ci0JCQlpZiAoIWhhc1ByZXZpb3VzKCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0JCQlpbnQgbmV4dDsKLQkJCWlmIChVVEYxNi5pc1RyYWlsU3Vycm9nYXRlKGNoYXJTZXEuY2hhckF0KC0tcG9zKSkpIHsKLQkJCQlpZiAocG9zID4gMCkKLQkJCQkJbmV4dCA9IHV0ZkNoYXJBdCgtLXBvcyk7Ci0JCQkJZWxzZQotCQkJCQluZXh0ID0gY2hhclNlcS5jaGFyQXQocG9zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV4dCA9IGNoYXJTZXEuY2hhckF0KHBvcyk7Ci0JCQl9Ci0JCQlsYXN0Q2hhckluZGV4ID0gcG9zOwotCQkJcmV0dXJuIG5leHQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIFVURjE2IGNoYXJhY3RlciBwb3NpdGlvbiBvZiB0aGUgY2hhciB0aGF0IHdhcyBqdXN0IHJldHVybmVkIGZyb20gZWl0aGVyCi0JCSAqIHByZXZpb3VzIG9yIG5leHQuCi0JCSAqIFRoaXMgaXMgdGhlIChjaGFyKSBwb3NpdGlvbiBub3QgdGhlCi0JCSAqIHBvc2l0aW9uIG9mIGxvZ2ljYWwgaW50IGNoYXJzIHJldHVybmVkLiBGb3IgZXhhbXBsZSBhIHN0YW5kYXJkIHN0cmluZyBvZgotCQkgKiA8Y29kZT4iYWJjIjwvY29kZT4gdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyICdiJyBpcyAxLiBCdXQgdGFrZSB0aGUgc3RyaW5nCi0JCSAqIDxjb2RlPiJhYjFiMmMiPC9jb2RlPiB3aGVyZSAiYjFiMiIgaXMgb25lIFVURi0zMiBjaGFyLCB0aGVuIHRoZSBwb3NpdGlvbgotCQkgKiBvZiAnYycgaXMgMy4gSXQgd291bGQgbm90IGJlIDIsIHdoaWNoIGlzIHdoYXQgdGhlIGxvZ2ljYWwgY2hhciBwb3NpdGlvbgotCQkgKiB3b3VsZCBiZSBpZiB0YWtpbmcgVUZUMzIgaW50byBhY2NvdW50LgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCQlyZXR1cm4gbGFzdENoYXJJbmRleDsKLQkJfQotCQotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsIGNoYXIgaXRlcmF0b3IgdGhhdCByZXR1cm5zIGludHMgaW5zdGVhZCBvZiBjaGFycyBmb3IKLQkgKiB3YWxraW5nIHN0cmluZ3MgdGhhdCBjYW4gY29udGFpbiBVVEYgbXVsdGktY2hhcnMuIFRoaXMgaXMKLQkgKiBhIGxpbWl0ZWQgdmVyc2lvbiBvZiB7QGxpbmsgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yfS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ0l0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDaGFySXRlcmF0b3IgewotCQkKLQotCQkvKioKLQkJICogQ3JlYXRlIHdpdGggYSBzdHJpbmcuCi0JCSAqIEBwYXJhbSBzdHIKLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIFN0cmluZ0l0ZXJhdG9yKFN0cmluZyBzdHIpIHsKLQkJCXN1cGVyKHN0cik7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5DaGFyYWN0ZXJVdGlsLkFic3RyYWN0Q2hhckl0ZXJhdG9yI3V0ZkNoYXJBdChpbnQpCi0JCSAqLwotCQlwcm90ZWN0ZWQgaW50IHV0ZkNoYXJBdChpbnQgcG9zKSB7Ci0JCQlyZXR1cm4gVVRGMTYuY2hhckF0KChTdHJpbmcpIGNoYXJTZXEsIHBvcyk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIFNwZWNpYWwgY2hhciBpdGVyYXRvciB0aGF0IHJldHVybnMgaW50cyBpbnN0ZWFkIG9mIGNoYXJzIGZvcgotCSAqIHdhbGtpbmcgc3RyaW5ncyB0aGF0IGNhbiBjb250YWluIFVURiBtdWx0aS1jaGFycy4gVGhpcyBpcwotCSAqIGEgbGltaXRlZCB2ZXJzaW9uIG9mIHtAbGluayBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3J9LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nQnVmZmVySXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENoYXJJdGVyYXRvciB7Ci0JCQotCi0JCS8qKgotCQkgKiBDcmVhdGUgd2l0aCBhIHN0cmluZy4KLQkJICogQHBhcmFtIHN0ckJ1ZmZlcgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nQnVmZmVySXRlcmF0b3IoU3RyaW5nQnVmZmVyIHN0ckJ1ZmZlcikgewotCQkJc3VwZXIoc3RyQnVmZmVyKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLkNoYXJhY3RlclV0aWwuQWJzdHJhY3RDaGFySXRlcmF0b3IjdXRmQ2hhckF0KGludCkKLQkJICovCi0JCXByb3RlY3RlZCBpbnQgdXRmQ2hhckF0KGludCBwb3MpIHsKLQkJCXJldHVybiBVVEYxNi5jaGFyQXQoKFN0cmluZ0J1ZmZlcikgY2hhclNlcSwgcG9zKTsKLQkJfQotCQkKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL05vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9Ob3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YWYyYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL05vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IE5vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4zICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLS8qKgotICogVGhpcyBpcyB0aGUgaW5zdGFudGlhdGlvbiB0byB1c2UgaWYgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQuIEl0IGJhc2ljYWxseSBkb2VzIG5vdGhpbmcuCi0gKiAKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvciBleHRlbmRzIFBlcmZvcm1hbmNlTW9uaXRvclV0aWwgewotCi0JLyoKLQkgKiBPbmx5IGluc3RhbnRpYXRlZCBmcm9tIHRoaXMgcGFja2FnZS4KLQkgKi8KLQlOb3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNzZXRWYXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjZG9TbmFwc2hvdChpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwLCBpbnQgdHlwZXMpIHsKLQl9Ci0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjZG9TbmFwc2hvdChpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TbmFwc2hvdChpbnQgc3RlcCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUGVyZm9ybWFuY2VNb25pdG9yVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1BlcmZvcm1hbmNlTW9uaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmM2ExYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUGVyZm9ybWFuY2VNb25pdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5JUGVyZm9ybWFuY2VNb25pdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHdyYXBwZXIgdG8gdGhlIElQZXJmb3JtYW5jZU1vbml0b3IgdGhhdCBoaWRlcyBpdCBzbyB0aGF0IHRoZSBhY3R1YWwgcGx1Z2luIGNhbiBiZSBvcHRpb25hbCBhbmQgbm90IHJlcXVpcmVkLgotICogCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJmb3JtYW5jZU1vbml0b3JVdGlsIHsKLQkvKioKLQkgKiBFdmVudCBmb3IgUGVyZm9ybWFuY2VMaXN0ZW5lciBub3RpZmljYXRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQZXJmb3JtYW5jZUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCQkKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NjgwMDcxNDYyNzUwMTgwMzM5TDsKLQotCQlQZXJmb3JtYW5jZUV2ZW50KE9iamVjdCBzb3VyY2UsIGludCBzdGVwKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJc25hcHNob3dXaXRoVHlwZXMgPSBmYWxzZTsKLQkJCXRoaXMuc3RlcCA9IHN0ZXA7Ci0JCQl0aGlzLnR5cGVzID0gMDsJLy8gTm90IHNldC4KLQkJfQotCQkKLQkJUGVyZm9ybWFuY2VFdmVudChPYmplY3Qgc291cmNlLCBpbnQgc3RlcCwgaW50IHR5cGVzKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJc25hcHNob3dXaXRoVHlwZXMgPSB0cnVlOwotCQkJdGhpcy5zdGVwID0gc3RlcDsKLQkJCXRoaXMudHlwZXMgPSB0eXBlczsKLQkJfQotCi0JCQotCQkvKioKLQkJICogU25hcHNob3Qgd2l0aCB0eXBlcyBpZiA8Y29kZT50cnVlPC9jb2RlPi4KLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzbmFwc2hvd1dpdGhUeXBlczsKLQotCQkvKioKLQkJICogU3RlcCBvZiBzbmFwc2hvdAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBpbnQgc3RlcDsKLQkJCi0JCS8qKgotCQkgKiB0eXBlcyBvZiBzbmFwc2hvdC4KLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgaW50IHR5cGVzOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtYW5jZSBMaXN0ZW5lciBpbnRlcmZhY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFBlcmZvcm1hbmNlTGlzdGVuZXIgewotCQkvKioKLQkJICogU25hcHNob3Qgd2FzIGNhbGxlZC4KLQkJICogQHBhcmFtIGV2ZW50Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNuYXBzaG90KFBlcmZvcm1hbmNlRXZlbnQgZXZlbnQpOwotCX0KLQkKLQlwcml2YXRlIFBlcmZvcm1hbmNlTGlzdGVuZXJbXSBsaXN0ZW5lcnM7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFR5cGVzIHsKLQotCQkvKioKLQkJICogMSAtIFdyaXRlIG91dCB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gVGhlc2UgaW5jbHVkZSB3b3JraW5nIHNldCwgcGVhayB3b3JraW5nIHNldCwgZWxhcHNlZCB0aW1lLCB1c2VyIHRpbWUsIGFuZAotCQkgKiBrZXJuZWwgdGltZS4KLQkJICovCi0JCWludCBPcGVyYXRpbmdTeXN0ZW1Db3VudGVycyA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuT3BlcmF0aW5nU3lzdGVtQ291bnRlcnM7Ci0KLQkJLyoqCi0JCSAqIDIgLSBXcml0ZSBvdXQgdGhlIGdsb2JhbCBwZXJmb3JtYW5jZSBpbmZvLiBUaGlzIGluY2x1ZGVzIHRoaW5ncyBsaWtlIHRoZSB0b3RhbCBjb21taXR0ZWQgbWVtb3J5IGZvciB0aGUgZW50aXJlIHN5c3RlbS4KLQkJICogCi0JCSAqIFRoaXMgZnVuY3Rpb24gZGVwZW5kcyBvbiB0aGUgR2V0UGVyZm9ybWFuY2VJbmZvKCkgZnVuY3Rpb24gYmVpbmcgYXZhaWxhYmxlIGluIHRoZSBXaW5kb3dzIHBzYXBpLmRsbC4gVGhpcyBpcyBhdmFpbGFibGUgaW4gWFAgYnV0IGlzIHVzdWFsbHkKLQkJICogbm90IGF2YWlsYWJsZSBpbiBXaW4vMjAwMC4gSWYgaXQgaXMgbm90IGF2YWlsYWJsZSB0aGVuIHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgotCQkgKi8KLQkJaW50IEdsb2JhbFN5c3RlbUNvdW50ZXJzID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5HbG9iYWxTeXN0ZW1Db3VudGVyczsKLQotCQkvKioKLQkJICogNCAtIFdyaXRlIG91dCB0aGUgc2l6ZSBvZiB0aGUgSmF2YSBIZWFwLgotCQkgKi8KLQkJaW50IEphdmFIZWFwU2l6ZSA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuSmF2YUhlYXBTaXplOwotCi0JCS8qKgotCQkgKiA4IC0gV3JpdGUgb3V0IGhvdyBtdWNoIG9mIHRoZSBKYXZhIGhlYXAgaXMgYmVpbmcgdXNlZC4gVGhpcyBjYWxscyB0aGUgZ2FyYmFnZSBjb2xsZWN0b3Igc28gaXQgbWF5IHNrZXcgdGltaW5nIHJlc3VsdHMuCi0JCSAqLwotCQlpbnQgSmF2YUhlYXBVc2VkID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5KYXZhSGVhcFVzZWQ7Ci0KLQkJLyoqCi0JCSAqIDE2IC0gVGhlIHBsdWdpbiBzdGFydHVwIGFuZCBzaXplIGluZm9ybWF0aW9uLgotCQkgKi8KLQkJaW50IFBsdWdpbkluZm8gPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLlBsdWdpbkluZm87Ci0KLQkJLyoqIDB4ZmZmZiAtIEV2ZXJ5dGhpbmcuICovCi0JCWludCBBbGwgPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLkFsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQZXJmb3JtYW5jZU1vbml0b3JVdGlsIHNoYXJlZE1vbml0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFBlcmZvcm1hbmNlTW9uaXRvclV0aWwgZ2V0TW9uaXRvcigpIHsKLQkJaWYgKHNoYXJlZE1vbml0b3IgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuUGVyZk1zckNvcmVQbHVnaW4iKTsgLy8gVGhpcyBqdXN0IHRlc3RzIGlmIHRoZSBwZXJmb3JtYW5jZSBwbHVnaW4gaXMgYXZhaWxhYmxlLiBUaHJvd3MgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCQkJCSAvLyBleGNlcHRpb24gb3RoZXJ3aXNlLgotCQkJCUNsYXNzIHByZXNlbnRDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmplbS51dGlsLlByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IiKTsgLy8gR2V0IHRoZSBjbGFzcyB3ZSB1c2Ugd3JhcHBlciBpdC4gLy8kTk9OLU5MUy0xJAotCQkJCXNoYXJlZE1vbml0b3IgPSAoUGVyZm9ybWFuY2VNb25pdG9yVXRpbCkgcHJlc2VudENsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQkJaWYgKCFzaGFyZWRNb25pdG9yLmlzVmFsaWQoKSkKLQkJCQkJc2hhcmVkTW9uaXRvciA9IG51bGw7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZiBhbnkgcnVudGltZSBleGNlcHRpb24sIGp1c3QgdXNlIHRoZSBub3QgcHJlc2VudCBvbmUuCi0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZiBjbGFzcyBub3QgZm91bmQsIHRoZW4gcGx1Z2luIG5vdCBhdmFpbGFibGUsIHNvIGp1c3QgdXNlIHRoZSBub3QgcHJlc2VudCBvbmUuCi0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBQcm9ibGVtIGluc3RhbnRpYXRpbmcsIHNvIGp1c3QgdXNlIHRoZSBub3QgcHJlc2VudCBvbmUuCi0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTb21lIGlsbGVnYWwgYWNjZXNzLCBzbyBqdXN0IHVzZSB0aGUgbm90IHByZXNlbnQgb25lLgotCQkJfQotCQkJaWYgKHNoYXJlZE1vbml0b3IgPT0gbnVsbCkgewotCQkJCS8vIENvdWxkbid0IGdldCB0aGUgcGVyZm9ybWFuY2Ugb25lIGZvciBzb21lIHJlYXNvbi4gVXNlIG5vdCBwcmVzZW50IG9uZSBpbnN0ZWFkLgotCQkJCXNoYXJlZE1vbml0b3IgPSBuZXcgTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvcigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaGFyZWRNb25pdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhcmlhdGlvbnMgdGhhdCBhcmUgaW4gZWZmZWN0LgotCSAqIAotCSAqIEBwYXJhbSB2YXIKLQkgKiAgICAgICAgICAgIGEgY29tbWEgZGVsaW1pdGVkIHN0cmluZyBvZiB2YXJpYXRpb24gbnVtYmVycwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFZhcihTdHJpbmcgdmFyKTsKLQotCS8qKgotCSAqIFRha2UgYSBzbmFwc2hvdCBvZiBzb21lIGRlZmF1bHQgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBzdGVwCi0JICogICAgICAgICAgICB0aGlzIGlkZW50aWZpZXMgdGhlIHN0ZXAgdGhhdCB0aGUgc25hcHNob3QgaXMgZm9yCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc25hcHNob3QoaW50IHN0ZXApIHsKLQkJZG9TbmFwc2hvdChzdGVwKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKQotCQkJbm90aWZ5U25hcHNob3QobmV3IFBlcmZvcm1hbmNlRXZlbnQodGhpcywgc3RlcCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbm90aWZ5U25hcHNob3QoUGVyZm9ybWFuY2VFdmVudCBldmVudCkgewotCQlQZXJmb3JtYW5jZUxpc3RlbmVyW10gbGlzdCA9IGxpc3RlbmVyczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlsaXN0W2ldLnNuYXBzaG90KGV2ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEbyB0aGUgYWN0dWFsIHNuYXBzaG90Ci0JICogQHBhcmFtIHN0ZXAKLQkgKiAKLQkgKiBAc2VlICNzbmFwc2hvdChpbnQpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TbmFwc2hvdChpbnQgc3RlcCk7Ci0KLQkvKioKLQkgKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIHNlbGVjdGVkIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RlcAotCSAqICAgICAgICAgICAgdGhpcyBpZGVudGlmaWVzIHRoZSBzdGVwIHRoYXQgdGhlIHNuYXBzaG90IGlzIGZvcgotCSAqIAotCSAqIEBwYXJhbSB0eXBlcwotCSAqICAgICAgICAgICAgVGhpcyBjb250cm9scyB3aGljaCBtZWFzdXJlbWVudHMgYXJlIHNlbGVjdGVkLiBJdCBpcyBhbiBvcidkIHRvZ2V0aGVyIGxpc3Qgb2YgdGhlIElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMgY29uc3RhbnRzLgotCSAqIAotCSAqIEBzZWUgSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcwotCSAqLwotCXB1YmxpYyB2b2lkIHNuYXBzaG90KGludCBzdGVwLCBpbnQgdHlwZXMpIHsKLQkJZG9TbmFwc2hvdChzdGVwLCB0eXBlcyk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCW5vdGlmeVNuYXBzaG90KG5ldyBQZXJmb3JtYW5jZUV2ZW50KHRoaXMsIHN0ZXAsIHR5cGVzKSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogRG8gdGhlIGFjdHVhbCBzbmFwc2hvdAotCSAqIEBwYXJhbSBzdGVwCi0JICogCi0JICogQHNlZSAjc25hcHNob3QoaW50LCBpbnQpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TbmFwc2hvdChpbnQgc3RlcCwgaW50IHR5cGVzKTsJCi0JCi0JLyoqCi0JICogQWRkIGxpc3RlbmVyIHRvIGxpc3QuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGVyZm9ybWFuY2VMaXN0ZW5lcihQZXJmb3JtYW5jZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmaW5kTGlzdGVuZXIobGlzdGVuZXIpICE9IC0xKQotCQkJcmV0dXJuOwotCQlQZXJmb3JtYW5jZUxpc3RlbmVyW10gbmV3TGlzdCA9IG5ldyBQZXJmb3JtYW5jZUxpc3RlbmVyW2xpc3RlbmVycyAhPSBudWxsID8gbGlzdGVuZXJzLmxlbmd0aCsxIDogMV07Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJzLCAwLCBuZXdMaXN0LCAwLCBsaXN0ZW5lcnMubGVuZ3RoKTsKLQkJbmV3TGlzdFtuZXdMaXN0Lmxlbmd0aC0xXSA9IGxpc3RlbmVyOwotCQlsaXN0ZW5lcnMgPSBuZXdMaXN0OwotCX0KLQkKLQlwcml2YXRlIGludCBmaW5kTGlzdGVuZXIoUGVyZm9ybWFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikKLQkJCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGxpc3QuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGVyZm9ybWFuY2VMaXN0ZW5lcihQZXJmb3JtYW5jZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWludCBpbmRleCA9IGZpbmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmIChpbmRleCAhPSAtMSkgewotCQkJaWYgKGxpc3RlbmVycy5sZW5ndGggPT0gMSkgewotCQkJCWxpc3RlbmVycyA9IG51bGw7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJUGVyZm9ybWFuY2VMaXN0ZW5lcltdIG5ld0xpc3QgPSBuZXcgUGVyZm9ybWFuY2VMaXN0ZW5lcltsaXN0ZW5lcnMubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIDAsIG5ld0xpc3QsIDAsIGluZGV4KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJzLCBpbmRleCsxLCBuZXdMaXN0LCBpbmRleCwgbmV3TGlzdC5sZW5ndGgtaW5kZXgpOwotCQkJbGlzdGVuZXJzID0gbmV3TGlzdDsKLQkJfQotCX0KLQkvKioKLQkgKiBVcGxvYWQgdGhlIHJlc3VsdHMgdG8gdGhlIHNlcnZlci4gVGhpcyBjYXVzZXMgdGhlIGZpbGUgdG8gYmUKLQkgKiBjbG9zZWQsIGFuZCB0aGUgbW9uaXRvciB0byBiZSBwbGFjZWQgaW50byB0aGUgZmluaXNoZWQgc3RhdGUuCi0JICogCi0JICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSB1cGxvYWRob3N0LCB1cGxvYWRwb3J0IGFuZCB1cGxvYWR1c2VyaWQKLQkgKiBoYXZlIGJlZW4gY29uZmlndXJlZCBiZWZvcmUgaGFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gKGl0IGNhbiBiZSBudWxsKQotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwbG9hZChTdHJpbmcgZGVzY3JpcHRpb24pe3JldHVybiBmYWxzZTt9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1ByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyMWNkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLklQZXJmb3JtYW5jZU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLlBlcmZNc3JDb3JlUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHZlcnNpb24gdXNlZCB3aGVuIHRoZSBwZXJmb3JtYW5jZSBwbHVnaW4gaXMgYXZhaWxhYmxlLgotICogCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IgZXh0ZW5kcyBQZXJmb3JtYW5jZU1vbml0b3JVdGlsIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjdXBsb2FkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBsb2FkKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlyZXR1cm4gbW9uaXRvci51cGxvYWQoZGVzY3JpcHRpb24pLnN1Y2Nlc3M7Ci0JfQotCQotCXByaXZhdGUgSVBlcmZvcm1hbmNlTW9uaXRvciBtb25pdG9yOwotCi0JLyoKLQkgKiBTbyB0aGF0IG9ubHkgaW5zdGFudGlhdGVkIGJ5IHRoaXMgcGFja2FnZS4KLQkgKi8KLQlQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yKCkgewotCQltb25pdG9yID0gUGVyZk1zckNvcmVQbHVnaW4uZ2V0UGVyZm9ybWFuY2VNb25pdG9yKHRydWUpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI2lzVmFsaWQoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBtb25pdG9yICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI3NldFZhcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0JCW1vbml0b3Iuc2V0VmFyKHZhcik7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwKSB7Ci0JCW1vbml0b3Iuc25hcHNob3Qoc3RlcCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcykgewotCQltb25pdG9yLnNuYXBzaG90KHN0ZXAsIHR5cGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9SZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZTgyNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogUmVnaXN0cnlSZWFkZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS41ICQkICAkJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NDUgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBDbGFzcyB0byByZWFkIGEgcmVnaXN0cnkuIEl0IGlzIG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBzcGVjaWZpYyBmdW5jdGlvbi4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlTdHJpbmcgcGx1Z2luSWQ7Ci0KLQlTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZDsKLQotCXByaXZhdGUgc3RhdGljIEJ1bmRsZSBzeXN0ZW1CdW5kbGU7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHBsdWdpbiBpZCBvZiBhIGNvbmZpZ3VhdGlvbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb25FbGVtZW50Ci0JICogQHJldHVybiBwbHVnaW4gaWQgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IG51bGw7Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0KLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkKLQkJCQlwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVnaXN0cnlSZWFkZXIgdGFraW5nIGEgcmVnaXN0cnksIHBsdWdpbiBpZCwgYW5kIGV4dGVuc2lvbiBwb2ludCBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiBAcGFyYW0gcGx1Z2luSUQKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBVc2UgUmVnaXN0cnlSZWFkZXIocGx1Z2luLCBleHRlbnNpb25Qb2ludCkgaW5zdGVhZC4gVGhlIHJlZ2lzdHJ5IHBhc3NlZCBpbiBpcyBpZ25vcmVkLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVJlYWRlcihJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBwbHVnaW5JRCwgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXRoaXMocGx1Z2luSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVnaXN0cnlSZWFkZXIgdGFraW5nIHRoZSBwbHVnaW4gaWQgYW5kIGV4dGVuc2lvbiBwb2ludCBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luSUQKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnlSZWFkZXIoU3RyaW5nIHBsdWdpbklELCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklEOwotCQlleHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiByZWNvZ25pemVkID0gdGhpcy5yZWFkRWxlbWVudChlbGVtZW50KTsKLQkJaWYgKCFyZWNvZ25pemVkKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiRXJyb3IgcHJvY2Vzc2luZyBleHRlbnNpb246ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBMb2dzIHRoZSBlcnJvciBpbiB0aGUgZGVza3RvcCBsb2cgdXNpbmcgdGhlIHByb3ZpZGVkIHRleHQgYW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKgotCSAqIExvZ3MgYSB2ZXJ5IGNvbW1vbiByZWdpc3RyeSBlcnJvciB3aGVuIGEgcmVxdWlyZWQgYXR0cmlidXRlIGlzIG1pc3NpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlJlcXVpcmVkIGF0dHJpYnV0ZSAnIiArIGF0dHJpYnV0ZU5hbWUgKyAiJyBub3QgZGVmaW5lZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZWFkIGVsZW1lbnQgYXR0cmlidXRlcy4gSWYgdGhpcyBlbGVtZW50IGhhcyBzdWJlbGVtZW50cywgdGhlIHJlYWRlciB3aWxsIHJlY3Vyc2l2ZWx5IGN5Y2xlIHRocm91Z2ggdGhlbSBhbmQgY2FsbCB0aGlzCi0JICogbWV0aG9kIHNvIGRvbid0IGRvIGl0IGhlcmUuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogUmVhZCB0aGUgZXh0ZW5zaW9uIHBvaW50IGFuZCBwYXJzZSBpdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQpOwotCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaW50ZXJuYWxSZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0byBzZWUgaWYgaXQgaXMgdmFsaWQgYXQgdGhpcyBwb2ludCBpbiB0aW1lIHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGV4dGVuc2lvbi4gQSB2YWxpZCByZWFzb24gbm90IHRvIHdvdWxkIGJlIHRoYXQgdGhlIHdvcmtzcGFjZSBpcwotCSAqIHNodXR0aW5nIGRvbncuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIHZhbGlkIHBvaW50IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoUGxhdGZvcm0uaXNSdW5uaW5nKCkgJiYgZ2V0U3lzdGVtQnVuZGxlKCkuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuU1RPUFBJTkcpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc3lzdGVtIGJ1bmRsZQotCSAqIAotCSAqIEByZXR1cm4gc3lzdGVtIGJ1bmRsZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1bmRsZSBnZXRTeXN0ZW1CdW5kbGUoKSB7Ci0JCWlmIChzeXN0ZW1CdW5kbGUgPT0gbnVsbCkKLQkJCXN5c3RlbUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uub3NnaSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzeXN0ZW1CdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1RpbWVyVGVzdHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9UaW1lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MjRmNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1RpbWVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjAuMgotICovCi1wdWJsaWMgY2xhc3MgVGltZXJUZXN0cyB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IFRpbWVyVGVzdHMgY2xhc3MgdG8gdXNlIHdoZW4gbm90IHVzaW5nIHlvdXIgb3duLiBJdCdzIGEgZ2xvYmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGltZXJUZXN0cyBiYXNpY1Rlc3QgPSBuZXcgVGltZXJUZXN0cygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9QQVJFTlRfSUQgPSAiY3VycmVudCBwYXJlbnQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50UGFyZW50SWQgPSBudWxsOwotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRpbWVyU3RlcCB7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RBUlQgPSAwOwotCQlzdGF0aWMgZmluYWwgaW50IFNUT1AgPSAxOwotCQlzdGF0aWMgZmluYWwgaW50IFNUQVJUX0NVTVVMQVRJVkUgPSAyOwotCQlzdGF0aWMgZmluYWwgaW50IFNUT1BfQ1VNVUxBVElWRSA9IDM7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfQUNDVU1VTEFUSU5HID0gNDsKLQkJc3RhdGljIGZpbmFsIGludCBTVE9QX0FDQ1VNVUxBVElORyA9IDU7Ci0JCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JCXByb3RlY3RlZCBpbnQgdHlwZTsKLQkJcHJvdGVjdGVkIGxvbmcgY3VycmVudFRpbWU7Ci0JCXByb3RlY3RlZCBpbnQgdGhyZWFkSWQ7Ci19Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0T24gPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCBzdGVwczsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydFN0ZXAoU3RyaW5nIGlkKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJVGltZXJTdGVwIHN0ZXAgPSBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVEFSVCk7Ci0JCXJldHVybiBzdGVwICE9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFRpbWVyU3RlcCBjcmVhdGVUaW1lclN0ZXAoU3RyaW5nIGlkLCBpbnQgc3RlcFR5cGUpIHsKLQkJVGltZXJTdGVwIG5ld1N0ZXAgPSBuZXcgVGltZXJTdGVwKCk7Ci0JCW5ld1N0ZXAudGhyZWFkSWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmhhc2hDb2RlKCk7Ci0JCW5ld1N0ZXAuaWQgPSBpZDsKLQkJbmV3U3RlcC50eXBlID0gc3RlcFR5cGU7Ci0JCW5ld1N0ZXAuY3VycmVudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJc3RlcHMuYWRkKG5ld1N0ZXApOwotCi0JCXJldHVybiBuZXdTdGVwOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wU3RlcChTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJVGltZXJTdGVwIHN0ZXAgPSBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVE9QKTsKLQkJcmV0dXJuIHN0ZXAgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRBY2N1bXVsYXRpbmcoU3RyaW5nIGlkKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUQVJUX0FDQ1VNVUxBVElORykgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcEFjY3VtdWxhdGluZyhTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RPUF9BQ0NVTVVMQVRJTkcpICE9IG51bGw7Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydEN1bXVsYXRpdmVTdGVwKFN0cmluZyBpZCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVEFSVF9DVU1VTEFUSVZFKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wQ3VtdWxhdGl2ZVN0ZXAoU3RyaW5nIGlkKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVE9QX0NVTVVMQVRJVkUpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHRlc3RzIHNvIHRoYXQgeW91IGNhbiByZXN0YXJ0IGFuZCBkbyBzb21lIG1vcmUgdGVzdHMuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyVGVzdHMoKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuOwotCQlzdGVwcy5jbGVhcigpOwotCQljdXJyZW50UGFyZW50SWQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFR1cm4gdGhpcyB0ZXN0IG9uLiBJZiBub3QgdHVybmVkIG9uIHRoZW4gYWxsIGNhbGxzIHdpbGwgcXVpY2tseSByZXR1cm4gd2l0aCBubyBlcnJvcnMuIFRoaXMgYWxsb3dzIHRoZSBjb2RlIHRvIHN0YXkgaW4gcGxhY2UgZXZlbiB3aGVuIG5vdAotCSAqIGRlYnVnZ2luZy4KLQkgKiA8cD4KLQkgKiBXaGVuIHR1cm5lZCBvZmYsIGl0IHdpbGwgY2xlYXIgdGhlIHRlc3QuCi0JICogCi0JICogQHBhcmFtIG9uCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHRlc3RTdGF0ZShib29sZWFuIG9uKSB7Ci0JCWlmIChvbiA9PSB0ZXN0T24pCi0JCQlyZXR1cm47Ci0JCWlmIChvbikgewotCQkJdGVzdE9uID0gdHJ1ZTsKLQkJCWlmIChzdGVwcyA9PSBudWxsKQotCQkJCXN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJdGVzdE9uID0gZmFsc2U7Ci0JCQlzdGVwcyA9IG51bGw7Ci0JCX0KLQkJY3VycmVudFBhcmVudElkID0gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VtdWxhdGl2ZUluZm9ybWF0aW9uIHsKLQkJcHVibGljIFRpbWVyU3RlcCBjdXJyZW50Q3VtdWxhdGl2ZVN0ZXA7Ci0JCXB1YmxpYyBsb25nIGN1bVRpbWU7Ci0JCXB1YmxpYyBpbnQgY3VtQ291bnQ7Ci0JCXB1YmxpYyBpbnQgY3VtQ291bnROb25aZXJvOwotCQlwdWJsaWMgbG9uZyBtYXhUaW1lOwotCQlwdWJsaWMgbG9uZyBtaW5UaW1lID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCXB1YmxpYyBsb25nIG1pblRpbWVOb25aZXJvID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwcmludEl0KCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybjsKLQkJaWYgKHN0ZXBzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU1hcCBzdGVwSW5mb0J5VGhyZWFkSWQgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgaW5kZW50c0J5VGhyZWFkSWQgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgY3VtU3RlcHM7Ci0JCVRpbWVyU3RlcCBwcmV2U3RlcCA9IG51bGw7Ci0JCVRpbWVyU3RlcCBzdGFydFN0ZXA7Ci0JCU51bWJlckZvcm1hdCBwZXJjZW50Rm9ybWF0dGVyID0gTnVtYmVyRm9ybWF0LmdldFBlcmNlbnRJbnN0YW5jZSgpOwotCQlkb3VibGUgdG90YWxUaW1lID0gMDsKLQkJU3RyaW5nQnVmZmVyIHN0cmIgPSBuZXcgU3RyaW5nQnVmZmVyKDE1MCk7Ci0JCWlmIChzdGVwcy5zaXplKCkgPiAyKXsKLQkJCXRvdGFsVGltZSA9ICgoVGltZXJTdGVwKXN0ZXBzLmdldChzdGVwcy5zaXplKCktMSkpLmN1cnJlbnRUaW1lIC0gKChUaW1lclN0ZXApc3RlcHMuZ2V0KDApKS5jdXJyZW50VGltZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0ZXBzLnNpemUoKTsgaSsrKSB7Ci0JCQlUaW1lclN0ZXAgc3RlcCA9IChUaW1lclN0ZXApIHN0ZXBzLmdldChpKTsKLQkJCUludGVnZXIgdGhyZWFkSWQgPSBuZXcgSW50ZWdlcihzdGVwLnRocmVhZElkKTsKLQkJCXN3aXRjaCAoc3RlcC50eXBlKSB7Ci0JCQkJY2FzZSBUaW1lclN0ZXAuU1RBUlQ6Ci0JCQkJY2FzZSBUaW1lclN0ZXAuU1RPUDoKLQkJCQkJSW50ZWdlciB0aHJlYWRJbmRlbnQgPSAoSW50ZWdlcikgaW5kZW50c0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaW50IGluZGVudCA9IDA7Ci0JCQkJCWlmIChzdGVwLnR5cGUgPT0gVGltZXJTdGVwLlNUQVJUKSB7Ci0JCQkJCQlpZiAodGhyZWFkSW5kZW50ICE9IG51bGwpCi0JCQkJCQkJaW5kZW50ID0gdGhyZWFkSW5kZW50LmludFZhbHVlKCkgKyAxOwotCQkJCQkJaW5kZW50c0J5VGhyZWFkSWQucHV0KHRocmVhZElkLCBuZXcgSW50ZWdlcihpbmRlbnQpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICh0aHJlYWRJbmRlbnQgIT0gbnVsbCkKLQkJCQkJCQlpbmRlbnQgPSB0aHJlYWRJbmRlbnQuaW50VmFsdWUoKTsKLQkJCQkJCWlmIChpbmRlbnQgPiAwKQotCQkJCQkJCWluZGVudHNCeVRocmVhZElkLnB1dCh0aHJlYWRJZCwgbmV3IEludGVnZXIoaW5kZW50IC0gMSkpOwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaW5kZW50c0J5VGhyZWFkSWQucmVtb3ZlKHRocmVhZElkKTsKLQkJCQkJCQlpbmRlbnQgPSAwOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXN0cmIuc2V0TGVuZ3RoKDApOwotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmN1cnJlbnRUaW1lKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQ7IGorKykgewotCQkJCQkJc3RyYi5hcHBlbmQoIiAgICAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzd2l0Y2ggKHN0ZXAudHlwZSkgewotCQkJCQkJY2FzZSBUaW1lclN0ZXAuU1RBUlQ6Ci0JCQkJCQkJc3RyYi5hcHBlbmQoIlN0YXJ0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQotCQkJCQkJY2FzZSBUaW1lclN0ZXAuU1RPUDoKLQkJCQkJCQlzdHJiLmFwcGVuZCgiU3RvcCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQk7Ci0JCQkJCXN0cmIuYXBwZW5kKCIgXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmlkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlwiICAgaWQoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC50aHJlYWRJZCk7Ci0JCQkJCXN0cmIuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTWFwIHN0YXJ0U3RlcHMgPSAoTWFwKSBzdGVwSW5mb0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaWYgKHN0YXJ0U3RlcHMgPT0gbnVsbCkKLQkJCQkJCXN0ZXBJbmZvQnlUaHJlYWRJZC5wdXQodGhyZWFkSWQsIHN0YXJ0U3RlcHMgPSBuZXcgSGFzaE1hcCgpKTsKLQkJCQkJaWYgKHN0ZXAudHlwZSA9PSBUaW1lclN0ZXAuU1RBUlQpIHsKLQkJCQkJCS8vIFN0b3JlIHRoZSBzdGFydCBzdGVwIGZvciBsYXRlciBsb29rdXAgd2hlbiBjYWx1bGF0aW5nIHRoZSB0b3RhbCB0aW1lCi0JCQkJCQlzdGFydFN0ZXBzLnB1dChzdGVwLmlkLCBzdGVwKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFRoaXMgaXMgdGhlIHN0b3AgdGltZSBmb3IgYSBzdGVwLiBXZSBuZWVkIHRvIGZpbmQKLQkJCQkJCS8vIHRoZSBjb3JyZXNwb25kaW5nIHN0YXJ0IHRpbWUgYW5kIGNhbGN1bGF0ZSB0aGUgdG90YWwgdGltZS4KLQkJCQkJCU9iamVjdCBpdGVtID0gc3RhcnRTdGVwcy5yZW1vdmUoc3RlcC5pZCk7Ci0JCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRpbWVyU3RlcCkgewotCQkJCQkJCXN0YXJ0U3RlcCA9IChUaW1lclN0ZXApIGl0ZW07Ci0JCQkJCQkJaWYgKHN0YXJ0U3RlcCAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBhZGRjaGFycyA9IDEwMCAtIHN0cmIubGVuZ3RoKCk7Ci0JCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYWRkY2hhcnM7IGorKykgewotCQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWxvbmcgZGVsdGEgPSBzdGVwLmN1cnJlbnRUaW1lIC0gc3RhcnRTdGVwLmN1cnJlbnRUaW1lOwotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgIFRvdGFsID0gIiArIGRlbHRhICsgIiBtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJaWYgKHRvdGFsVGltZSA+IDApCi0JCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgIiArIHBlcmNlbnRGb3JtYXR0ZXIuZm9ybWF0KGRlbHRhL3RvdGFsVGltZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfSBlbHNlCi0JCQkJCQkJc3RyYi5hcHBlbmQoIiAgICAtLS0+IENvdWxkbid0IGZpbmQgU3RhcnRpbmcgcG9pbnQgZm9yIFwiIiArIHN0ZXAuaWQgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJaWYgKGkgPiAwICYmIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpID4gMCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gIiArIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpICsgIiBtcyAtLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJcHJldlN0ZXAgPSBzdGVwOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyYik7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBUaW1lclN0ZXAuU1RBUlRfQUNDVU1VTEFUSU5HOgotCQkJCQljdW1TdGVwcyA9IChNYXApIHN0ZXBJbmZvQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpZiAoY3VtU3RlcHMgPT0gbnVsbCkKLQkJCQkJCXN0ZXBJbmZvQnlUaHJlYWRJZC5wdXQodGhyZWFkSWQsIGN1bVN0ZXBzID0gbmV3IEhhc2hNYXAoKSk7Ci0JCQkJCWN1bVN0ZXBzLnB1dChzdGVwLmlkLCBuZXcgQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKCkpOwotCQkJCQl0aHJlYWRJbmRlbnQgPSAoSW50ZWdlcikgaW5kZW50c0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaW5kZW50ID0gMDsKLQkJCQkJaWYgKHRocmVhZEluZGVudCAhPSBudWxsKQotCQkJCQkJaW5kZW50ID0gdGhyZWFkSW5kZW50LmludFZhbHVlKCk7Ci0JCQkJCXN0cmIuc2V0TGVuZ3RoKDApOwotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmN1cnJlbnRUaW1lKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQ7IGorKykgewotCQkJCQkJc3RyYi5hcHBlbmQoIiAgICAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzdHJiLmFwcGVuZCgiU3RhcnQgQWNjdW11bGF0aW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoIiBcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuaWQpOwotCQkJCQlzdHJiLmFwcGVuZCgiXCIgICBpZCgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLnRocmVhZElkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaSA+IDAgJiYgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgPiAwKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLSAiICsgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgKyAiIG1zIC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlwcmV2U3RlcCA9IHN0ZXA7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJiKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIFRpbWVyU3RlcC5TVEFSVF9DVU1VTEFUSVZFOgotCQkJCQljdW1TdGVwcyA9IChNYXApIHN0ZXBJbmZvQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpZiAoY3VtU3RlcHMgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IGluZm8gPSBjdW1TdGVwcy5nZXQoc3RlcC5pZCk7Ci0JCQkJCQlpZiAoaW5mbyBpbnN0YW5jZW9mIEN1bXVsYXRpdmVJbmZvcm1hdGlvbikKLQkJCQkJCQkoKEN1bXVsYXRpdmVJbmZvcm1hdGlvbikgaW5mbykuY3VycmVudEN1bXVsYXRpdmVTdGVwID0gc3RlcDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBUaW1lclN0ZXAuU1RPUF9DVU1VTEFUSVZFOgotCQkJCQljdW1TdGVwcyA9IChNYXApIHN0ZXBJbmZvQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpZiAoY3VtU3RlcHMgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IGluZm8gPSBjdW1TdGVwcy5nZXQoc3RlcC5pZCk7Ci0JCQkJCQlpZiAoaW5mbyBpbnN0YW5jZW9mIEN1bXVsYXRpdmVJbmZvcm1hdGlvbikgewotCQkJCQkJCUN1bXVsYXRpdmVJbmZvcm1hdGlvbiBjdW1JbmZvID0gKEN1bXVsYXRpdmVJbmZvcm1hdGlvbikgaW5mbzsKLQkJCQkJCQlpZiAoY3VtSW5mby5jdXJyZW50Q3VtdWxhdGl2ZVN0ZXAgIT0gbnVsbCkgewotCQkJCQkJCQljdW1JbmZvLmN1bUNvdW50Kys7Ci0JCQkJCQkJCWxvbmcgZGVsdGEgPSBzdGVwLmN1cnJlbnRUaW1lIC0gY3VtSW5mby5jdXJyZW50Q3VtdWxhdGl2ZVN0ZXAuY3VycmVudFRpbWU7Ci0JCQkJCQkJCWN1bUluZm8uY3VtVGltZSArPSBkZWx0YTsKLQkJCQkJCQkJaWYgKGN1bUluZm8ubWF4VGltZSA8IGRlbHRhKQotCQkJCQkJCQkJY3VtSW5mby5tYXhUaW1lID0gZGVsdGE7Ci0JCQkJCQkJCWlmIChkZWx0YSA8IGN1bUluZm8ubWluVGltZSkKLQkJCQkJCQkJCWN1bUluZm8ubWluVGltZSA9IGRlbHRhOwotCQkJCQkJCQlpZiAoZGVsdGEgIT0gMCkgewotCQkJCQkJCQkJY3VtSW5mby5jdW1Db3VudE5vblplcm8rKzsKLQkJCQkJCQkJCWlmIChkZWx0YSA8IGN1bUluZm8ubWluVGltZU5vblplcm8pCi0JCQkJCQkJCQkJY3VtSW5mby5taW5UaW1lTm9uWmVybyA9IGRlbHRhOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIFRpbWVyU3RlcC5TVE9QX0FDQ1VNVUxBVElORzoKLQkJCQkJdGhyZWFkSW5kZW50ID0gKEludGVnZXIpIGluZGVudHNCeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWluZGVudCA9IDA7Ci0JCQkJCWlmICh0aHJlYWRJbmRlbnQgIT0gbnVsbCkKLQkJCQkJCWluZGVudCA9IHRocmVhZEluZGVudC5pbnRWYWx1ZSgpOwotCQkJCQlzdHJiLnNldExlbmd0aCgwKTsKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC5jdXJyZW50VGltZSk7Ci0JCQkJCXN0cmIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKLQkJCQkJCXN0cmIuYXBwZW5kKCIgICAgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc3RyYi5hcHBlbmQoIlN0b3AgIEFjY3VtdWxhdGluZyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKCIgXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmlkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlwiICAgaWQoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC50aHJlYWRJZCk7Ci0JCQkJCXN0cmIuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY3VtU3RlcHMgPSAoTWFwKSBzdGVwSW5mb0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaWYgKGN1bVN0ZXBzICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBpbmZvID0gY3VtU3RlcHMuZ2V0KHN0ZXAuaWQpOwotCQkJCQkJaWYgKGluZm8gaW5zdGFuY2VvZiBDdW11bGF0aXZlSW5mb3JtYXRpb24pIHsKLQkJCQkJCQlDdW11bGF0aXZlSW5mb3JtYXRpb24gY3VtSW5mbyA9IChDdW11bGF0aXZlSW5mb3JtYXRpb24pIGluZm87Ci0JCQkJCQkJaWYgKGN1bUluZm8uY3VycmVudEN1bXVsYXRpdmVTdGVwICE9IG51bGwpIHsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIGN1bXVsYXRpdmUgdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLmN1bVRpbWUpOwotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgY3VtdWxhdGl2ZSBjb3VudD0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLmN1bUNvdW50KTsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIG1heCB0aW1lPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8ubWF4VGltZSk7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBtaW4gdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLm1pblRpbWUpOwotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgYXZnIHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJc3RyYi5hcHBlbmQoKChkb3VibGUpIGN1bUluZm8uY3VtVGltZSkvY3VtSW5mby5jdW1Db3VudCk7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBOb25aZXJvIHRpbWVzOiBjdW11bGF0aXZlIH4wIGNvdW50PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8uY3VtQ291bnROb25aZXJvKTsKLQkJCQkJCQkJaWYgKGN1bUluZm8uY3VtQ291bnROb25aZXJvICE9IDApIHsKLQkJCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBtaW4gfjAgdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5taW5UaW1lTm9uWmVybyk7Ci0JCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgYXZnIH4wIHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXN0cmIuYXBwZW5kKCgoZG91YmxlKSBjdW1JbmZvLmN1bVRpbWUpIC8gY3VtSW5mby5jdW1Db3VudE5vblplcm8pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChpID4gMCAmJiAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSA+IDApCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tICIgKyAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSArICIgbXMgLS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXByZXZTdGVwID0gc3RlcDsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0cmIpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSUNvbnRleHREZXRlcm1pbmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTU1ODgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSUNvbnRleHREZXRlcm1pbmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNSAkJCAgJCREYXRlOiAyMDA3LzA0LzEwIDAxOjA5OjM2ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotLyoqCi0gKiBTdGF0aWMgdXRpbGl0eSBjbGFzcyBmb3IgVUlDb250ZXh0IGRldGVybWluYXRpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDEwMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURMRVNTX0NPTlRFWFRfTElURVJBTCA9ICJIZWFkbGVzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfTElURVJBTCA9ICJVSSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURMRVNTX0NPTlRFWFQgPSAxMDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSV9DT05URVhUID0gMTAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNhY2hlZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGN1cnJlbnRDb250ZXh0ID0gVU5LTk9XTjsKLQotCXByaXZhdGUgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gY2xhc3MgYmFzZWQgb24gdGhlIFVJIG9yIEhlYWRsZXNzIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4gbmV3IGNsYXNzIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4ga2V5LgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIGtleSBpcyBpbnZhbGlkIChlLmcuIG5vIGV4dGVuc2lvbiBpcyBmb3VuZCBmb3IgdGhlIGtleSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVJbnN0YW5jZShTdHJpbmcga2V5KSB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAoY2FjaGVkRXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJaW5pdEV4dGVuc2lvbnMoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbnRleHRTZW5zaXRpdmVDbGFzcyA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGNhY2hlZEV4dGVuc2lvbnMuZ2V0KGtleSk7Ci0JCXRyeSB7Ci0JCQlpZiAoY29udGV4dFNlbnNpdGl2ZUNsYXNzICE9IG51bGwpCi0JCQkJcmVzdWx0ID0gY29udGV4dFNlbnNpdGl2ZUNsYXNzCi0JCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihVSUNvbnRleHREZXRlcm1pbmF0aW9uUmVnaXN0cnlSZWFkZXIuVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19DTEFTU05BTUVfQVRUUik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJQcm9ibGVtIGxvYWRpbmcgZXh0ZW5zaW9uIG5vdCBmb3VuZCBmb3Iga2V5IFwiIiArIGtleSArICJcIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFeHRlbnNpb24gbm90IGZvdW5kIGZvciBrZXkgXCIiICsga2V5ICsgIlwiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRleHQgLS0gZGV0ZXJtaW5lcyB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gY3VycmVudCBjb250ZXh0Ci0JICogQHNlZSAjSEVBRExFU1NfQ09OVEVYVAotCSAqIEBzZWUgI1VJX0NPTlRFWFQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRDdXJyZW50Q29udGV4dCgpIHsKLQkJaWYgKGN1cnJlbnRDb250ZXh0ID09IFVOS05PV04pIHsKLQkJCWN1cnJlbnRDb250ZXh0ID0gSEVBRExFU1NfQ09OVEVYVDsKLQkJCW5ldyBVSVRlc3RlclJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnRDb250ZXh0OwotCX0KLQotCS8qCi0JICogSW52b2tlcyB0aGUgVUlDb250ZXh0RGV0ZXJtaW5hdGlvblJlZ2lzdHJ5UmVhZGVyIHRvIGNhY2hlIGFsbCBvZiB0aGUgZXh0ZW5zaW9ucywgaWYgbmVjZXNzYXJ5LgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRFeHRlbnNpb25zKCkgewotCQlpZiAoY2FjaGVkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQljYWNoZWRFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCW5ldyBVSUNvbnRleHREZXRlcm1pbmF0aW9uUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCX0KLQotCS8qCi0JICogQ29udmVydHMgdGhlIGlucHV0IHRvIG9uZSBvZiBVSV9DT05URVhUIG9yIEhFQURMRVNTX0NPTlRFWFQuIERlZmF1bHRzIHRvIEhFQURMRVNTIG9uIGludmFsaWQgaW5wdXQKLQkgKiAKLQkgKiBAcGFyYW0gbGl0ZXJhbCBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbnZlcnRMaXRlcmFsKFN0cmluZyBsaXRlcmFsKSB7Ci0JCXJldHVybiAoVUlfQ09OVEVYVF9MSVRFUkFMLmVxdWFscyhsaXRlcmFsKSkgPyBVSV9DT05URVhUIDogSEVBRExFU1NfQ09OVEVYVDsKLQl9Ci0KLQkvKgotCSAqIFJlYWRzIHRoZSByZWdpc3RyYXRpb24gb2YgVUkgQ29udGV4dC1zZW5zaXRpdmUgY2xhc3MgZXh0ZW5zaW9ucyBhbmQgaW5pdGlhbGl6ZXMgdGhlIGNhY2hlIG9mIHRoZSBVSUNvbnRleHREZXRlcm1pbmF0aW9uIG9iamVjdC4KLQkgKiAKLQkgKiBAYXV0aG9yIG1kZWxkZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBVSUNvbnRleHREZXRlcm1pbmF0aW9uUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19FTEVNRU5UID0gInVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfS0VZX0FUVFIgPSAia2V5IjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfQ0xBU1NOQU1FX0FUVFIgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfQ09OVEVYVF9BVFRSID0gImNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlcigpIHsKLQkJCXN1cGVyKEpFTVV0aWxQbHVnaW4uUExVR0lOX0lELCBKRU1VdGlsUGx1Z2luLlVJX0NPTlRFWFRfRVhURU5TSU9OX1BPSU5UKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0VMRU1FTlQpKSB7Ci0KLQkJCQlTdHJpbmcga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19LRVlfQVRUUik7Ci0JCQkJU3RyaW5nIGNvbnRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0NPTlRFWFRfQVRUUik7Ci0KLQkJCQlpZiAoIWNhY2hlZEV4dGVuc2lvbnMuY29udGFpbnNLZXkoa2V5KSB8fCBnZXRDdXJyZW50Q29udGV4dCgpID09IGNvbnZlcnRMaXRlcmFsKGNvbnRleHQpKQotCQkJCQljYWNoZWRFeHRlbnNpb25zLnB1dChrZXksIGVsZW1lbnQpOwotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZWFkcyB0aGUgdWlUZXN0ZXIgZXh0ZW5zaW9uIGFuZCBpbnN0YW50aWF0ZSB0aGUgYW55IG9mIHRoZSBVSVRlc3RlciBjbGFzc2VzIGl0IGZpbmRzLgotCSAqIAotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IHRoYXQgaWYgbXVsdGlwbGUgVUlUZXN0ZXJzIGFyZSByZWdpc3RlcmVkLCBhbnkgb2YgdGhlbSBjYW4gdHJpcCB0aGUgY3VycmVudENvbnRleHQgaW50byB0aGUgVUlfQ09OVEVYVAotCSAqIHN0YXRlLgotCSAqIAotCSAqIEBhdXRob3IgbWRlbGRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFVJVGVzdGVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0VMRU1FTlQgPSAidWlUZXN0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0NMQVNTTkFNRV9BVFRSID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgVUlUZXN0ZXJSZWdpc3RyeVJlYWRlcigpIHsKLQkJCXN1cGVyKEpFTVV0aWxQbHVnaW4uUExVR0lOX0lELCBKRU1VdGlsUGx1Z2luLlVJX1RFU1RFUl9FWFRFTlNJT05fUE9JTlQpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVUlfVEVTVEVSX0VMRU1FTlQpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl0cnkgewotCQkJCQkvLyBEb24ndCBib3RoZXIgcnVubmluZyB0ZXN0ZXIgaXQgaWYgd2UgYWxyZWFkeSBwcm9jZXNzZWQgb25lIGV4dGVuc2lvbiB0aGF0IHJldHVybmVkIHRydWUuCi0JCQkJCWlmIChjdXJyZW50Q29udGV4dCAhPSBVSV9DT05URVhUICYmIGNhbkNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCkpIHsKLQkJCQkJCVVJVGVzdGVyIHRlc3RlciA9IChVSVRlc3RlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFVJX1RFU1RFUl9DTEFTU05BTUVfQVRUUik7Ci0JCQkJCQlpZiAodGVzdGVyLmlzQ3VycmVudENvbnRleHRVSSgpKQotCQkJCQkJCWN1cnJlbnRDb250ZXh0ID0gVUlfQ09OVEVYVDsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coIlVJQ29udGV4dERldGVybWluYXRpb24gaXMgcHJvY2VlZGluZyBpbiBIRUFETEVTUyBtb2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJVGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NTE3ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBVSVRlc3Rlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgVUlUZXN0ZXIuIFRoZSAiY2xhc3NuYW1lIiBhdHRyaWJ1dGUgb24gdGhlICJ1aVRlc3RlciIgZXh0ZW5zaW9uIHBvaW50IHNob3VsZCBpbXBsZW1lbnQgdGhpcyBjbGFzcy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVUlUZXN0ZXIgewotCi0JLyoqCi0JICogQW5zd2VyIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgYW4gVUkgY29udGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuIFVJIGNvbnRleHQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDdXJyZW50Q29udGV4dFVJKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEJhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHRCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGZmNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IEVNRldvcmtiZW5jaENvbnRleHRCYXNlLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotLyoqCi0gKiBDb250ZXh0QmFzZSBmb3IgRU1GV29ya2JlbmNoLgotICogCi0gKiA8cD4KLSAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCBhcyBuZWVkZWQgZm9yIGFkZGl0aW9uYWwgb3Igb3ZlcnJpZGUgZnVuY3Rpb24uIEl0IHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IGRlZmF1bHQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgewotCi0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgUHJvamVjdFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMSIpKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9qZWN0ID0gYVByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSBvZiB0aGUgY29udGV4dCBiYXNlLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKQotCQkJcmVzb3VyY2VTZXQucmVsZWFzZSgpOwotCQlyZXNvdXJjZVNldCA9IG51bGw7Ci0JCXByb2plY3QgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCB0aGlzIGNvbnRleHQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIEByZXR1cm4gcHJvamVjdAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHNldCAoY3JlYXRpbmcgaWYgbmVlZGVkKSBmb3IgY29udGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHJlc291cmNlIHNldAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBQcm9qZWN0UmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVNldCA9IGNyZWF0ZVJlc291cmNlU2V0KCk7Ci0JCQlpbml0aWFsaXplUmVzb3VyY2VTZXQocmVzb3VyY2VTZXQpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGZvciBvcHRpbWl6YXRpb247IGFuc3dlciB3aGV0aGVyIGEgcmVzb3VyY2VTZXQgaGFzIGJlZW4gY3JlYXRlZAotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSByZXNvdXJjZSBzZXQgaGFzIGJlZW4gY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIHJlc291cmNlU2V0ICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VTZXQoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQljcmVhdGVSZXNvdXJjZVNldFN5bmNocm9uaXplcihhUmVzb3VyY2VTZXQpOwotCQlhUmVzb3VyY2VTZXQuc2V0VVJJQ29udmVydGVyKGNyZWF0ZVVSSUNvbnZlcnRlcihhUmVzb3VyY2VTZXQpKTsKLQkJYVJlc291cmNlU2V0LmFkZChuZXcgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyKCkpOwotCQlKRU1VdGlsUGx1Z2luLmdldERlZmF1bHQoKS5hZGRFeHRlbmRlZFJlc291cmNlSGFuZGxlcnMoYVJlc291cmNlU2V0KTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcmVzb3VyY2Ugc2V0LiBCeSBkZWZhdWx0IGl0IGlzIGEgUHJvamVjdFJlc291cmNlU2V0SW1wbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHByb2plY3QncyBuZXcgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXQgY3JlYXRlUmVzb3VyY2VTZXQoKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsKHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIFVSSUNvbnZlcnRlciBmb3IgdGhlIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICogQHJldHVybiBhIHVyaSBjb252ZXJ0ZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFdvcmtiZW5jaFVSSUNvbnZlcnRlciBjcmVhdGVVUklDb252ZXJ0ZXIoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlyZXR1cm4gbmV3IFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoZ2V0UHJvamVjdCgpLCBhUmVzb3VyY2VTZXQuZ2V0U3luY2hyb25pemVyKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHJlc291cmNlIHNldCB3b3JrYmVuY2ggc3luY2hyb25pemVyLgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcmV0dXJuIGEgcmVzb3VyY2Ugc2V0IHdvcmtiZW5jaCBzeW5jaHJvbml6ZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGNyZWF0ZVJlc291cmNlU2V0U3luY2hyb25pemVyKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVN5bmNocm9uaXplcihhUmVzb3VyY2VTZXQsIGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlkZWxldGVGaWxlKGFSZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRmlsZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCByZXNvdXJjZSAod2l0aCB0aGUgZ2l2ZW4gVVJJKSBmcm9tIHRoZSBwcm9qZWN0IHJlc291cmNlIHNldC4gTG9hZCBpdCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gcmVzb3VyY2UgZm9yIHRoZSB1cmksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0ZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9GbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIzMWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0ZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0IGV4dGVuZHMgUHJvamVjdFJlc291cmNlU2V0IHsKLQkKLQkKLQkvKioKLQkgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHJlc29sdmVkIGJ5IHRoZSBVUkkuCi0JICAgKiA8cD4KLQkgICAqIEEgcmVzb3VyY2Ugc2V0IGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5IAotCSAgICogaW4gb3JkZXIgdG8gcmVzb2x2ZSB0aGUgZ2l2ZW4gVVJJIHRvIGEgcmVzb3VyY2UuCi0JICAgKiBGaXJzdCBpdCB1c2VzIGl0J3Mge0BsaW5rICNnZXRVUklDb252ZXJ0ZXIgVVJJIGNvbnZlcnRlcn0gdG8ge0BsaW5rIFVSSUNvbnZlcnRlciNub3JtYWxpemUgbm9ybWFsaXplfSB0aGUgVVJJIAotCSAgICogYW5kIHRoZW4gdG8gY29tcGFyZSBpdCB3aXRoIHRoZSBub3JtYWxpemVkIFVSSSBvZiBlYWNoIHJlc291cmNlOwotCSAgICogaWYgaXQgZmluZHMgYSBtYXRjaCwgCi0JICAgKiB0aGF0IHJlc291cmNlIGJlY29tZXMgdGhlIHJlc3VsdC4KLQkgICAqIEZhaWxpbmcgdGhhdCwKLQkgICAqIGl0IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVsZWdhdGVkR2V0UmVzb3VyY2UgZGVsZWdhdGVzfSAKLQkgICAqIHRvIGFsbG93IHRoZSBVUkkgdG8gYmUgcmVzb2x2ZWQgZWxzZXdoZXJlLgotCSAgICogRm9yIGV4YW1wbGUsIAotCSAgICogdGhlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkjSU5TVEFOQ0UgcGFja2FnZSByZWdpc3RyeX0KLQkgICAqIGlzIHVzZWQgdG8ge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSNnZXRFUGFja2FnZSByZXNvbHZlfSAKLQkgICAqIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlIG5hbWVzcGFjZSBVUkl9IG9mIGEgcGFja2FnZQotCSAgICogdG8gdGhlIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGF0IHBhY2thZ2UuCi0JICAgKiBTbyB0aGUgaW1wb3J0YW50IHBvaW50IGlzIHRoYXQgYW4gYXJiaXRyYXJ5IGltcGxlbWVudGF0aW9uIG1heSByZXNvbHZlIHRoZSBVUkkgdG8gYW55IHJlc291cmNlLAotCSAgICogbm90IG5lY2Vzc2FyaWx5IHRvIG9uZSBjb250YWluZWQgYnkgdGhpcyBwYXJ0aWN1bGFyIHJlc291cmNlIHNldC4KLQkgICAqIElmIHRoZSBkZWxlZ2F0aW9uIHN0ZXAgZmFpbHMgdG8gcHJvdmlkZSBhIHJlc3VsdCwKLQkgICAqIGFuZCBpZiA8Y29kZT5sb2FkT25EZW1hbmQ8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LAotCSAgICogYSByZXNvdXJjZSBpcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZENyZWF0ZVJlc291cmNlIGNyZWF0ZWR9IAotCSAgICogYW5kIHRoYXQgcmVzb3VyY2UgYmVjb21lcyB0aGUgcmVzdWx0LgotCSAgICogSWYgPGNvZGU+bG9hZE9uRGVtYW5kPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPgotCSAgICogYW5kIHRoZSByZXN1bHQgcmVzb3VyY2UgaXMgbm90IHtAbGluayBSZXNvdXJjZSNpc0xvYWRlZCBsb2FkZWR9LCAKLQkgICAqIGl0IHdpbGwgYmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNkZW1hbmRMb2FkIGxvYWRlZH0gYmVmb3JlIGl0IGlzIHJldHVybmVkLgotCSAgICogPC9wPgotCSAgICogQHBhcmFtIHVyaSB0aGUgVVJJIHRvIHJlc29sdmUuCi0JICAgKiBAcGFyYW0gbG9hZE9uRGVtYW5kIHdoZXRoZXIgdG8gY3JlYXRlIGFuZCBsb2FkIHRoZSByZXNvdXJjZSwgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0cy4KLQkgICAqIEBwYXJhbSByZWdpc3RlcmVkRmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIHJlc291cmNlIGlmIG5lZWRlZCAKLQkgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIHJlc29sdmVkIGJ5IHRoZSBVUkksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzbid0IG9uZSBhbmQgaXQncyBub3QgYmVpbmcgZGVtYW5kIGxvYWRlZC4KLQkgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiBhIHJlc291cmNlIGNhbid0IGJlIGRlbWFuZCBjcmVhdGVkLgotCSAgICogQHRocm93cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBkZW1hbmQgbG9hZC4KLQkgICAqIEBzaW5jZSAyLjEKLQkgICAqLwotCQotCVJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kLCBGYWN0b3J5IHJlZ2lzdGVyZWRGYWN0b3J5KTsKLQkKLQkvKioKLQkgICAqIENyZWF0ZXMgYSBuZXcgcmVzb3VyY2UsIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLCBhbmQgcmV0dXJucyBpdC4KLQkgICAqIDxwPgotCSAgICogSXQgZGVsZWdhdGVzIHRvIHRoZSByZXNvdXJjZSBmYWN0b3J5IHtAbGluayAjZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnl9IAotCSAgICogdG8gZGV0ZXJtaW5lIHRoZSB7QGxpbmsgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSNnZXRGYWN0b3J5IGNvcnJlY3R9IGZhY3RvcnksCi0JICAgKiBhbmQgdGhlbiBpdCB1c2VzIHRoYXQgZmFjdG9yeSB0byB7QGxpbmsgUmVzb3VyY2UuRmFjdG9yeSNjcmVhdGVSZXNvdXJjZSBjcmVhdGV9IHRoZSByZXNvdXJjZQotCSAgICogYW5kIGFkZCBpdCB0byB0aGUge0BsaW5rICNnZXRSZXNvdXJjZXMgY29udGVudHN9LgotCSAgICogSWYgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCBmYWN0b3J5LCA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkOwotCSAgICogd2hlbiBydW5uaW5nIHdpdGhpbiBFY2xpcHNlLAotCSAgICogYSBkZWZhdWx0IFhNSSBmYWN0b3J5IHdpbGwgYmUgcmVnaXN0ZXJlZCwKLQkgICAqIGFuZCB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAgICogPC9wPgotCSAgICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSByZXNvdXJjZSB0byBjcmVhdGUuCi0JICAgKiBAcGFyYW0gcmVzb3VyY2VGYWN0b3J5IAotCSAgICogQHJldHVybiBhIG5ldyByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZmFjdG9yeSBpcyByZWdpc3RlcmVkLgotCSAgICovCi0JCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSUVNRkNvbnRleHRDb250cmlidXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSUVNRkNvbnRleHRDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjVkN2ZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0lFTUZDb250ZXh0Q29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogSUVNRkNvbnRleHRDb250cmlidXRvci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLS8qKgotICogRU1GIENvbnRleHQgQ29udHJpYnV0b3IgaW50ZXJmYWNlLiBJbXBsaW1lbnRlcnMgYXJlIGNhbGxlZCB0byBjb250cmlidXRlIHRvIHRoZSBjb250ZXh0LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlI2NyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QsIElFTUZDb250ZXh0Q29udHJpYnV0b3IpCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRU1GQ29udGV4dENvbnRyaWJ1dG9yIHsKLQotCS8qKgotCSAqIFRoaXMgaXMgeW91ciBvcHBvcnR1bml0eSB0byBhZGQgYSBwcmltYXJ5IEVNRk5hdHVyZS4gVHlwaWNhbGx5IHlvdSB3b3VsZCBhZGQgdG8gdGhlIFdvcmtiZW5jaENvbnRleHQgaGVsZCBieSA8Y29kZT5hTmF0dXJlPC9jb2RlPiBpbiBvcmRlciB0bwotCSAqIGNoYW5nZSB0aGUgY29udGFpbmVyIGZvciB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyIG9yIGFkZCBhZGFwdGVyIGZhY3RvcmllcyB0byB0aGUgUmVzb3VyY2VTZXQgb3IgYW55dGhpbmcgZWxzZSB0aGF0IGlzIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgcHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHlvdXIgb3Bwb3J0dW5pdHkgdG8gYWRkIGEgc2Vjb25kYXJ5IEVNRk5hdHVyZS4gVHlwaWNhbGx5IHlvdSB3b3VsZCBhZGQgdG8gdGhlIFdvcmtiZW5jaENvbnRleHQgaGVsZCBieSA8Y29kZT5hTmF0dXJlPC9jb2RlPiBpbiBvcmRlcgotCSAqIHRvIGNoYW5nZSB0aGUgY29udGFpbmVyIGZvciB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyIG9yIGFkZCBhZGFwdGVyIGZhY3RvcmllcyB0byB0aGUgUmVzb3VyY2VTZXQgb3IgYW55dGhpbmcgZWxzZSB0aGF0IGlzIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgc2Vjb25kYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBhTmF0dXJlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0lTeW5jaHJvbml6ZXJFeHRlbmRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSVN5bmNocm9uaXplckV4dGVuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MGRkMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSVN5bmNocm9uaXplckV4dGVuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IElTeW5jaHJvbml6ZXJFeHRlbmRlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci0KLS8qKgotICogSW1wbGltZW50ZXJzIGFsbG93cyBjbGllbnRzLCBlZyB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZOYXR1cmVDb250cmlidXRvcn0sIHRvIGV4dGVuZCB0aGUgYmVoYXZpb3Igb2YgdGhlCi0gKiBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyI2FkZEV4dGVuZGVyKElTeW5jaHJvbml6ZXJFeHRlbmRlcikKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTeW5jaHJvbml6ZXJFeHRlbmRlciB7Ci0KLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdGhhdCBwcm9qZWN0IGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgcHJvamVjdENoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgcHJvamVjdCBoYXMgYmVlbiBjbG9zZWQuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBwcm9qZWN0Q2xvc2VkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFJlc291cmNlU2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5NzY5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFByb2plY3RSZXNvdXJjZVNldC5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjUgJCQgICQkRGF0ZTogMjAwNy8wOC8zMCAwMjozNzowNSAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotLyoqCi0gKiBBIFJlc291cmNlU2V0IGZvciBhbiBlbnRpcmUgcHJvamVjdC4gSXQgYWxsb3dzIHNoYXJpbmcgb2YgcmVzb3VyY2VzIGZyb20gbXVsdGlwbGUgZWRpdG9ycy92aWV3ZXJzIGZvciBhIHByb2plY3QuCi0gKiA8cD4KLSAqIEFuIGFkZGl0aW9uYWwgTm90aWZpY2F0aW9uIHR5cGUgaXMgc2VudCBvdXQgYnkgUHJvamVjdFJlc291cmNlU2V0J3Mgb2YgcHJvamVjdCByZXNvdXJjZSBzZXQgYWJvdXQgdG8gYmUgcmVsZWFzZWQuIEEgcmVsZWFzZSBpcwotICogY2FsbGVkIHdoZW4gcHJvamVjdHMgYXJlIGFib3V0IHRvIGJlIGNsb3NlZC4gVGhleSByZWxlYXNlIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGFuZCB1bmxvYWQgdGhlbS4gVGhpcyBub3RpZmljYXRpb24gY2FuIGJlIHVzZWQgCi0gKiB0byBrbm93IHRoYXQgdGhpcyBpcyBhYm91dCB0byBoYXBwZW4gYW5kIHRvIGRvIHNvbWV0aGluZyBiZWZvcmUgdGhlIHJlc291cmNlcyBiZWNvbWUgaW52YWxpZC4gSXQgd2lsbCBiZSBzZW50IG91dCBqdXN0IGJlZm9yZSB0aGUKLSAqIHJlc291cmNlIHNldCB3aWxsIGJlIHJlbGVhc2VkLiAKLSAqIAotICogQHNlZSBQcm9qZWN0UmVzb3VyY2VTZXQjU1BFQ0lBTF9OT1RJRklDQVRJT05fVFlQRQotICogQHNlZSBQcm9qZWN0UmVzb3VyY2VTZXQjUFJPSkVDVFJFU09VUkNFU0VUX0FCT1VUX1RPX1JFTEVBU0VfSUQgCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFByb2plY3RSZXNvdXJjZVNldCBleHRlbmRzIFJlc291cmNlU2V0IHsKLQotCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdHlwZSBpbiBub3RpZmljYXRpb25zIGZyb20gdGhlIFByb2plY3RSZXNvdXJjZVNldCBmb3IKLQkgKiBzcGVjaWFsIG5vdGlmaWNhdGlvbnMsIGFuZCBub3QgdGhlIHN0YW5kYXJkIG9uZXMgZnJvbSBSZXNvdXJjZVNldC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiNnZXRFdmVudFR5cGUoKQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXN0YXRpYyBpbnQgU1BFQ0lBTF9OT1RJRklDQVRJT05fVFlQRSA9IE5vdGlmaWNhdGlvbi5FVkVOVF9UWVBFX0NPVU5UKzQ7Ci0JCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIEZlYXR1cmUgSUQgZm9yIHJlc291cmNlIHNldCBhYm91dCB0byBiZSByZWxlYXNlZC4KLQkgKiBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiNnZXRGZWF0dXJlSUQoamF2YS5sYW5nLkNsYXNzKX0gdG8KLQkgKiBnZXQgdGhpcyBpZC4gVGhlIGdldEZlYXR1cmUoKSBvbiBub3RpZmljYXRpb24gd2lsbCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlzdGF0aWMgaW50IFBST0pFQ1RSRVNPVVJDRVNFVF9BQk9VVF9UT19SRUxFQVNFX0lEID0gMTAwMDsKLQotCS8qKgotCSAqIENhbGwgd2hlbiB0aGUgUmVzb3VyY2VTZXQgaXMgbm8gbG9uZ2VyIHRvIGJlIHVzZWQuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCByZWxlYXNlKCk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIDxjb2RlPnJlc291cmNlSGFuZGxlcjwvY29kZT4gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiByZXNvdXJjZUhhbmRsZXJzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUhhbmRsZXIKLQkgKiAgICAgICAgICAgIElSZXNvdXJjZUhhbmRsZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IHdhcyBhZGRlZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlib29sZWFuIGFkZChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgPGNvZGU+cmVzb3VyY2VIYW5kbGVyPC9jb2RlPiB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3Qgb2YgcmVzb3VyY2VIYW5kbGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VIYW5kbGVyCi0JICogICAgICAgICAgICBJUmVzb3VyY2VIYW5kbGVyCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBhZGRGaXJzdChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgPGNvZGU+cmVzb3VyY2VIYW5kbGVyPC9jb2RlPiBmcm9tIHRoZSBsaXN0IG9mIHJlc291cmNlSGFuZGxlcnMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlSGFuZGxlcgotCSAqICAgICAgICAgICAgSVJlc291cmNlSGFuZGxlcgotCSAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gdHJ1ZSBpZiBpdCB3YXMgcmVtb3ZlZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlib29sZWFuIHJlbW92ZShSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVzb3VyY2VTZXQgc3luY2hyb25pemVyIHRoYXQgd2lsbCBzeW5jaHJvbml6ZSB0aGUgUmVzb3VyY2VTZXQgd2l0aCBjaGFuZ2VzIGZyb20gdGhlIFdvcmtiZW5jaC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgZ2V0U3luY2hyb25pemVyKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIFJlc291cmNlU2V0IHN5bmNocm9uaXplciB0aGF0IHdpbGwgc3luY2hyb25pemUgdGhlIFJlc291cmNlU2V0IHdpdGggY2hhbmdlcyBmcm9tIHRoZSBXb3JrYmVuY2guCi0JICogCi0JICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKLQkgKiBAcmV0dXJuIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBzZXRTeW5jaHJvbml6ZXIoUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcik7Ci0KLQkvKioKLQkgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgY2xpZW50cyB3aGVuZXZlciB0aGUgc3RydWN0dXJlIG9mIHRoZSBwcm9qZWN0IGNoYW5nZXMgc3VjaCB0aGF0IGFueSBjYWNoZWQgVVJJcyB3aWxsIGJlIGludmFsaWQuIEZvciBleGFtcGxlLCBpZiB0aGUKLQkgKiBzb3VyY2UgZm9sZGVycyB3aXRoaW4gdGhlIFVSSUNvbnZlcnRlciBjaGFuZ2UuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCByZXNldE5vcm1hbGl6ZWRVUklDYWNoZSgpOwotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTJlODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogUHJvamVjdFV0aWxpdGllcy5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjYgJCQgICQkRGF0ZTogMjAwOC8wMy8wNSAxOTo0MzoxOCAkJCAKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0KLS8qKgotICogRU1GIFdvcmtiZW5jaCBQcm9qZWN0IFV0aWxpdGllcy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLQotcHVibGljIGNsYXNzIFByb2plY3RVdGlsaXRpZXMgewotCi0JLyoqCi0JICogUHJvamVjdCBjb250cm9sIGZpbGUgbmFtZSBpbiBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERPVF9QUk9KRUNUID0gIi5wcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2xhc3NwYXRoIGNvbnRyb2wgZmlsZSBuYW1lIGluIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9UX0NMQVNTUEFUSCA9ICIuY2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFByb2plY3RVdGlsaXRpZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYXR1cmUgaWQgdG8gdGhlIHByb2plY3QgYWhlYWQgb2YgYWxsIG90aGVyIG5hdHVyZSBpZHMuCi0JICogCi0JICogQHBhcmFtIHByb2oKLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMSwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1swXSA9IG5hdHVyZUlkOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmF0dXJlIGlkIGFmdGVyIGFsbCBvZiB0aGUgb3RoZXIgbmF0dXJlIGlkcyBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2oKLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0TGFzdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoXSA9IG5hdHVyZUlkOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgbmF0dXJlIGlkIGZyb20gdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTmF0dXJlRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCWludCBzaXplID0gcHJldk5hdHVyZXMubGVuZ3RoOwotCQlpbnQgbmV3c2l6ZSA9IDA7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlib29sZWFuIG1hdGNoZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChwcmV2TmF0dXJlc1tpXS5lcXVhbHMobmF0dXJlSWQpKSB7Ci0JCQkJbWF0Y2hmb3VuZCA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UKLQkJCQluZXdOYXR1cmVzW25ld3NpemUrK10gPSBwcmV2TmF0dXJlc1tpXTsKLQkJfQotCQlpZiAoIW1hdGNoZm91bmQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpFTVV0aWxQbHVnaW4uSUQsIDAsCi0JCQkJCSJUaGUgbmF0dXJlIGlkICIgKyBuYXR1cmVJZCArICIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWVsc2UgewotCQkJU3RyaW5nW10gdGVtcCA9IG5ld05hdHVyZXM7Ci0JCQluZXdOYXR1cmVzID0gbmV3IFN0cmluZ1tuZXdzaXplXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgbmV3TmF0dXJlcywgMCwgbmV3c2l6ZSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbGlzdCBvZiBwcm9qZWN0cyB0byBlbmQgb2YgdGhlICJyZWZlcmVuY2VkIHByb2plY3RzIiBsaXN0IGZyb20gdGhlIHByb2plY3QncyBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB0b0JlQWRkZWRQcm9qZWN0c0xpc3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVmZXJlbmNlUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgTGlzdCB0b0JlQWRkZWRQcm9qZWN0c0xpc3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZGVzY3JpcHRpb24uZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0KLQkJQXJyYXlMaXN0IHByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKHByb2plY3RzW2ldKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9CZUFkZGVkUHJvamVjdHNMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKHRvQmVBZGRlZFByb2plY3RzTGlzdC5nZXQoaSkpOwotCQl9Ci0KLQkJSVByb2plY3RbXSByZWZQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0c0xpc3Quc2l6ZSgpXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWZQcm9qZWN0c1tpXSA9IChJUHJvamVjdCkgKHByb2plY3RzTGlzdC5nZXQoaSkpOwotCQl9Ci0KLQkJZGVzY3JpcHRpb24uc2V0UmVmZXJlbmNlZFByb2plY3RzKHJlZlByb2plY3RzKTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzaW5nbGUgcHJvamVjdCB0byB0aGUgZW5kIG9mIHRoZSAicmVmZXJlbmNlZCBwcm9qZWN0cyIgbGlzdCBmcm9tIHRoZSBwcm9qZWN0J3MgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gcHJvamVjdFRvQmVBZGRlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWZlcmVuY2VQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdCBwcm9qZWN0VG9CZUFkZGVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBkZXNjcmlwdGlvbi5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQotCQlBcnJheUxpc3QgcHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXByb2plY3RzTGlzdC5hZGQocHJvamVjdHNbaV0pOwotCQl9Ci0KLQkJcHJvamVjdHNMaXN0LmFkZChwcm9qZWN0VG9CZUFkZGVkKTsKLQotCQlJUHJvamVjdFtdIHJlZlByb2plY3RzID0gbmV3IElQcm9qZWN0W3Byb2plY3RzTGlzdC5zaXplKCldOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlZlByb2plY3RzW2ldID0gKElQcm9qZWN0KSAocHJvamVjdHNMaXN0LmdldChpKSk7Ci0JCX0KLQotCQlkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdHMpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JjZSBhIGFuIGltbWVkaWF0ZSBidWlsZCBvZiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZm9yY2VBdXRvQnVpbGQoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBwcm9ncmVzc01vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvL1JldmlzaXQ6IE5lZWQgdG8gdXNlIGEgTG9nZ2VyCi0JCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaWYgYXV0byBidWlsZCBpcyB0dXJuZWQgb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdXRvIGJ1aWxkIGlzIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q3VycmVudEF1dG9CdWlsZFNldHRpbmcoKSB7Ci0KLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3ZCA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQlyZXR1cm4gd2QuaXNBdXRvQnVpbGRpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgbWF5IGJlIGFuIDxjb2RlPklQcm9qZWN0LCBJUmVzb3VyY2UsIElBZGFwdGFibGUgKHRvIGFuIElQcm9qZWN0KSwgRU9iamVjdCAoZ2V0cyBJUHJvamVjdCBpZiBvYmplY3QgaXMgaW4gYSBQcm9qZWN0UmVzb3VyY2VTZXQ8L2NvZGU+LgotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiByZXR1cm5zIHByb2plY3QuIElmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHJldHVybnMgcHJvamVjdCBvbmx5IGlmIHByb2plY3QgaGFzIHRoaXMgbmF0dXJlIGlkLgotCSAqIEByZXR1cm4gcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KE9iamVjdCBvYmplY3QsIFN0cmluZyBuYXR1cmVJZCkgewotCQlJUHJvamVjdCByZXN1bHQgPSBnZXRQcm9qZWN0KG9iamVjdCk7Ci0JCWlmIChuYXR1cmVJZCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5pc0FjY2Vzc2libGUoKSAmJiBuYXR1cmVJZCAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlpZiAocmVzdWx0Lmhhc05hdHVyZShuYXR1cmVJZCkpCi0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBtYXkgYmUgYW4gPGNvZGU+SVByb2plY3QsIElSZXNvdXJjZSwgSUFkYXB0YWJsZSAodG8gYW4gSVByb2plY3QpLCBFT2JqZWN0IChnZXRzIElQcm9qZWN0IGlmIG9iamVjdCBpcyBpbiBhIFByb2plY3RSZXNvdXJjZVNldDwvY29kZT4uCi0JICogQHJldHVybiBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IG9iamVjdCkgewotCQlJUHJvamVjdCByZXN1bHQgPSBudWxsOwotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJlc3VsdCA9IChJUHJvamVjdCkgb2JqZWN0OwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQlyZXN1bHQgPSAoKElSZXNvdXJjZSkgb2JqZWN0KS5nZXRQcm9qZWN0KCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXN1bHQgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgb2JqZWN0KS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCXJlc3VsdCA9IGdldFByb2plY3QoKEVPYmplY3QpIG9iamVjdCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBFT2JqZWN0LiAoSWYgaW4gYSBQcm9qZWN0UmVzb3VyY2VTZXQsIHRoZW4gdGhlIHByb2plY3QgZnJvbSB0aGF0IHJlc291cmNlIHNldCkuCi0JICogCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiBAcmV0dXJuIHByb2plY3QgaWYgYXNzb2NpYXRlZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlpZiAoYVJlZk9iamVjdCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGFSZWZPYmplY3QuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdChyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBVUkkuZGVjb2RlKHVyaS5wYXRoKCkpOwotCQkJZmlsZVN0cmluZyA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UubGVuZ3RoKCkgKyAxKTsKLQkJCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZVN0cmluZykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFJlc291cmNlLiAoSWYgaW4gYSBQcm9qZWN0UmVzb3VyY2VTZXQsIHRoZW4gdGhlIHByb2plY3QgZnJvbSB0aGF0IHJlc291cmNlIHNldCkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBwcm9qZWN0IGlmIGFzc29jaWF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZVNldCBzZXQgPSByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgPT0gbnVsbCkgewotCQkJVVJJIHVyaSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCUlGaWxlIGZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJCQotCQlpZiAoc2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KQotCQkJcmV0dXJuICgoUHJvamVjdFJlc291cmNlU2V0KSBzZXQpLmdldFByb2plY3QoKTsKLQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IHNldCA9PSBudWxsID8gbnVsbCA6IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlciBpbnN0YW5jZW9mIFdvcmtiZW5jaFVSSUNvbnZlcnRlciAmJiAoKFdvcmtiZW5jaFVSSUNvbnZlcnRlcikgY29udmVydGVyKS5nZXRPdXRwdXRDb250YWluZXIoKSAhPSBudWxsKQotCQkJcmV0dXJuICgoV29ya2JlbmNoVVJJQ29udmVydGVyKSBjb252ZXJ0ZXIpLmdldE91dHB1dENvbnRhaW5lcigpLmdldFByb2plY3QoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBsaXN0IG9mIHByb2plY3RzIGZyb20gdGhlIGxpc3Qgb2YgInJlZmVyZW5jZWQgcHJvamVjdHMiIGluIHRoZSBwcm9qZWN0J3MgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gdG9CZVJlbW92ZWRQcm9qZWN0TGlzdAotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUmVmZXJlbmNlUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgTGlzdCB0b0JlUmVtb3ZlZFByb2plY3RMaXN0KSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZGVzY3JpcHRpb24uZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0KLQkJQXJyYXlMaXN0IHByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKHByb2plY3RzW2ldKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9CZVJlbW92ZWRQcm9qZWN0TGlzdC5zaXplKCk7IGkrKykgewotCQkJcHJvamVjdHNMaXN0LnJlbW92ZSh0b0JlUmVtb3ZlZFByb2plY3RMaXN0LmdldChpKSk7Ci0JCX0KLQotCQlJUHJvamVjdFtdIHJlZlByb2plY3RzID0gbmV3IElQcm9qZWN0W3Byb2plY3RzTGlzdC5zaXplKCldOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlZlByb2plY3RzW2ldID0gKElQcm9qZWN0KSAocHJvamVjdHNMaXN0LmdldChpKSk7Ci0JCX0KLQotCQlkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdHMpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHByb2plY3QgZnJvbSB0aGUgbGlzdCBvZiAicmVmZXJlbmNlZCBwcm9qZWN0cyIgaW4gdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB0b0JlUmVtb3ZlZFByb2plY3QKLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZVByb2plY3RzKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0IHRvQmVSZW1vdmVkUHJvamVjdCkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGRlc2NyaXB0aW9uLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCi0JCUFycmF5TGlzdCBwcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcHJvamVjdHNMaXN0LmFkZCgocHJvamVjdHNbaV0pKTsKLQkJfQotCi0JCXByb2plY3RzTGlzdC5yZW1vdmUodG9CZVJlbW92ZWRQcm9qZWN0KTsKLQotCQlJUHJvamVjdFtdIHJlZlByb2plY3RzID0gbmV3IElQcm9qZWN0W3Byb2plY3RzTGlzdC5zaXplKCldOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlZlByb2plY3RzW2ldID0gKElQcm9qZWN0KSAocHJvamVjdHNMaXN0LmdldChpKSk7Ci0JCX0KLQotCQlkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdHMpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUdXJuIGF1dG8tYnVpbGRpbmcgb2ZmLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0dXJuQXV0b0J1aWxkT2ZmKCkgewotCQl0cnkgewotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gd2QgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCXdkLnNldEF1dG9CdWlsZGluZyhmYWxzZSk7Ci0JCQl3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24od2QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUdXJuIGF1dG8tYnVpbGRpbmcgb24uCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHR1cm5BdXRvQnVpbGRPbigpIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdkID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQl3ZC5zZXRBdXRvQnVpbGRpbmcodHJ1ZSk7Ci0JCQl3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24od2QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGF1dG8tYnVpbGRpbmcgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGFCb29sZWFuCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byB0dXJuIGF1dG8tYnVpbGRpbmcgb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHR1cm5BdXRvQnVpbGRPbihib29sZWFuIGFCb29sZWFuKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3ZCA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQkJd2Quc2V0QXV0b0J1aWxkaW5nKGFCb29sZWFuKTsKLQkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbih3ZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGJ1aWxkZXIgdG8gdGhlIGJ1aWxkIHNwZWMgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBidWlsZGVySUQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgYnVpbGRlci4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgUHJvamVjdCB0byBhZGQgdG8uCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBidWlsZGVyIGlkIHdhcyBhY3R1YWxseSBhZGRlZCAoaXQgbWF5IGhhdmUgYWxyZWFkeSBleGlzdGVkKQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb0J1aWxkU3BlYyhTdHJpbmcgYnVpbGRlcklELCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhZGRUb0J1aWxkU3BlY0JlZm9yZShidWlsZGVySUQsIG51bGwsIHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBidWlsZGVyIHRvIHRoZSBidWlsZCBzcGVjIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCwgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yIGJ1aWxkZXIuCi0JICogCi0JICogQHBhcmFtIGJ1aWxkZXJJRAotCSAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBidWlsZGVyLgotCSAqIEBwYXJhbSBzdWNjZXNzb3JJRAotCSAqICAgICAgICAgICAgVGhlIGlkIHRvIHB1dCB0aGUgYnVpbGRlciBiZWZvcmUuCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBidWlsZGVyIGlkIHdhcyBhY3R1YWxseSBhZGRlZCAoaXQgbWF5IGhhdmUgYWxyZWFkeSBleGlzdGVkKQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb0J1aWxkU3BlY0JlZm9yZShTdHJpbmcgYnVpbGRlcklELCBTdHJpbmcgc3VjY2Vzc29ySUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhidWlsZGVySUQpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghZm91bmQpIHsKLQkJCWJvb2xlYW4gc3VjY2Vzc29yRm91bmQgPSBmYWxzZTsKLQkJCUlDb21tYW5kIGNvbW1hbmQgPSBkZXNjcmlwdGlvbi5uZXdDb21tYW5kKCk7Ci0JCQljb21tYW5kLnNldEJ1aWxkZXJOYW1lKGJ1aWxkZXJJRCk7Ci0JCQlJQ29tbWFuZFtdIG5ld0NvbW1hbmRzID0gbmV3IElDb21tYW5kW2NvbW1hbmRzLmxlbmd0aCArIDFdOwotCQkJZm9yIChpbnQgaiA9IDAsIGluZGV4ID0gMDsgaiA8IGNvbW1hbmRzLmxlbmd0aDsgaisrLCBpbmRleCsrKSB7Ci0JCQkJaWYgKHN1Y2Nlc3NvcklEICE9IG51bGwgJiYgY29tbWFuZHNbal0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoc3VjY2Vzc29ySUQpKSB7Ci0JCQkJCXN1Y2Nlc3NvckZvdW5kID0gdHJ1ZTsKLQkJCQkJbmV3Q29tbWFuZHNbaW5kZXgrK10gPSBjb21tYW5kOwotCQkJCX0KLQkJCQluZXdDb21tYW5kc1tpbmRleF0gPSBjb21tYW5kc1tqXTsKLQkJCX0KLQkJCWlmICghc3VjY2Vzc29yRm91bmQpCi0JCQkJbmV3Q29tbWFuZHNbbmV3Q29tbWFuZHMubGVuZ3RoIC0gMV0gPSBjb21tYW5kOwotCQkJZGVzY3JpcHRpb24uc2V0QnVpbGRTcGVjKG5ld0NvbW1hbmRzKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCQl9Ci0JCXJldHVybiAhZm91bmQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBidWlsZGVyIGZyb20gdGhlIGJ1aWxkIHNwZWMuCi0JICogCi0JICogQHBhcmFtIGJ1aWxkZXJJRAotCSAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBidWlsZGVyLgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBQcm9qZWN0IHRvIHJlbW92ZSBmcm9tLgotCSAqIEByZXR1cm4gYm9vbGVhbiBpZiB0aGUgYnVpbGRlciBpZCB3YXMgZm91bmQgYW5kIHJlbW92ZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlRnJvbUJ1aWxkU3BlYyhTdHJpbmcgYnVpbGRlcklELCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlcklEKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZm91bmQpIHsKLQkJCUlDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbY29tbWFuZHMubGVuZ3RoIC0gMV07Ci0JCQlpbnQgbmV3Q291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7ICsraSkgewotCQkJCWlmICghKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKGJ1aWxkZXJJRCkpKSB7Ci0JCQkJCS8vQWRkIHRoZSBleGlzdG5nIHRvIHRoZSBuZXcgYXJyYXkKLQkJCQkJbmV3Q29tbWFuZHNbbmV3Q291bnRdID0gY29tbWFuZHNbaV07Ci0JCQkJCW5ld0NvdW50Kys7Ci0JCQkJfQotCQkJfQotCi0JCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0KLQkJfQotCQlyZXR1cm4gZm91bmQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgdGhlIGNvbnRhaW5lciBpcyBub3QgcmVhZC1vbmx5LgotCSAqIDxwPgotCSAqIEZvciBMaW51eCwgYSBSZXNvdXJjZSBjYW5ub3QgYmUgY3JlYXRlZCBpbiBhIFJlYWRPbmx5IGZvbGRlci4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgbmV3IGZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgd29ya3NwYWNlIHJlc291cmNlIHRvIG1ha2UgcmVhZC93cml0ZQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVDb250YWluZXJOb3RSZWFkT25seShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgIXJlc291cmNlLmV4aXN0cygpKSB7IC8vaXQgbXVzdCBiZSBuZXcKLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCQlSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0ciA9IGNvbnRhaW5lci5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKLQkJCXdoaWxlIChhdHRyICE9IG51bGwgJiYgIWF0dHIuaXNSZWFkT25seSgpKSB7Ci0JCQkJY29udGFpbmVyID0gY29udGFpbmVyLmdldFBhcmVudCgpOwotCQkJCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQkJYXR0ciA9IGNvbnRhaW5lci5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBhdHRyICE9IG51bGwpCi0JCQkJYXR0ci5zZXRSZWFkT25seShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcHJvamVjdHMgZnJvbSBwcmltYXJ5IG5hdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmF0dXJlSUQKLQkgKiBAcmV0dXJuIEFsbCBwcm9qZWN0cyB0aGF0IGhhdmUgdGhlIGdpdmVuIG5hdHVyZSBpZCBhcyB0aGUgZmlyc3QgbmF0dXJlIGlkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRQcm9qZWN0c0ZvclByaW1hcnlOYXR1cmUoU3RyaW5nIG5hdHVyZUlEKSB7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHNXaXRoTmF0dXJlID0gbmV3IElQcm9qZWN0W10ge307Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0QWxsUHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGlzUHJvamVjdFByaW1hcnlOYXR1cmUocHJvamVjdHNbaV0sIG5hdHVyZUlEKSkKLQkJCQlyZXN1bHQuYWRkKHByb2plY3RzW2ldKTsKLQkJfQotCQlyZXR1cm4gKElQcm9qZWN0W10pIHJlc3VsdC50b0FycmF5KHByb2plY3RzV2l0aE5hdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICogCi0JICogQHJldHVybiBhbGwgd29ya3NwYWNlIHByb2plY3RzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEFsbFByb2plY3RzKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgbmF0dXJlIGlkIHRoZSBwcmltYXJ5IG5hdHVyZSBpZCBmb3IgdGhlIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBuYXR1cmVJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmlyc3QgbmF0dXJlIGlkIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm9qZWN0UHJpbWFyeU5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmF0dXJlSUQpIHsKLQkJU3RyaW5nW10gbmF0dXJlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQluYXR1cmVzID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldE5hdHVyZUlkcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJfQotCQlyZXR1cm4gKG5hdHVyZXMgIT0gbnVsbCAmJiBuYXR1cmVzLmxlbmd0aCA+IDAgJiYgbmF0dXJlc1swXS5lcXVhbHMobmF0dXJlSUQpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElQYXRoIGNyZWF0ZVBhdGgoSVByb2plY3QgcCwgU3RyaW5nIGRlZmF1bHRTb3VyY2VOYW1lKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChwLmdldE5hbWUoKSk7Ci0JCXBhdGggPSBwYXRoLmFwcGVuZChkZWZhdWx0U291cmNlTmFtZSk7Ci0JCXBhdGggPSBwYXRoLm1ha2VBYnNvbHV0ZSgpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBleGlzdGluZyBmaWxlcyB3aGljaCB3aWxsIGJlIG1vZGlmaWVkIGlmIHRoZSBjbGFzc3BhdGggY2hhbmdlcyBmb3IgdGhlIGdpdmVuIHByb2VqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBsaXN0IG9mIGFmZmVjdGVkIGZpbGVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRGaWxlc0FmZmVjdGVkQnlDbGFzc3BhdGhDaGFuZ2UoSVByb2plY3QgcCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCWFkZEZpbGVJZkV4aXN0cyhwLCByZXN1bHQsIERPVF9DTEFTU1BBVEgpOwotCQlhZGRGaWxlSWZFeGlzdHMocCwgcmVzdWx0LCBET1RfUFJPSkVDVCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZEZpbGVJZkV4aXN0cyhJUHJvamVjdCBwLCBMaXN0IGFMaXN0LCBTdHJpbmcgZmlsZW5hbWUpIHsKLQkJSUZpbGUgYUZpbGUgPSBwLmdldEZpbGUoZmlsZW5hbWUpOwotCQlpZiAoYUZpbGUgIT0gbnVsbCAmJiBhRmlsZS5leGlzdHMoKSkKLQkJCWFMaXN0LmFkZChhRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3RyaXAgb2ZmIGEgbGVhZGluZyAiLyIgZnJvbSBlYWNoIHByb2plY3QgbmFtZSBpbiB0aGUgYXJyYXksIGlmIGl0IGhhcyBvbmUuCi0JICogCi0JICogQHBhcmFtIHByb2plY05hbWVzCi0JICogQHJldHVybiBhcnJheSBvZiBwcm9qZWN0IG5hbWVzIHdpdGggYWxsIGxlYWRpbmcgJy8nIHJlbW92ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9qZWN0TmFtZXNXaXRob3V0Rm9yd2FyZFNsYXNoKFN0cmluZ1tdIHByb2plY05hbWVzKSB7Ci0JCVN0cmluZ1tdIHByb2pOYW1lcyA9IG5ldyBTdHJpbmdbcHJvamVjTmFtZXMubGVuZ3RoXTsKLQkJTGlzdCB0ZW1wID0gamF2YS51dGlsLkFycmF5cy5hc0xpc3QocHJvamVjTmFtZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXAuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgKHRlbXAuZ2V0KGkpKTsKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcHJvak5hbWVzW2ldID0gbmFtZS5zdWJzdHJpbmcoMSwgbmFtZS5sZW5ndGgoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXByb2pOYW1lc1tpXSA9IG5hbWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2pOYW1lczsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBjcmVhdGVGaWxlVVJMKElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwYXRoLnRvRmlsZSgpLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGZpcnN0IG5ld09iamVjdCB0aGF0IGlzIG5vdCBpbiB0aGUgb2xkT2JqZWN0cyBhcnJheSAodXNpbmcgIj09IikuCi0JICogCi0JICogQHBhcmFtIG9sZE9iamVjdHMKLQkgKiBAcGFyYW0gbmV3T2JqZWN0cwotCSAqIEByZXR1cm4gZmlyc3QgbmV3T2JqZWN0IG5vdCBmb3VuZCBpbiBvbGRPYmplY3RzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbGwgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KE9iamVjdFtdIG9sZE9iamVjdHMsIE9iamVjdFtdIG5ld09iamVjdHMpIHsKLQkJaWYgKG9sZE9iamVjdHMgIT0gbnVsbCAmJiBuZXdPYmplY3RzICE9IG51bGwgJiYgb2xkT2JqZWN0cy5sZW5ndGggPCBuZXdPYmplY3RzLmxlbmd0aCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCU9iamVjdCBvYmplY3QgPSBuZXdPYmplY3RzW2ldOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkT2JqZWN0cy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAob2xkT2JqZWN0c1tqXSA9PSBvYmplY3QpIHsKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghZm91bmQpCi0JCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9sZE9iamVjdHMgPT0gbnVsbCAmJiBuZXdPYmplY3RzICE9IG51bGwgJiYgbmV3T2JqZWN0cy5sZW5ndGggPT0gMSkKLQkJCXJldHVybiBuZXdPYmplY3RzWzBdOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0IG9mIGFsbCBmaWxlcyBpbiB0aGUgcHJvamVjdC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzIGlzIHRvIHVzZSB7QGxpbmsgSVJlc291cmNlI2FjY2VwdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3IsIGludCl9Ci0JICogCi0JICogQHBhcmFtIDEuMC4wCi0JICogQHJldHVybiBsaXN0IG9mIGZpbGVzIGluIHRoZSBwcm9qZWN0Ci0JICogCi0JICogQHNlZSBJUmVzb3VyY2UjYWNjZXB0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvciwgaW50KQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9qZWN0RmlsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBjb2xsZWN0RmlsZXMocHJvamVjdC5tZW1iZXJzKCksIHJlc3VsdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBjb2xsZWN0RmlsZXMoSVJlc291cmNlW10gbWVtYmVycywgTGlzdCByZXN1bHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcmVjdXJzaXZlbHkgY29sbGVjdCBmaWxlcyBmb3IgdGhlIGdpdmVuIG1lbWJlcnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gbWVtYmVyc1tpXTsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJY29sbGVjdEZpbGVzKCgoSUZvbGRlcikgcmVzKS5tZW1iZXJzKCksIHJlc3VsdCk7Ci0JCQl9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJcmVzdWx0LmFkZChyZXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqIEByZXR1cm4gYSBJUHJvamVjdCBnaXZlbiB0aGUgcHJvamVjdE5hbWUKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBidWlsZGVyIG5hbWUgaXMgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gYnVpbGRlck5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGJ1aWxkZXIgbmFtZSBpcyBhdHRhY2hlZCB0byB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgYnVpbGRlck5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlDb21tYW5kW10gYnVpbGRlcnMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0QnVpbGRTcGVjKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbW1hbmQgYnVpbGRlciA9IGJ1aWxkZXJzW2ldOwotCQkJCWlmIChidWlsZGVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGJ1aWxkZXIuZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlck5hbWUpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3MDc4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogUmVzb3VyY2VIYW5kbGVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogSW1wbGVtZW50ZXJzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBwcm92aWRlIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgb24gcmVzb3VyY2Ugc2V0LiBTdWNoIGFzIGxvb2tpbmcgb3IgY3JlYXRpbmcgaW4gb3RoZXIgcmVzb3VyY2Ugc2V0cyBmb3IgYQotICogcmVzb3VyY2Ugb3IgYW4gRU9iamVjdC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldCNhZGQoUmVzb3VyY2VIYW5kbGVyKQotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VIYW5kbGVyIHsKLQotCS8qKgotCSAqIEVhY2ggUmVzb3VyY2VIYW5kbGVyIGZvciBhIFdvcmtiZW5jaENvbnRleHQgKHdoaWNoIGhvbGRzIGEgUHJvamVjdFJlc291cmNlU2V0KSB3aWxsIGdldCBhbiBvcG9ydHVuaXR5IHRvIGdldCB0aGUgUmVzb3VyY2UgZ2l2ZW4gdGhlIHVyaVN0cmluZwotCSAqIHByaW9yIHRvIHRoZSBvcmlnaW5hdGluZ1Jlc291cmNlU2V0IGdldHRpbmcgaXQgaW4gdGhlIG5vcm1hbCBtYW5uZXIuCi0JICogCi0JICogSWYgdGhpcyBoYW5kbGVyIGxvYWRlZCBhIFJlc291cmNlIGluIGl0cyBjcmVhdGUoUmVzb3VyY2VTZXQsIHVyaVN0cmluZykgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYWJsZSB0byByZXR1cm4gaXQgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gb3JpZ2luYXRpbmdSZXNvdXJjZVNldAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIHJlc291cmNlIGlmIGZvdW5kIG9yIDxjb2RlPm51bGxsL2NvZGU+IGlmIHRoaXMgaGFuZGxlciBkaWRuJ3QgZmluZCBpdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlSZXNvdXJjZSBnZXRSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKTsKLQotCS8qKgotCSAqIEdldCB0aGUgRU9iamVjdCBmb3IgdGhlIGdpdmVuIFVSSSwgaWYgaXQgY2FuLiBMb2FkIHRoZSByZXNvdXJjZSBpZiBsb2FkT25EZW1hbmQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB1cmkgb2YgRU9iamVjdCBiZWluZyByZXF1ZXN0ZWQKLQkgKiBAcGFyYW0gbG9hZE9uRGVtYW5kCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiByZXNvdXJjZSBzaG91bGQgYmUgbG9hZGVkCi0JICogQHJldHVybiBlb2JqZWN0IGlmIGZvdW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdC4KLQkgKi8KLQlFT2JqZWN0IGdldEVPYmplY3RGYWlsZWQoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSByZXNvdXJjZSBwb2ludGVkIHRvIGJlIHRoZSBVUkkgaWYgdGhpcyBoYW5kbGVyIHdpbGwgaGFuZGxlIGl0LgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW5hdGluZ1Jlc291cmNlU2V0Ci0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gcmVzb3VyY2UgaWYgY3JlYXRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaGFuZGxlciBkb2Vzbid0IGhhbmRsZSB0aGlzIHR5cGUuCi0JICovCi0JUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZWM1OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjQgJCQgICQkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo0NSAkJCAKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0KLS8qKgotICogU3luY2hyb25pemVyIG9uIHRoZSB3b3JrYmVuY2guIEl0IGxpc3RlbnMgZm9yIHRoZSBwcm9qZWN0IHRvIHNlZSBpZiBpdCBpcyBjbG9zZWQgb3IgZGVsZXRlZC4gSWYgaXQgZG9lcyBpdCBub3RpZmllcyB0aGlzIG91dC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JLyoqIEV4dGVuZGVycyB0aGF0IHdpbGwgYmUgbm90aWZpZWQgYWZ0ZXIgYSBwcmUgYnVpbGQgcmVzb3VyY2UgY2hhbmdlICovCi0JcHJvdGVjdGVkIExpc3QgZXh0ZW5kZXJzOwotCi0JLyoqIFRoZSBkZWx0YSBmb3IgdGhpcyBwcm9qZWN0IHRoYXQgd2lsbCBiZSBicm9hZGNhc3QgdG8gdGhlIGV4dGVuZGVycyAqLwotCXByb3RlY3RlZCBJUmVzb3VyY2VEZWx0YSBjdXJyZW50UHJvamVjdERlbHRhOwotCi0JcHJpdmF0ZSBpbnQgY3VycmVudEV2ZW50VHlwZSA9IC0xOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgdGFraW5nIGEgcmVzb3VyY2Ugc2V0IGFuZCBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0LCBJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXNvdXJjZVNldCA9IGFSZXNvdXJjZVNldDsKLQkJcHJvamVjdCA9IGFQcm9qZWN0OwotCQlpZiAoYVJlc291cmNlU2V0ICE9IG51bGwgJiYgYVJlc291cmNlU2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KQotCQkJKChQcm9qZWN0UmVzb3VyY2VTZXQpIGFSZXNvdXJjZVNldCkuc2V0U3luY2hyb25pemVyKHRoaXMpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IGZvciB0aGlzIHN5bmNocm9uaXplcgotCSAqIAotCSAqIEByZXR1cm4gcHJvamVjdAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQljdXJyZW50RXZlbnRUeXBlID0gZXZlbnQuZ2V0VHlwZSgpOwotCQljdXJyZW50UHJvamVjdERlbHRhID0gbnVsbDsKLQkJaWYgKChjdXJyZW50RXZlbnRUeXBlID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8fCBjdXJyZW50RXZlbnRUeXBlID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpCi0JCQkJJiYgZXZlbnQuZ2V0UmVzb3VyY2UoKS5lcXVhbHMoZ2V0UHJvamVjdCgpKSkgewotCQkJbm90aWZ5RXh0ZW5kZXJzT2ZDbG9zZSgpOwotCQkJcmVsZWFzZSgpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlFeHRlbmRlcnNJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKGN1cnJlbnRFdmVudFR5cGUgIT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgfHwgZXh0ZW5kZXJzID09IG51bGwgfHwgY3VycmVudFByb2plY3REZWx0YSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVycy5zaXplKCk7IGkrKykgewotCQkJSVN5bmNocm9uaXplckV4dGVuZGVyIGV4dGVuZGVyID0gKElTeW5jaHJvbml6ZXJFeHRlbmRlcikgZXh0ZW5kZXJzLmdldChpKTsKLQkJCWV4dGVuZGVyLnByb2plY3RDaGFuZ2VkKGN1cnJlbnRQcm9qZWN0RGVsdGEpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RXh0ZW5kZXJzT2ZDbG9zZSgpIHsKLQkJaWYgKGV4dGVuZGVycyAhPSBudWxsICYmICFleHRlbmRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVycy5zaXplKCk7IGkrKykgewotCQkJCUlTeW5jaHJvbml6ZXJFeHRlbmRlciBleHRlbmRlciA9IChJU3luY2hyb25pemVyRXh0ZW5kZXIpIGV4dGVuZGVycy5nZXQoaSk7Ci0JCQkJZXh0ZW5kZXIucHJvamVjdENsb3NlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywKLQkJCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgdGhlIHN5bmNocm9uaXplci4gQ2FsbGVkIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlnZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBwcm9qZWN0IGlzIGdvaW5nIGF3YXkgc28gd2UgbmVlZCB0byBjbGVhbnVwIG91cnNlbGYgYW5kIHRoZSBSZXNvdXJjZVNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoSkVNVXRpbFBsdWdpbi5pc0FjdGl2YXRlZCgpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZVNldCkKLQkJCQkJKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5yZWxlYXNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCUVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLnJlbW92ZUNhY2hlZFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW4gZXh0ZW5kZXIgdG8gYmUgbm90aWZpZWQgb2YgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBleHRlbmRlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4dGVuZGVyKElTeW5jaHJvbml6ZXJFeHRlbmRlciBleHRlbmRlcikgewotCQlpZiAoZXh0ZW5kZXJzID09IG51bGwpCi0JCQlleHRlbmRlcnMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQlleHRlbmRlcnMuYWRkKGV4dGVuZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZXh0ZW5kZXIgZnJvbSBub3RpZmljYXRpb24gb2YgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBleHRlbmRlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUV4dGVuZGVyKElTeW5jaHJvbml6ZXJFeHRlbmRlciBleHRlbmRlcikgewotCQlpZiAoZXh0ZW5kZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWV4dGVuZGVycy5yZW1vdmUoZXh0ZW5kZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgJygnICsgKChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgPyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpIDogIm51bGwiKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRlbGwgU3luY2hyb25pemVyIHRoYXQgYSBmaWxlIGlzIGFib3V0IHRvIGJlIHNhdmVkLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHdyaXRpbmcgdG8gYW4gSUZpbGUgZnJvbSBhbiBFTUYgcmVzb3VyY2UuCi0JICogPHA+Ci0JICogRGVmYXVsdCBkb2VzIG5vdGhpbmcsIGJ1dCBzdWJjbGFzc2VzIGNhbiBkbyBzb21ldGhpbmcuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZQotCSAqICAgICAgICAgICAgZmlsZSBhYm91dCB0byBiZSBzYXZlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVTYXZlKElGaWxlIGFGaWxlKSB7Ci0JCS8vRGVmYXVsdCBpcyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDcyZjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLQotLyoqCi0gKiBCeXRlQXJyYXkgT3V0cHV0U3RyZWFtIGZvciB0aGUgV29ya2JlbmNoLiBJdCB3b3JrcyB3aXRoIHRoZSBzeW5jaHJvbml6ZXIge0BsaW5rIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXJ9dG8KLSAqIG5vdGlmeSBvZiBhIHNhdmUuIEl0IGFsc28gY2hhbmdlcyBhbGwgb2YgdGhlIGxpbmUgc2VwYXJhdG9ycyB0byB0aGUgY3VycmVudCBzeXN0ZW0gbGluZSBzZXBhcmF0b3IsIGkuZS4gaWYgdGhlcmUgYXJlIHNvbWUgJ1xyJyBhbmQgd2UgYXJlIG9uCi0gKiBXaW5kb3dzKFIpIHRoZW4gdGhleSB3aWxsIGJlIGNvbnZlcnRlZCB0byAnXG5ccicpLCBpZiB0aGUgc2V0dGluZyBmb3IgdGhlIHN0cmVhbSBpcyB0byBkbyBlb2wgY29udmVyc2lvbi4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsLlBsYXRmb3JtUmVzb3VyY2VPdXRwdXRTdHJlYW0gewotCi0JcHJpdmF0ZSBib29sZWFuIGZDb252ZXJ0RU9MID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOwotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYW4gSUZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKElGaWxlIGFGaWxlKSB7Ci0JCXRoaXMoYUZpbGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGEgSUZpbGUgYW5kIGEgc3luY2hyb25pemVyLiBUaGlzIHdheSBzeW5jaHJvbml6ZXIgd2lsbCBrbm93IHdoZW4gZmlsZSBpcyBhYm91dCB0byBiZSBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oSUZpbGUgYUZpbGUsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKLQkJc3VwZXIoYUZpbGUsIGZhbHNlLCB0cnVlLCBudWxsKTsKLQkJc3luY2hyb25pemVyID0gYVN5bmNocm9uaXplcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uT3V0cHV0U3RyZWFtI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzeW5jaHJvbml6ZXIgIT0gbnVsbCkKLQkJCXN5bmNocm9uaXplci5wcmVTYXZlKGZpbGUpOwotCQlzdXBlci5jbG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbC5QbGF0Zm9ybVJlc291cmNlT3V0cHV0U3RyZWFtI2ZsdXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzeW5jaHJvbml6ZXIgIT0gbnVsbCkKLQkJCXN5bmNocm9uaXplci5wcmVTYXZlKGZpbGUpOwotCQlzdXBlci5mbHVzaCgpOwotCX0KLQotCS8qCi0JICogQ29udmVydCB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVycy4KLQkgKi8KLQlwcml2YXRlIGludCBjb252ZXJ0RU9MKGJ5dGVbXSBkYXRhKSB7Ci0JCS8vIEFsZ29yaXRobToKLQkJLy8gUmVtb3ZlIGFsbCAnXHInIGNoYXJzCi0JCS8vIFJlcGxhY2UgYWxsICdcbicgY2hhcnMgd2l0aCBsaW5lIHNlcGVyYXRvciBjaGFycwotCi0JCVN0cmluZyBFT0wgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCWJ5dGVbXSBFT0xCeXRlcyA9IEVPTC5nZXRCeXRlcygpOwotCi0JCWludCBvdXQgPSAwOwotCi0JCWZvciAoaW50IGluID0gMDsgaW4gPCBkYXRhLmxlbmd0aDsgaW4rKykgewotCQkJaWYgKGRhdGFbaW5dID09ICdccicpIHsKLQkJCQkvLyBkb24ndCBvdXRwdXQgKGllLCB0aHJvdyB0aGUgY2hhciBhd2F5KQotCQkJfSBlbHNlIGlmIChkYXRhW2luXSA9PSAnXG4nKSB7Ci0JCQkJLy8gVGhlIGNvZGUgZG9lcyBub3QgY3VycmVudGx5IGhhbmRsZSBleHBhbmRpbmcgdGhlIGFycmF5Ci0JCQkJaWYgKChpbiAtIG91dCArIDEpIDwgRU9MQnl0ZXMubGVuZ3RoKQotCQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIldvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbTogRXhwYW5kaW5nIEVPTCBjaGFycyBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFT0xCeXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlkYXRhW291dCsrXSA9IEVPTEJ5dGVzW2ldOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSnVzdCBjb3B5IHRoZSBkYXRhCi0JCQkJZGF0YVtvdXQrK10gPSBkYXRhW2luXTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBvdXQ7Ci0JfQotCi0JLyoqCi0JICogSXMgRU9MIGNvbnZlcnNpb24gdHVybmVkIG9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgRU9MIGNvbnZlcnNpb24gaXMgdHVybmVkIG9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udmVydEVPTENoYXJzKCkgewotCQlyZXR1cm4gZkNvbnZlcnRFT0w7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBFT0wgY29udmVyc2lvbiBmbGFnLgotCSAqIAotCSAqIEBwYXJhbSBzZXQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIEVPTCBzaG91bGQgYmUgY29udmVydGVkIHRvIGN1cnJlbnQgbGluZSBzZXBhcmF0b3IuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydEVPTENoYXJzKGJvb2xlYW4gc2V0KSB7Ci0JCWZDb252ZXJ0RU9MID0gc2V0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0jdG9CeXRlQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgewotCQlieXRlW10gY29udGVudHMgPSBzdXBlci50b0J5dGVBcnJheSgpOwotCQlpZiAoaXNDb252ZXJ0RU9MQ2hhcnMoKSkKLQkJCWNvbnZlcnRFT0woY29udGVudHMpOwotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MjYyMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS42ICQkICAkJERhdGU6IDIwMDgvMDMvMTIgMTQ6MjE6MzkgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0KLS8qKgotICogV29ya2JlbmNoIHJlc291cmNlIGhlbHBlcgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSB7Ci0KLQkvKioKLQkgKiBFdmVyeXRoaW5nIGlzIHN0YXRpYywgZG9uJ3Qga25vdyB3aHkgdGhlcmUgaXMgYW4gaW5zdGFuY2UgaGVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSBJTlNUQU5DRSA9IG5ldyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyIHdvcmtzcGFjZVVSSUxvYWRlciA9IG5ldyBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZXNvbHZlQ29udGFpbmVkUHJveGllcyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlMaXN0IGNvbnRhaW5lZCA9IHJlZk9iamVjdC5lQ29udGVudHMoKTsKLQkJRU9iamVjdCBtb2ZPYmplY3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmVkLnNpemUoKTsgaSsrKSB7Ci0JCQltb2ZPYmplY3QgPSAoRU9iamVjdCkgY29udGFpbmVkLmdldChpKTsKLQkJCXJlc29sdmVQcm94aWVzKG1vZk9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVzb2x2ZU5vbkNvbnRhaW5lZFByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gcmVmT2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCUVSZWZlcmVuY2UgcmVmZXJlbmNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLQkJCWlmICghcmVmZXJlbmNlLmlzQ29udGFpbm1lbnQoKSkgewotCQkJCWlmIChyZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCB2YWx1ZSA9IChMaXN0KSByZWZPYmplY3QuZUdldChyZWZlcmVuY2UpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHZhbHVlLnNpemUoKTsgaisrKQotCQkJCQkJdmFsdWUuZ2V0KGopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlZk9iamVjdC5lR2V0KHJlZmVyZW5jZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yY2UgYWxsIG9mIHRoZSBwcm94aWVzIHdpdGggPGNvZGU+cmVzb3VyY2U8L2NvZGU+IHRvIGJlIHJlc29sdmVkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlUHJveGllcyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJTGlzdCB0b3BMZXZlbHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQkJRU9iamVjdCBtb2ZPYmplY3Q7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRvcExldmVscy5zaXplKCk7IGkrKykgewotCQkJCW1vZk9iamVjdCA9IChFT2JqZWN0KSB0b3BMZXZlbHMuZ2V0KGkpOwotCQkJCXJlc29sdmVQcm94aWVzKG1vZk9iamVjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIHByb3hpZXMgdGhhdCBhcmUgY29udGFpbmVkIGJ5IHRoZSA8Y29kZT5yZXNvdXJjZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBsaXN0IG9mIHByb3hpZXMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdhdGhlclByb3hpZXMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRvcExldmVscyA9IHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JCWludCBzaXplID0gdG9wTGV2ZWxzLnNpemUoKTsKLQkJRU9iamVjdCBtb2ZPYmplY3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQltb2ZPYmplY3QgPSAoRU9iamVjdCkgdG9wTGV2ZWxzLmdldChpKTsKLQkJCWdhdGhlclByb3hpZXMoKEludGVybmFsRU9iamVjdCkgbW9mT2JqZWN0LCBsaXN0KTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2F0aGVyUHJveGllcyhJbnRlcm5hbEVPYmplY3QgcmVmT2JqZWN0LCBMaXN0IHByb3hpZXMpIHsKLQkJaWYgKHJlZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlMaXN0IGNvbnRhaW5zID0gcmVmT2JqZWN0LmVDbGFzcygpLmdldEVBbGxDb250YWlubWVudHMoKTsKLQkJaWYgKGNvbnRhaW5zICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY29udGFpbnMuc2l6ZSgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNmID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBjb250YWlucy5nZXQoaSk7Ci0JCQkJZ2F0aGVyUHJveGllcyhyZWZPYmplY3QsIHNmLCBwcm94aWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnYXRoZXJQcm94aWVzKEludGVybmFsRU9iamVjdCByZWZPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiwgTGlzdCBwcm94aWVzKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCUludGVybmFsRU9iamVjdCBwcm94eSA9IG51bGw7Ci0JCWlmIChzZi5pc01hbnkoKSB8fCByZWZPYmplY3QuZUlzU2V0KHNmKSkgewotCQkJdmFsdWUgPSByZWZPYmplY3QuZUdldChzZiwgZmFsc2UpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQlpZiAoc2YuaXNNYW55KCkpIHsKLQkJCQkJSXRlcmF0b3IgaiA9ICgoSW50ZXJuYWxFTGlzdCkgdmFsdWUpLmJhc2ljSXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGouaGFzTmV4dCgpKSB7Ci0JCQkJCQlwcm94eSA9IChJbnRlcm5hbEVPYmplY3QpIGoubmV4dCgpOwotCQkJCQkJaWYgKHByb3h5LmVJc1Byb3h5KCkpCi0JCQkJCQkJcHJveGllcy5hZGQocHJveHkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgoKEludGVybmFsRU9iamVjdCkgdmFsdWUpLmVJc1Byb3h5KCkpCi0JCQkJCXByb3hpZXMuYWRkKHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZXNvbHZlUHJveGllcyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlpZiAocmVmT2JqZWN0ICE9IG51bGwpIHsKLQkJCXJlc29sdmVOb25Db250YWluZWRQcm94aWVzKHJlZk9iamVjdCk7Ci0JCQlyZXNvbHZlQ29udGFpbmVkUHJveGllcyhyZWZPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGV4aXN0aW5nIGNvbnRleHQgYmFzZSBvbiA8Y29kZT5hUHJvamVjdDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHJldHVybiB0aGUgY29udGV4dCBiYXNlIGZvciB0aGUgcHJvamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZ2V0RU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuSU5TVEFOQ0UuZ2V0RU1GQ29udGV4dChhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVzb3VyY2UgZnJvbSB0aGUgVVJJLiBUaGUgVVJJIG11c3QgY29udGFpbiB0aGUgcHJvamVjdCBuYW1lLCBlaXRoZXIgYXMgdGhlIGZpcnN0IHNlZ21lbnQsIG9yIGlmIGluIHBsYXRmb3JtIHJlc291cmNlIHVybCBwcm90b2NvbC4KLQkgKiB7QGxpbmsgI2dldFJlc291cmNlU2V0KFVSSSl9Ci0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gYSBuZXcgcmVzb3VyY2UgZm9yIHRoZSB1cmkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGEgcHJvamVjdCB1cmkKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2VTZXQodXJpKTsKLQkJaWYgKHNldCAhPSBudWxsKQotCQkJcmV0dXJuIHNldC5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYSBjYWNoZWQgUmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBVUkksIGlmIG5vbmUgaXMgZm91bmQsIGNyZWF0ZSBhIG5ldyBSZXNvdXJjZSBmb3Igd2l0aCB0aGUgVVJJIGFnYWluc3QgdGhlIHByb3BlciBSZXNvdXJjZVNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpIFRoZSBVUkkgTVVTVCBiZSBlaXRoZXIgYSAiPGI+cGxhdGZvcm06L3Jlc291cmNlLzwvYj5wcm9qZWN0LW5hbWUvLi4uLiIgdHlwZSBVUkkgb3IgaXQKLQkgKiBtdXN0IGJlIG9mIHR5cGUgInByb2plY3QtbmFtZS8uLi4iLiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIHJlc291cmNlcyB0aGF0IGFyZSB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZXMuCi0JICogQW55IG90aGVyIHR5cGUgb2YgVVJJIHdpbGwgY2F1c2UgPGNvZGU+bnVsbDwvY29kZT4gdG8gYmUgcmV0dXJuZWQuCi0JICogQHJldHVybiByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYSBwcm9qZWN0IHVyaS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBnZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UodXJpLCBnZXRSZXNvdXJjZVNldCh1cmkpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJRmlsZSBmb3IgdGhlIFVSSS4gVGhlIFVSSSBtdXN0IGJlIGEgd29ya2JlbmNoIHByb2plY3Qgc3R5bGUgVVJJLiAKLQkgKiBAcGFyYW0gdXJpIFRoZSBVUkkgTVVTVCBiZSBlaXRoZXIgYSAiPGI+cGxhdGZvcm06L3Jlc291cmNlLzwvYj5wcm9qZWN0LW5hbWUvLi4uLiIgdHlwZSBVUkkgb3IgaXQKLQkgKiBtdXN0IGJlIG9mIHR5cGUgInByb2plY3QtbmFtZS8uLi4iLiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIHJlc291cmNlcyB0aGF0IGFyZSB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZXMuCi0JICogQW55IG90aGVyIHR5cGUgb2YgVVJJIHdpbGwgY2F1c2UgPGNvZGU+bnVsbDwvY29kZT4gdG8gYmUgcmV0dXJuZWQuCi0JICogQHJldHVybiB0aGUgSUZpbGUgaWYgdGhlIFVSSSBpcyBhIHByb2plY3QgZm9ybSwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGEgcHJvamVjdCBmb3JtLCBPUiB0aGUgcHJvamVjdCBkb2Vzbid0IGV4aXN0LiBUaGUgSUZpbGUgcmV0dXJuZWQgZG9lc24ndCBuZWNlc3NhcmlseSBleGlzdC4gVXNlIHtAbGluayBJRmlsZSNleGlzdHMoKX0gdG8gdGVzdCB0aGF0LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0SUZpbGUoVVJJIHVyaSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCh1cmkpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwYXRoOwotCQkJaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKSB7Ci0JCQkJLy8gTmVlZCB0byBnZXQgdGhlIHBhdGggYW5kIHJlbW92ZSB0aGUgZmlyc3QgdHdvIHNlZ21lbnRzICgvcmVzb3VyY2UvcHJvamVjdCBuYW1lLykuCi0JCQkJcGF0aCA9IG5ldyBQYXRoKFVSSS5kZWNvZGUodXJpLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMik7Ci0JCQl9IGVsc2UgewotCQkJCS8vIE5lZWQgdG8gZ2V0IHRoZSBwYXRoIGFuZCByZW1vdmUgdGhlIGZpcnN0IHNlZ21lbnQgKC9wcm9qZWN0IG5hbWUvKS4KLQkJCQlwYXRoID0gbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCX0KLQkJCXJldHVybiBwcm9qZWN0LmdldEZpbGUocGF0aCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgZm9yIGEgY2FjaGVkIFJlc291cmNlIGZvciB0aGUgZ2l2ZW4gVVJJLCBpZiBub25lIGlzIGZvdW5kLCBjcmVhdGUgYSBuZXcgUmVzb3VyY2UgZm9yIHdpdGggdGhlIFVSSSBhZ2FpbnN0IHRoZSBnaXZlbiBSZXNvdXJjZVNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpIAotCSAqIEBwYXJhbSBzZXQKLQkgKiBAcmV0dXJuIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHNldCB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzID0gc2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotCQkJaWYgKHJlcyA9PSBudWxsKQotCQkJCXJlcyA9IHNldC5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQkJcmV0dXJuIHJlczsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgb3IgZXhpc3RpbmcgY29udGV4dCBiYXNlIG9uIDxjb2RlPmFQcm9qZWN0PC9jb2RlPi4gQWxsb3cgdGhlIDxjb2RlPmNvbnRyaWJ1dG9yPC9jb2RlPiB0byBjb250cmlidXRlIHRvIHRoZSBuZXcgb3IgZXhpc3RpbmcKLQkgKiBuYXR1cmUgcHJpb3IgdG8gcmV0dXJuaW5nLgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIEBwYXJhbSBjb250cmlidXRvcgotCSAqIEByZXR1cm4gdGhlIGNvbnRleHQgYmFzZSBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBjcmVhdGVFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0LCBJRU1GQ29udGV4dENvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yKSB7Ci0JCXJldHVybiBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVFTUZDb250ZXh0KGFQcm9qZWN0LCBjb250cmlidXRvcik7Ci0JfQotCi0JLyoqCi0JICogRG9lcyB0aGUgcGFzc2VkIFVSSSBoYXZlIHRoZSBmb3JtIHBsYXRmb3JtOi9yZXNvdXJjZS8uLi4gPwotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIGEgcGxhdGZvcm0gcmVzb3VyY2UgcHJvdG9jb2wuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxhdGZvcm1SZXNvdXJjZVVSSShVUkkgdXJpKSB7Ci0JCXJldHVybiBKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1BST1RPQ09MLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmIEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UuZXF1YWxzKHVyaS5zZWdtZW50KDApKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFwaSBtYXkgYmUgdXNlZCB0byBjYWNoZSBhIFJlc291cmNlIGlmIGl0IGhhcyBhIFVSSSB0aGF0IGlzIFdvcmtzcGFjZSByZWxhdGl2ZS4gUmV0dXJuIHRydWUgaWYgaXQgaXMgY2FjaGVkLgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IHdhcyBzdWNjZXNzZnVsIHRvIGNhY2hlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYWNoZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KGFSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQlpZiAoc2V0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHNldC5nZXRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhcGkgaXMgdXNlZCBpZiB5b3UgY3JlYXRlIGEgbmV3IE1PRiByZXNvdXJjZSBhbmQgeW91IHdhbnQgdG8gYWRkIGl0IHRvIHRoZSBjb3JyZWN0IFJlc291cmNlU2V0LiBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkIHRoZSBJUHJvamVjdAotCSAqIHRoYXQgeW91IHdhbnQgYVJlc291cmNlIHRvIGJlIGNhY2hlZCB3aXRoaW4gYXMgd2VsbCBhcyB0aGUgSVBhdGggd2hpY2ggaXMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIG5ldyBSZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcGFyYW0gYVJlc291cmNlCi0JICogQHBhcmFtIGZ1bGxQYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZXNvdXJjZSB3YXMgY2FjaGVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYWNoZVJlc291cmNlKElQcm9qZWN0IGFQcm9qZWN0LCBSZXNvdXJjZSBhUmVzb3VyY2UsIElQYXRoIGZ1bGxQYXRoKSB7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsIHx8IGFSZXNvdXJjZSA9PSBudWxsIHx8ICFhUHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2VTZXQoYVByb2plY3QpOwotCQlpZiAoc2V0ICE9IG51bGwpIHsKLQkJCVVSSSBjb252ZXJ0ZWQgPSBzZXQuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKGFSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQlpZiAoY29udmVydGVkICE9IGFSZXNvdXJjZS5nZXRVUkkoKSkKLQkJCQlhUmVzb3VyY2Uuc2V0VVJJKGNvbnZlcnRlZCk7Ci0JCQlyZXR1cm4gc2V0LmdldFJlc291cmNlcygpLmFkZChhUmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBhdGggb2YgdGhlIHByb2plY3QgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvciByZWxhdGl2ZSB0byB0aGUgbGlzdCBvZiBjb250YWluZXJzIGluIHRoaXMgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlCi0JICogQHJldHVybiBwYXRoCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0dWFsUHJvamVjdFJlbGF0aXZlVVJJKElSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSA9PSBudWxsIHx8ICFhUmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGFSZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCUlQYXRoIHBhdGggPSBnZXRQYXRoSW5Qcm9qZWN0KHByb2plY3QsIGFSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJcmV0dXJuIHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVBhdGggdGhhdCBjYW4gYmUgdXNlZCB0byBsb2FkIGEgUmVzb3VyY2UgdXNpbmcgdGhlIDxjb2RlPmZ1bGxQYXRoPC9jb2RlPi4gVGhpcyB3aWxsIGJlIGEgcHJvamVjdCByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGZ1bGxQYXRoCi0JICogQHJldHVybiBwYXRoCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQYXRoSW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElQYXRoIGZ1bGxQYXRoKSB7Ci0JCUxpc3QgY29udGFpbmVycyA9IGdldFByb2plY3RVUklDb252ZXJ0ZXJDb250YWluZXJzKHByb2plY3QpOwotCQlpZiAoIWNvbnRhaW5lcnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGdldFBhdGhGcm9tQ29udGFpbmVycyhjb250YWluZXJzLCBmdWxsUGF0aCk7Ci0JCXJldHVybiBmdWxsUGF0aDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2V0UHJvamVjdFVSSUNvbnZlcnRlckNvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBuYXR1cmUgPSBjcmVhdGVFTUZDb250ZXh0KHByb2plY3QsIG51bGwpOwotCQlpZiAobmF0dXJlICE9IG51bGwpIHsKLQkJCVdvcmtiZW5jaFVSSUNvbnZlcnRlciBjb252ID0gKFdvcmtiZW5jaFVSSUNvbnZlcnRlcikgbmF0dXJlLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQlpZiAoY29udiAhPSBudWxsKQotCQkJCXJldHVybiBjb252LmdldElucHV0Q29udGFpbmVycygpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgcGF0aCBpcyBjb250YWluZWQgd2l0aGluIG9uZSBvZiB0aGUgbGlzdGVkIGNvbnRhaW5lcnMsIHRoZW4gcmV0dXJuIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcnMKLQkgKiBAcGFyYW0gZnVsbFBhdGgKLQkgKiBAcmV0dXJuIHBhdGggcmVsYXRpdmUgdG8gYSBjb250YWluZXIsIG9yIHVuY2hhbmdlZCBwYXRoIGlmIG5vdCBpbiBhIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFBhdGhGcm9tQ29udGFpbmVycyhMaXN0IGNvbnRhaW5lcnMsIElQYXRoIGZ1bGxQYXRoKSB7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKLQkJSVBhdGggcmVzdWx0OwotCQlpbnQgc2l6ZSA9IGNvbnRhaW5lcnMuc2l6ZSgpOwotCQlpbnQgbWF0Y2hpbmcgPSAtMTsKLQkJSVBhdGggY29udGFpbmVyUGF0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBjb250YWluZXJzLmdldChpKTsKLQkJCWNvbnRhaW5lclBhdGggPSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKTsKLQkJCW1hdGNoaW5nID0gZnVsbFBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKGNvbnRhaW5lclBhdGgpOwotCQkJaWYgKG1hdGNoaW5nID4gMCAmJiBtYXRjaGluZyA9PSBjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpKSB7Ci0JCQkJcmVzdWx0ID0gZnVsbFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhtYXRjaGluZyk7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0Lm1ha2VSZWxhdGl2ZSgpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZ1bGxQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSA8Y29kZT51cmk8L2NvZGU+IGhhcyBpdHMgY29udGFpbmVyIHNlZ21lbnRzIHZpc2libGUgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVycyBmb3IgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVyaSBpcyB2aXNpYmxlIGZyb20gdGhlIGlucHV0IGNvbnRhaW5lcnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRhaW5lclN0cnVjdHVyZShJUHJvamVjdCBwcm9qZWN0LCBVUkkgdXJpKSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgdXJpICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aCh1cmkudG9TdHJpbmcoKSk7Ci0JCQlMaXN0IGNvbnRhaW5lcnMgPSBnZXRQcm9qZWN0VVJJQ29udmVydGVyQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJCWludCBzZWdtZW50Q291bnQgPSBwYXRoLnNlZ21lbnRDb3VudCgpOwotCQkJSVBhdGggY29udGFpbmVyUGF0aCA9IHNlZ21lbnRDb3VudCA+IDEgPyBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSA6IG51bGw7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQljb250YWluZXIgPSAoSUNvbnRhaW5lcikgY29udGFpbmVycy5nZXQoaSk7Ci0JCQkJaWYgKCFjb250YWluZXIuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChzZWdtZW50Q291bnQgPT0gMSkgewotCQkJCQlpZiAoY29udGFpbmVyID09IHByb2plY3QpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGNvbnRhaW5lclBhdGggIT0gbnVsbCkgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IGNvbnRhaW5lci5nZXRGb2xkZXIoY29udGFpbmVyUGF0aCk7Ci0JCQkJCWlmIChmb2xkZXIgIT0gbnVsbCAmJiBmb2xkZXIuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgZm9yIHRoZSB1cmkuIFRoZSBVUkkgTVVTVCBiZSBlaXRoZXIgYSAiPGI+cGxhdGZvcm06L3Jlc291cmNlLzwvYj5wcm9qZWN0LW5hbWUvLi4uLiIgdHlwZSBVUkkgb3IgaXQKLQkgKiBtdXN0IGJlIG9mIHR5cGUgInByb2plY3QtbmFtZS8uLi4iLiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIHJlc291cmNlcyB0aGF0IGFyZSB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZXMuCi0JICogQW55IG90aGVyIHR5cGUgb2YgVVJJIHdpbGwgY2F1c2UgPGNvZGU+bnVsbDwvY29kZT4gdG8gYmUgcmV0dXJuZWQuIEl0IHdpbGwgYmUgbG9hZGVkIGlmIG5vdCBhbHJlYWR5IGxvYWRlZC4gSWYgaXQgaXMgbm90IHRvCi0JICogYmUgbG9hZGVkIGlmIG5vdCBsb2FkZWQgdXNlIHtAbGluayAjZ2V0UmVzb3VyY2UoVVJJLCBib29sZWFuKX0gaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpIG11c3QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLiIgZm9ybSBvciBpdCBtdXN0IGJlICJwcm9qZWN0LW5hbWUvLi4uIi4gQW55IG90aGVyIGZvcm0gd2lsbCBiZSBpbnZhbGlkLgotCSAqIEByZXR1cm4gcmVzb3VyY2UgaWYgdXJpIGlzIGZvciBhIHZhbGlkIHdvcmtiZW5jaCBwcm9qZWN0IHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2plY3Qgbm90IGZvdW5kIG9yIG5vdCBhIHZhbGlkIHByb2plY3QgcmVzb3VyY2UuCi0JICogCi0JICogQHRocm93cyBXcmFwcGVkRXhjZXB0aW9uIGlmIHZhbGlkIHByb2plY3QgZm9ybWF0IFVSSSBidXQgZmlsZSBub3QgZm91bmQgb3Igc29tZSBvdGhlciBlcnJvciBvbiBsb2FkLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFJlc291cmNlIGZvciB0aGUgcGFzc2VkIElGaWxlIHdpdGhvdXQgZm9yY2luZyBhIGxvYWQuCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUZpbGUgYUZpbGUpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKGFGaWxlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBSZXNvdXJjZSBmb3IgdGhlIHBhc3NlZCBJRmlsZSwgZm9yY2luZyBhIGxvYWQgaWYgPGNvZGU+bG9hZE9uRGVtYW5kPC9jb2RlPiBzYXlzIHNvLgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZQotCSAqIEBwYXJhbSBsb2FkT25EZW1hbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgZm9yY2UgYSBsb2FkIG9mIHJlc291cmNlIGlmIG5vdCBsb2FkZWQuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUZpbGUgYUZpbGUsIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCWlmIChhRmlsZSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGFGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSksIGxvYWRPbkRlbWFuZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVzb3VyY2UgZm9yIHRoZSBwYXNzZWQgSUZpbGUgd2l0aG91dCBhIGxvYWQgaWYgbm90IGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBsb2FkKElGaWxlIGFGaWxlKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZShhRmlsZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSBmb3IgdGhlIHVyaS4gVGhlIFVSSSBNVVNUIGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4uIiB0eXBlIFVSSSBvciBpdAotCSAqIG11c3QgYmUgb2YgdHlwZSAicHJvamVjdC1uYW1lLy4uLiIuIFRoaXMgbWV0aG9kIHdpbGwgb25seSByZXR1cm4gcmVzb3VyY2VzIHRoYXQgYXJlIHdvcmtiZW5jaCBwcm9qZWN0IHJlc291cmNlcy4KLQkgKiBBbnkgb3RoZXIgdHlwZSBvZiBVUkkgd2lsbCBjYXVzZSA8Y29kZT5udWxsPC9jb2RlPiB0byBiZSByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpIG11c3QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLiIgZm9ybSBvciBpdCBtdXN0IGJlICJwcm9qZWN0LW5hbWUvLi4uIi4gQW55IG90aGVyIGZvcm0gd2lsbCBiZSBpbnZhbGlkLgotCSAqIEBwYXJhbSBsb2FkT25EZW1hbmQgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBjYXVzZSByZXNvdXJjZSB0byBiZSBsb2FkZWQgaWYgbm90IGFscmVhZHkgbG9hZGVkLgotCSAqIEByZXR1cm4gcmVzb3VyY2UgaWYgdXJpIGlzIGZvciBhIHZhbGlkIHdvcmtiZW5jaCBwcm9qZWN0IHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9qZWN0IG5vdCBmb3VuZCwgb3Igbm90IGEgdmFsaWQgcHJvamVjdCByZXNvdXJjZSB1cmkuCi0JICogCi0JICogQHRocm93cyBXcmFwcGVkRXhjZXB0aW9uIGlmIHZhbGlkIHByb2plY3QgZm9ybWF0IFVSSSBidXQgZmlsZSBub3QgZm91bmQgb3Igc29tZSBvdGhlciBlcnJvciBvbiBsb2FkIGlmIGxvYWRPbkRlbWFuZCBpcyB0cnVlLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2VTZXQodXJpKTsKLQkJaWYgKHNldCAhPSBudWxsKQotCQkJcmV0dXJuIHNldC5nZXRSZXNvdXJjZSh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlU2V0IGZvciB0aGUgcGFzc2VkIFVSSS4gVGhlIFVSSSBzaG91bGQgYmUgaW4gdGhlIGZvcm1hdCBwbGF0Zm9ybTovcmVzb3VyY2Uve3Byb2plY3QgbmFtZX0vLi4uIG9yIHtwcm9qZWN0IG5hbWV9Ly4uLiBmb3IgdGhpcwotCSAqIGFwaSB0byB3b3JrLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IG9mIGNvcnJlY3QgZm9ybSBvciBwcm9qZWN0IGRvZXNuJ3QgaGF2ZSBhIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KFVSSSB1cmkpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QodXJpKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIGdldFJlc291cmNlU2V0KHByb2plY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBHZXQgdGhlIHByb2plY3QgZm9yIHRoZSB1cmkgaWYgdGhlIHVyaSBpcyBhIHZhbGlkIHdvcmtiZW5jaCBwcm9qZWN0IGZvcm1hdCB1cmkuIG51bGwgb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoVVJJIHVyaSkgewotCQlTdHJpbmcgcHJvamVjdE5hbWU7Ci0JCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkKLQkJCXByb2plY3ROYW1lID0gdXJpLnNlZ21lbnQoMSk7Ci0JCWVsc2UgaWYgKHVyaS5zY2hlbWUoKSA9PSBudWxsKSB7Ci0JCQlwcm9qZWN0TmFtZSA9IG5ldyBQYXRoKHVyaS5wYXRoKCkpLnNlZ21lbnQoMCk7IC8vYXNzdW1lIHByb2plY3QgbmFtZSBpcyBmaXJzdCBpbiB0aGUgVVJJCi0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChVUkkuZGVjb2RlKHByb2plY3ROYW1lKSk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBwcm9qZWN0OwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFJlc291cmNlU2V0IGZvciB0aGUgcGFzc2VkIElQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiByZXNvdXJjZSBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgbmF0ID0gY3JlYXRlRU1GQ29udGV4dChwcm9qZWN0LCBudWxsKTsKLQkJaWYgKG5hdCAhPSBudWxsKQotCQkJcmV0dXJuIG5hdC5nZXRSZXNvdXJjZVNldCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHdvcmtzcGFjZS4gKGp1c3QgdXNlIHtAbGluayBSZXNvdXJjZXNQbHVnaW4jZ2V0V29ya3NwYWNlKCl9KS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHNldAotCSAqIEByZXR1cm4gcHJvamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiByZXNvdXJjZSBzZXQgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFJlc291cmNlU2V0IHNldCkgewotCQlpZiAoc2V0ICE9IG51bGwpIHsKLQkJCWlmIChzZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpIHsKLQkJCQlQcm9qZWN0UmVzb3VyY2VTZXQgcHNldCA9IChQcm9qZWN0UmVzb3VyY2VTZXQpIHNldDsKLQkJCQlyZXR1cm4gcHNldC5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzUmVnaXN0ZXJlZFVSSU1hcHBpbmcoU3RyaW5nIGhyZWYpIHsKLQkJaWYgKGhyZWYgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGUgPSBocmVmOwotCQkJaW50IGluZGV4ID0gaHJlZi5pbmRleE9mKCcjJyk7Ci0JCQlpZiAoaW5kZXggPiAtMSkKLQkJCQlmaWxlID0gaHJlZi5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJcmV0dXJuIFVSSUNvbnZlcnRlci5VUklfTUFQLmdldChmaWxlKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9mIHRoZSByZXNvdXJjZXMgZnJvbSB0aGUgcmVzb3VyY2Ugc2V0IGFuZCB0aGVuIHVubG9hZCB0aGVtLiBVbmxvYWQgZm9yY2VzIGFsbCBvZiB0aGUgb2JqZWN0cyB0byBiZWNvbWUgcHJveGllcyBzbyBuZXh0IHJlc29sdmUgd2lsbAotCSAqIHJlbG9hZCB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqIEBwYXJhbSBhU2V0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFuZFVubG9hZEFsbChMaXN0IHJlc291cmNlcywgUmVzb3VyY2VTZXQgYVNldCkgewotCQlpZiAoYVNldCA9PSBudWxsIHx8IHJlc291cmNlcyA9PSBudWxsIHx8IHJlc291cmNlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWFTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlQWxsKHJlc291cmNlcyk7Ci0JCVJlc291cmNlIHJlczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCXJlcy51bmxvYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFR1cm4gb2JqZWN0IGludG8gYSBwcm94eS4KLQkgKiAKLQkgKiBAcGFyYW0gYW5PYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG9iamVjdCB3YXMgYWJsZSB0byBiZWNvbWUgYSBwcm94eS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYmVjb21lUHJveHkoRU9iamVjdCBhbk9iamVjdCkgewotCQlpZiAoYW5PYmplY3QgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzID0gYW5PYmplY3QuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlVUkkgdXJpID0gcmVzLmdldFVSSSgpOwotCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBhbk9iamVjdCkuZVNldFByb3h5VVJJKHVyaS5hcHBlbmRGcmFnbWVudChyZXMuZ2V0VVJJRnJhZ21lbnQoYW5PYmplY3QpKSk7Ci0JCQkJLy9hbk9iamVjdC5lQWRhcHRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgV3JhcHBlZEV4Y2VwdGlvbiBpcyBhY3R1YWxseSBhIFJlc291cmNlIE5vdCBGb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlZEV4Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpcyBleGNlcHRpb24gd3JhcHBlcnMgYSByZXNvdXJjZSBub3QgZm91bmQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVzb3VyY2VOb3RGb3VuZChXcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCkgewotCQlFeGNlcHRpb24gZXhjZXAgPSB3cmFwcGVkRXguZXhjZXB0aW9uKCk7Ci0JCXdoaWxlIChleGNlcCBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pIHsKLQkJCWV4Y2VwID0gKChXcmFwcGVkRXhjZXB0aW9uKSBleGNlcCkuZXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHByaW1Jc1Jlc291cmNlTm90Rm91bmQoZXhjZXApOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJpbUlzUmVzb3VyY2VOb3RGb3VuZChUaHJvd2FibGUgZXhjZXApIHsKLQkJaWYgKGV4Y2VwIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGV4Y2VwKS5nZXRTdGF0dXMoKTsKLQkJCXJldHVybiBzdGF0dXMuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQgJiYgUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUy5lcXVhbHMoc3RhdHVzLmdldFBsdWdpbigpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIFdyYXBwZWRFeGNlcHRpb24gaXMgYWN0dWFsbHkgYSBSZXNvdXJjZSBOb3QgRm91bmQuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZWRFeAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgZXhjZXB0aW9uIHdyYXBwZXJzIGEgcmVzb3VyY2Ugbm90IGZvdW5kLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jlc291cmNlTm90Rm91bmQoUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCkgewotCQlyZXR1cm4gcHJpbUlzUmVzb3VyY2VOb3RGb3VuZCh3cmFwcGVkRXguZ2V0Q2F1c2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgVVJJIHJlcHJlc2VuYXRpb24gb2YgdGhlIHBsYXRmb3JtVVJJIHdpdGhvdXQgdGhlIGxlYWRpbmcgInBsYXRmb3JtOi9yZXNvdXJjZS8iIGlmIHByZXNlbnQuCi0JICogCi0JICogQHBhcmFtIHBsYXRmb3JtVVJJCi0JICogQHJldHVybiB1cmkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXROb25QbGF0Zm9ybVVSSShVUkkgcGxhdGZvcm1VUkkpIHsKLQkJaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVVSSShwbGF0Zm9ybVVSSSkpIHsKLQkJCVN0cmluZyB1cmlTdHJpbmcgPSBwcmltR2V0Tm9uUGxhdGZvcm1VUklTdHJpbmcocGxhdGZvcm1VUkkpOwotCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gcGxhdGZvcm1VUkk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VuYXRpb24gb2YgdGhlIHBsYXRmb3JtVVJJIHdpdGhvdXQgdGhlIGxlYWRpbmcgInBsYXRmb3JtOi9yZXNvdXJjZS8iIGlmIHByZXNlbnQuCi0JICogCi0JICogQHBhcmFtIHBsYXRmb3JtVVJJCi0JICogQHJldHVybgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vblBsYXRmb3JtVVJJU3RyaW5nKFVSSSBwbGF0Zm9ybVVSSSkgewotCQlpZiAoaXNQbGF0Zm9ybVJlc291cmNlVVJJKHBsYXRmb3JtVVJJKSkgeyByZXR1cm4gcHJpbUdldE5vblBsYXRmb3JtVVJJU3RyaW5nKHBsYXRmb3JtVVJJKTsgfQotCQlyZXR1cm4gcGxhdGZvcm1VUkkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIFJlbW92ZSAicGxhdGZvcm06L3Jlc291cmNlLyIgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHBsYXRmb3JtVVJJIGFuZCByZXR1cm4gdGhlIHJlbWFpbmluZyBTdHJpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByaW1HZXROb25QbGF0Zm9ybVVSSVN0cmluZyhVUkkgcGxhdGZvcm1VUkkpIHsKLQkJU3RyaW5nIHVyaVN0cmluZyA9IHBsYXRmb3JtVVJJLnRvU3RyaW5nKCk7Ci0JCS8vInBsYXRmb3JtOi9yZXNvdXJjZS8iIGlzIDE5IGNoYXJhY3RlcnMuCi0JCXJldHVybiB1cmlTdHJpbmcuc3Vic3RyaW5nKDE5LCB1cmlTdHJpbmcubGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIERvZXMgdGhlIHBhc3NlZCBVUkkgaGF2ZSB0aGUgZm9ybSBwbGF0Zm9ybTovcGx1Z2luLy4uLiA/Ci0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdXJpIGlzIHBsYXRmb3JtIHBsdWdpbiBwcm90b2NvbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQbGF0Zm9ybVBsdWdpblJlc291cmNlVVJJKFVSSSB1cmkpIHsKLQkJaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1BST1RPQ09MLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmIEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUExVR0lOLmVxdWFscyh1cmkuc2VnbWVudCgwKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hVUklDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1Njg1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hVUklDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFdvcmtiZW5jaFVSSUNvbnZlcnRlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotCi0vKioKLSAqIEltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSBhcmUgV29ya2JlbmNoVVJJIGNvbnZlcnRlcnMuIFdvcmtiZW5jaCBVUkkgY29udmVydGVycyBoYW5kbGUgcmVmZXJlbmNlcyB0byBmaWxlcyBpbiB0aGUgcHJvamVjdCdzIGNvbnRhaW5lcnMuCi0gKiBUaGlzIGNvbnZlcnRlciBpcyBvbmx5IG5lY2Vzc2FyeSB0byByZXNvbHZlIG9sZCBhbWJpZ3VvdXMgd29ya2JlbmNoIFVSSXMuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXIgewotCi0JLyoqCi0JICogQWRkIGlucHV0IGNvbnRhaW5lciB0byB0byB0aGUgY29udmVydGVyLgotCSAqIAotCSAqIEBwYXJhbSBhQ29udGFpbmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBhZGRJbnB1dENvbnRhaW5lcihJQ29udGFpbmVyIGFDb250YWluZXIpOwotCi0JLyoqCi0JICogQWRkIGxpc3Qgb2YgY29udGFpbmVycyB0byB0aGUgY29udmVydGVyLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXJzCi0JICogICAgICAgICAgICBsaXN0IG9mIDxjb2RlPklDb250YWluZXI8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBhZGRJbnB1dENvbnRhaW5lcnMoTGlzdCBjb250YWluZXJzKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZmlsZSByZWxhdGl2ZSB0byBhIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBmaWxlIHJlbGF0aXZlIHRvIGEgY29udGFpbmVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJRmlsZSBnZXRGaWxlKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogR2V0IGZpcnN0IGlucHV0IGNvbnRhaW5lcgotCSAqIAotCSAqIEByZXR1cm4gZmlyc3QgaW5wdXQgY29udGFpbmVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUlDb250YWluZXIgZ2V0SW5wdXRDb250YWluZXIoKTsKLQotCS8qKgotCSAqIEdldCBhbGwgaW5wdXQgY29udGFpbmVycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCBpbnB1dCBjb250YWluZXJzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUxpc3QgZ2V0SW5wdXRDb250YWluZXJzKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG91dHB1dCBjb250YWluZXIgaWYgc2V0LgotCSAqIAotCSAqIEByZXR1cm4gb3V0cHV0IGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUlDb250YWluZXIgZ2V0T3V0cHV0Q29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG91dHB1dCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgc2V0T3V0cHV0Q29udGFpbmVyKElDb250YWluZXIgY29udGFpbmVyKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBJRmlsZSBmb3IKLQkgKiAKLQkgKiBAYVBhdGguIElmIHdlIGhhdmUgYSBwYXJlbnQgYW5kIHdlIGRvIG5vdCBjb250YWluIHRoZSBmaXJzdCBzZWdtZW50IG9mIHRoZSBhUGF0aCwgZm9yd2FyZCB0byB0aGUgcGFyZW50IHRvIHJldHJpZXZlIHRoZSBmaWxlLgotCSAqIEBwYXJhbSBhUGF0aAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJRmlsZSBnZXRPdXRwdXRGaWxlKElQYXRoIGFQYXRoKTsKLQotCS8qKgotCSAqIEdldCBvdXRwdXQgZmlsZSB3aXRoIG1hcHBpbmcgYXBwbGllZC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUlGaWxlIGdldE91dHB1dEZpbGVXaXRoTWFwcGluZ0FwcGxpZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgaW5wdXQgY29udGFpbmVyIGZyb20gbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gYUNvbnRhaW5lcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlib29sZWFuIHJlbW92ZUlucHV0Q29udGFpbmVyKElDb250YWluZXIgYUNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gcmV0cmlldmUgdGhlIHJlc291cmNlIHVzZWQgdG8gb3BlbiBhbiBpbnB1dCBzdHJlYW0gb24uCi0JICogCi0JICogQHBhcmFtIGFGaWxlTmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmlsZW5hbWUgaXMgdmFsaWQgZm9yIGZpbGUgc3RyZWFtIGFjY2Vzcy4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKiAgCi0JICovCi0JYm9vbGVhbiBjYW5HZXRVbmRlcmx5aW5nUmVzb3VyY2UoU3RyaW5nIGFGaWxlTmFtZSk7Ci0KLQkvKioKLQkgKiBJcyBmb3JjZSBzYXZlIHJlbGF0aXZlIGZsYWcgdHVybmVkIG9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZm9yY2Ugc2F2ZSByZWxhdGl2ZSBpcyB0dXJuZWQgb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JYm9vbGVhbiBpc0ZvcmNlU2F2ZVJlbGF0aXZlKCk7Ci0KLQkvKioKLQkgKiBTZXQgdG8gdHJ1ZSBpZiB5b3UgZG8gbm90IHdhbnQgYW55IHBhdGggbWFuaXB1bGF0aW9uIHdoZW4gY3JlYXRpbmcgdGhlIG91dHB1dCBzdHJlYW0uLgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZVNhdmVSZWxhdGl2ZQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZm9yY2Ugc2F2ZXMgYXMgcmVsYXRpdmUuCi0JICovCi0Jdm9pZCBzZXRGb3JjZVNhdmVSZWxhdGl2ZShib29sZWFuIGZvcmNlU2F2ZVJlbGF0aXZlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2NTU1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogV29ya2JlbmNoVVJJQ29udmVydGVySW1wbC5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjYgJCQgICQkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo0NSAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyIGludGVyZmFjZS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsIGV4dGVuZHMgVVJJQ29udmVydGVySW1wbCBpbXBsZW1lbnRzIFdvcmtiZW5jaFVSSUNvbnZlcnRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBXT1JLU1BBQ0VfUk9PVCA9IFVSSUNvbnZlcnRlckltcGwud29ya3NwYWNlUm9vdDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV09SS1NQQUNFX1JPT1RfTE9DQVRJT04gPSBXT1JLU1BBQ0VfUk9PVC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggSU5WQUxJRF9QQVRIID0gbmV3IFBhdGgoIiEhISF+ISEhISIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsZSBJTlZBTElEX0ZJTEUgPSBXT1JLU1BBQ0VfUk9PVC5nZXRGaWxlKElOVkFMSURfUEFUSC5hcHBlbmQoSU5WQUxJRF9QQVRIKSk7Ci0KLQkvL1VzZWQgdG8gYXZvaWQgdHJ5aW5nIHRvIGZpeHVwIHRoZSBVUkkgd2hlbiBnZXR0aW5nIHRoZQotCS8vT3V0cHV0U3RyZWFtCi0JcHJvdGVjdGVkIGJvb2xlYW4gZm9yY2VTYXZlUmVsYXRpdmUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBMaXN0IGlucHV0Q29udGFpbmVyczsKLQotCXByb3RlY3RlZCBJQ29udGFpbmVyIG91dHB1dENvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciByZXNvdXJjZVNldFN5bmNocm9uaXplcjsKLQkKLQkvKgotCSAqIEtMVURHRTogV2UgbmVlZCB0byBrbm93IHRoZSBtZXRhIGRhdGEgYXJlYS4gVGhpcyBpcyBzbyB0aGF0IGFueSB1cmkgdGhhdCBzdGFydHMgd2l0aCB0aGUgbWV0YWRhdGEgZGlyZWN0b3J5Ci0JICogaXMgY29uc2lkZXJlZCBhIGZpbGUgdXJpIGFuZCBOT1QgYSB3b3Jrc3BhY2UgdXJpLiBUaGUgbWV0YWRhdGEgaXMgd2hlcmUgcGx1Z2luJ3Mgc3RvcmUgdGhlaXIgd29ya2luZyBkYXRhLgotCSAqIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLQkgKiAgCi0JICogVGhlcmUgaXMgbm8gcmVxdWVzdCBmb3Igc2ltcGx5IHRoZSBtZXRhZGF0YSBhcmVhLiBUaGUgbG9nIGZpbGUgaXMgaW4gdGhlIG1ldGFkYXRhIGRpcmVjdG9yeS4gU28gd2Ugd2lsbAotCSAqIGdldCB0aGUgbG9nIGZpbGUgbG9jYXRpb24gYW5kIGp1c3QgcmVtb3ZlIHRoZSBsb2cgZmlsZSBuYW1lLiBUaGF0IHNob3VsZCBsZWF2ZSB1cyB3aXRoIHRoZSBtZXRhZGF0YSBkaXJlY3RvcnkKLQkgKiBvbmx5LiBJZiBFY2xpcHNlIGV2ZXIgZGVjaWRlcyB0byBtb3ZlIGl0IGZyb20gaGVyZSwgdGhpcyB3aWxsIG5vIGxvbmdlciB3b3JrLiBCdXQgaXQgaGFzbid0IG1vdmVkIGluIHRocmVlIAotCSAqIHZlcnNpb25zLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0xPQ0FUSU9OID0gUGxhdGZvcm0uZ2V0TG9nRmlsZUxvY2F0aW9uKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnZlcnRlciBjb25zdHJ1Y3Rvciwgbm8gY29udGFpbmVycy4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhbiBpbnB1dCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFuSW5wdXRDb250YWluZXIpIHsKLQkJdGhpcyhhbklucHV0Q29udGFpbmVyLCAoUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIpIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGFuIGlucHV0IGNvbnRhaW5lciBhbmQgYSBzeW5jaHJvbnppZXIuCi0JICogCi0JICogQHBhcmFtIGFDb250YWluZXIKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYUNvbnRhaW5lciwgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcikgewotCQl0aGlzKGFDb250YWluZXIsIG51bGwsIGFTeW5jaHJvbml6ZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGFuIGlucHV0IGNvbnRhaW5lciBhbmQgYW4gb3V0cHV0IGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgotCSAqIEBwYXJhbSBhbk91dHB1dENvbnRhaW5lcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYW5JbnB1dENvbnRhaW5lciwgSUNvbnRhaW5lciBhbk91dHB1dENvbnRhaW5lcikgewotCQl0aGlzKGFuSW5wdXRDb250YWluZXIsIGFuT3V0cHV0Q29udGFpbmVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhbiBpbnB1dCBjb250YWluZXIsIG91dHB1dCBjb250YWluZXIsIGFuZCBhIHN5bmNocm9uaXplci4KLQkgKiAKLQkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgotCSAqIEBwYXJhbSBhbk91dHB1dENvbnRhaW5lcgotCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhbklucHV0Q29udGFpbmVyLCBJQ29udGFpbmVyIGFuT3V0cHV0Q29udGFpbmVyLCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBhU3luY2hyb25pemVyKSB7Ci0JCWFkZElucHV0Q29udGFpbmVyKGFuSW5wdXRDb250YWluZXIpOwotCQlzZXRPdXRwdXRDb250YWluZXIoYW5PdXRwdXRDb250YWluZXIpOwotCQlyZXNvdXJjZVNldFN5bmNocm9uaXplciA9IGFTeW5jaHJvbml6ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNhZGRJbnB1dENvbnRhaW5lcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZElucHV0Q29udGFpbmVyKElDb250YWluZXIgYUNvbnRhaW5lcikgewotCQlpZiAoYUNvbnRhaW5lciAhPSBudWxsICYmICFnZXRJbnB1dENvbnRhaW5lcnMoKS5jb250YWlucyhhQ29udGFpbmVyKSkKLQkJCWdldElucHV0Q29udGFpbmVycygpLmFkZChhQ29udGFpbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2FkZElucHV0Q29udGFpbmVycyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbnB1dENvbnRhaW5lcnMoTGlzdCBjb250YWluZXJzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmVycy5zaXplKCk7IGkrKykgewotCQkJYWRkSW5wdXRDb250YWluZXIoKElDb250YWluZXIpIGNvbnRhaW5lcnMuZ2V0KGkpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjcmVtb3ZlSW5wdXRDb250YWluZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJbnB1dENvbnRhaW5lcihJQ29udGFpbmVyIGFDb250YWluZXIpIHsKLQkJcmV0dXJuIGdldElucHV0Q29udGFpbmVycygpLnJlbW92ZShhQ29udGFpbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2dldElucHV0Q29udGFpbmVycygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5wdXRDb250YWluZXJzKCkgewotCQlpZiAoaW5wdXRDb250YWluZXJzID09IG51bGwpCi0JCQlpbnB1dENvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBpbnB1dENvbnRhaW5lcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRJbnB1dENvbnRhaW5lcigpCi0JICovCi0JcHVibGljIElDb250YWluZXIgZ2V0SW5wdXRDb250YWluZXIoKSB7Ci0JCWlmICghZ2V0SW5wdXRDb250YWluZXJzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIChJQ29udGFpbmVyKSBnZXRJbnB1dENvbnRhaW5lcnMoKS5nZXQoMCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0T3V0cHV0Q29udGFpbmVyKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lciBnZXRPdXRwdXRDb250YWluZXIoKSB7Ci0JCWlmIChvdXRwdXRDb250YWluZXIgPT0gbnVsbCkKLQkJCW91dHB1dENvbnRhaW5lciA9IGdldElucHV0Q29udGFpbmVyKCk7Ci0JCXJldHVybiBvdXRwdXRDb250YWluZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNzZXRPdXRwdXRDb250YWluZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRwdXRDb250YWluZXIoSUNvbnRhaW5lciBuZXdPdXRwdXRDb250YWluZXIpIHsKLQkJb3V0cHV0Q29udGFpbmVyID0gbmV3T3V0cHV0Q29udGFpbmVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0T3V0cHV0RmlsZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIElGaWxlIGdldE91dHB1dEZpbGUoSVBhdGggYVBhdGgpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmIChnZXRPdXRwdXRDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZm9yY2VTYXZlUmVsYXRpdmUpCi0JCQkJcmV0dXJuIHByaW1HZXRPdXRwdXRGaWxlKGFQYXRoKTsKLQkJCWZpbGUgPSBnZXRPdXRwdXRGaWxlRm9yUGF0aFdpdGhDb250YWluZXJTZWdtZW50cyhhUGF0aCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXJldHVybiBmaWxlOwotCQkJZWxzZQotCQkJCXJldHVybiBwcmltR2V0T3V0cHV0RmlsZShhUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWxlIHByaW1HZXRPdXRwdXRGaWxlKElQYXRoIGFQYXRoKSB7Ci0JCXJldHVybiBwcmltR2V0RmlsZShnZXRPdXRwdXRDb250YWluZXIoKSwgYVBhdGgpOwotCX0KLQotCXByb3RlY3RlZCBJRmlsZSBnZXRPdXRwdXRGaWxlRm9yUGF0aFdpdGhDb250YWluZXJTZWdtZW50cyhJUGF0aCBhUGF0aCkgewotCQlJQ29udGFpbmVyIG91dCA9IGdldE91dHB1dENvbnRhaW5lcigpOwotCQlyZXR1cm4gZ2V0RmlsZUZvclBhdGhXaXRoQ29udGFpbmVyU2VnbWVudHMoYVBhdGgsIG91dCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlRm9yUGF0aFdpdGhDb250YWluZXJTZWdtZW50cyhJUGF0aCBhUGF0aCwgSUNvbnRhaW5lciBjb250YWluZXIsIGJvb2xlYW4gdGVzdEV4aXN0cykgewotCQlJUGF0aCBjb250YWluZXJQYXRoID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmICh0ZXN0RXhpc3RzKSB7Ci0JCQljb250YWluZXJQYXRoID0gY29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCWlmICghY29udGFpbmVyUGF0aC5pc0VtcHR5KCkpIHsKLQkJCQlmaWxlID0gZ2V0RmlsZUZvck1hdGNoaW5nUGF0aChhUGF0aCwgY29udGFpbmVyUGF0aCwgY29udGFpbmVyKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpCi0JCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQl9Ci0JCWNvbnRhaW5lclBhdGggPSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKTsKLQkJZmlsZSA9IGdldEZpbGVGb3JNYXRjaGluZ1BhdGgoYVBhdGgsIGNvbnRhaW5lclBhdGgsIGNvbnRhaW5lcik7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlRm9yTWF0Y2hpbmdQYXRoKElQYXRoIGNvbnRhaW5lclBhdGgsIElQYXRoIHNvdXJjZVBhdGgsIElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCWludCBtYXRjaGVzID0gMDsKLQkJbWF0Y2hlcyA9IGNvbnRhaW5lclBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHNvdXJjZVBhdGgpOwotCQlpZiAobWF0Y2hlcyA+IDAgJiYgbWF0Y2hlcyA9PSBzb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpKSB7Ci0JCQlJUGF0aCBsb2FkUGF0aCA9IGNvbnRhaW5lclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhtYXRjaGVzKTsKLQkJCXJldHVybiBwcmltR2V0RmlsZShjb250YWluZXIsIGxvYWRQYXRoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2dldEZpbGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBnZXRGaWxlKG5ldyBQYXRoKHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlsZSBmcm9tIHRoZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybgotCSAqIEBzZWUgV29ya2JlbmNoVVJJQ29udmVydGVyI2dldEZpbGUoU3RyaW5nKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKElQYXRoIHBhdGgpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmIChnZXRJbnB1dENvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCXBhdGggPSBwYXRoLm1ha2VSZWxhdGl2ZSgpOwotCQkJamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gZ2V0SW5wdXRDb250YWluZXJzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJQ29udGFpbmVyIGNvbiA9IChJQ29udGFpbmVyKSBpdC5uZXh0KCk7Ci0JCQkJZmlsZSA9IGdldElucHV0RmlsZShjb24sIHBhdGgpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKLQkJCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBJTlZBTElEX0ZJTEU7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIEdldCBvdXRwdXQgZmlsZSBmcm9tIHN0cmluZyBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNlZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0T3V0cHV0RmlsZShJUGF0aCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0T3V0cHV0RmlsZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBnZXRPdXRwdXRGaWxlKG5ldyBQYXRoKHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgaW5wdXQgZmlsZSBmcm9tIHRoZSBjb250YWluZXIgYW5kIHBhdGguCi0JICogCi0JICogQHBhcmFtIGNvbgotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRJbnB1dEZpbGUoSUNvbnRhaW5lciBjb24sIElQYXRoIHBhdGgpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmIChXT1JLU1BBQ0VfUk9PVC5lcXVhbHMoY29uKSAmJiBwYXRoLnNlZ21lbnRDb3VudCgpIDwgMikKLQkJCXBhdGggPSBJTlZBTElEX1BBVEguYXBwZW5kKHBhdGgpOwotCQlmaWxlID0gcHJpbUdldEZpbGUoY29uLCBwYXRoKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkKLQkJCWZpbGUgPSBnZXRGaWxlRm9yUGF0aFdpdGhDb250YWluZXJTZWdtZW50cyhwYXRoLCBjb24sIHRydWUpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbGUgcHJpbUdldEZpbGUoSUNvbnRhaW5lciBjb250YWluZXIsIElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb250YWluZXIuZ2V0RmlsZShwYXRoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNjYW5HZXRVbmRlcmx5aW5nUmVzb3VyY2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5HZXRVbmRlcmx5aW5nUmVzb3VyY2UoU3RyaW5nIGFGaWxlTmFtZSkgewotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShhRmlsZU5hbWUpOwotCQlyZXR1cm4gZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNpc0ZvcmNlU2F2ZVJlbGF0aXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlU2F2ZVJlbGF0aXZlKCkgewotCQlyZXR1cm4gZm9yY2VTYXZlUmVsYXRpdmU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNzZXRGb3JjZVNhdmVSZWxhdGl2ZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcmNlU2F2ZVJlbGF0aXZlKGJvb2xlYW4gZm9yY2VTYXZlUmVsYXRpdmUpIHsKLQkJdGhpcy5mb3JjZVNhdmVSZWxhdGl2ZSA9IGZvcmNlU2F2ZVJlbGF0aXZlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlciNub3JtYWxpemUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi9wdWJsaWMgVVJJIG5vcm1hbGl6ZShVUkkgdXJpKSB7Ci0JCVVSSSByZXN1bHQgPSB1cmk7Ci0JCVN0cmluZyBmcmFnbWVudCA9IG51bGw7Ci0JCWlmICh1cmkuaGFzRnJhZ21lbnQoKSkgewotCQkJZnJhZ21lbnQgPSB1cmkuZnJhZ21lbnQoKTsKLQkJCXJlc3VsdCA9IHVyaS50cmltRnJhZ21lbnQoKTsKLQkJfQotCQlyZXN1bHQgPSBnZXRJbnRlcm5hbFVSSU1hcCgpLmdldFVSSShyZXN1bHQpOwotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSShyZXN1bHQpKQotCQkJcmV0dXJuIGFwcGVuZEZyYWdtZW50KHJlc3VsdCwgZnJhZ21lbnQpOwotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1QbHVnaW5SZXNvdXJjZVVSSShyZXN1bHQpKSB7Ci0JCQlVUkkgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBsdWdpblVSSShyZXN1bHQsIGZyYWdtZW50KTsKLQkJCXJldHVybiAobm9ybWFsaXplZCAhPSBudWxsKSA/IG5vcm1hbGl6ZWQgOiB1cmk7Ci0JCX0KLQkJU3RyaW5nIHByb3RvY29sID0gcmVzdWx0LnNjaGVtZSgpOwotCQlVUkkgZmlsZVNlYXJjaFVSSSA9IG51bGw7Ci0JCWlmIChwcm90b2NvbCA9PSBudWxsKSB7Ci0JCQlmaWxlU2VhcmNoVVJJID0gbm9ybWFsaXplRW1wdHlQcm90b2NvbChyZXN1bHQsIGZyYWdtZW50KTsKLQkJCWlmIChmaWxlU2VhcmNoVVJJICE9IG51bGwpCi0JCQkJcmV0dXJuIGZpbGVTZWFyY2hVUkk7Ci0JCX0gZWxzZSBpZiAoRklMRV9QUk9UT0NPTC5lcXVhbHMocHJvdG9jb2wpKSB7Ci0JCQlmaWxlU2VhcmNoVVJJID0gbm9ybWFsaXplRmlsZVByb3RvY29sKHJlc3VsdCwgZnJhZ21lbnQpOwotCQkJaWYgKGZpbGVTZWFyY2hVUkkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmlsZVNlYXJjaFVSSTsKLQkJfSBlbHNlIGlmIChKRU1VdGlsUGx1Z2luLldPUktTUEFDRV9QUk9UT0NPTC5lcXVhbHMocHJvdG9jb2wpKQotCQkJcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVByb3RvY29sKHJlc3VsdCwgZnJhZ21lbnQpOwotCQlyZXR1cm4gc3VwZXIubm9ybWFsaXplKHVyaSk7Ci0JfQotCi0JLyoKLQkgKiBSZXNvbHZlcyBhIHBsdWdpbiBmb3JtYXQgaW50byB0aGUgYWN0dWFsLgotCSAqLwotCXByb3RlY3RlZCBVUkkgbm9ybWFsaXplUGx1Z2luVVJJKFVSSSB1cmksIFN0cmluZyBmcmFnbWVudCkgewotCQlpZiAodXJpLnNlZ21lbnRDb3VudCgpIDwgMikKLQkJCXJldHVybiB1cmk7IC8vIEludmFsaWQsIGp1c3QgbGV0IGl0IGdvIG9uLgotCQkvLyBTZWUgaWYgYWxyZWFkeSBub3JtYWxpemVkLgotCQlpbnQgdV9zY29yZU5keCA9IHVyaS5zZWdtZW50KDEpLmxhc3RJbmRleE9mKCdfJyk7Ci0JCWlmICh1X3Njb3JlTmR4ICE9IC0xKSB7Ci0JCQkvLyBOb3Qgbm9ybWFsaXplZC4gUmVtb3ZlIHRoZSB2ZXJzaW9uIHRvIG1ha2UgaXQgbm9ybWFsaXplZC4KLQkJCVN0cmluZ1tdIHNlZ21lbnRzID0gdXJpLnNlZ21lbnRzKCk7Ci0JCQlzZWdtZW50c1sxXSA9IHNlZ21lbnRzWzFdLnN1YnN0cmluZygwLCB1X3Njb3JlTmR4KTsKLQkJCXJldHVybiBVUkkuY3JlYXRlSGllcmFyY2hpY2FsVVJJKHVyaS5zY2hlbWUoKSwgdXJpLmF1dGhvcml0eSgpLCB1cmkuZGV2aWNlKCksIHNlZ21lbnRzLCB1cmkucXVlcnkoKSwgZnJhZ21lbnQpOwotCQl9IGVsc2UKLQkJCXJldHVybiB1cmk7Ci0JfQotCi0JcHJvdGVjdGVkIFVSSSBub3JtYWxpemVXb3Jrc3BhY2VQcm90b2NvbChVUkkgYVdvcmtzcGFjZVVSSSwgU3RyaW5nIGZyYWdtZW50KSB7Ci0JCVVSSSByZXN1bHQ7Ci0JCVN0cmluZyB1cmlTdHJpbmcgPSBhV29ya3NwYWNlVVJJLnRvU3RyaW5nKCk7Ci0JCXVyaVN0cmluZyA9IHVyaVN0cmluZy5zdWJzdHJpbmcoSkVNVXRpbFBsdWdpbi5XT1JLU1BBQ0VfUFJPVE9DT0wubGVuZ3RoKCkgKyAxKTsKLQkJcmVzdWx0ID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkodXJpU3RyaW5nKTsKLQkJaWYgKGZyYWdtZW50ICE9IG51bGwpCi0JCQlyZXN1bHQgPSBhcHBlbmRGcmFnbWVudChhV29ya3NwYWNlVVJJLCBmcmFnbWVudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBVUkkgbm9ybWFsaXplRW1wdHlQcm90b2NvbChVUkkgYUZpbGVVcmksIFN0cmluZyBmcmFnbWVudCkgewotCQkvL01ha2UgdGhlIHJlbGF0aXZlIHBhdGggYWJzb2x1dGUgYW5kIHJldHVybiBhIHBsYXRmb3JtIFVSSS4KLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGFGaWxlVXJpLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gbm9ybWFsaXplVG9Xb3Jrc3BhY2VVUkkocGF0aCwgZnJhZ21lbnQpOwotCX0KLQkKLQlwcml2YXRlIFVSSSBub3JtYWxpemVUb1dvcmtzcGFjZVVSSShJUGF0aCBwYXRoLCBTdHJpbmcgZnJhZ21lbnQpIHsKLQkJVVJJIHJlc3VsdCA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHBhdGgpOwotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKQotCQkJZmlsZSA9IGdldE91dHB1dEZpbGUocGF0aCk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCXJlc3VsdCA9IGFwcGVuZEZyYWdtZW50KHJlc3VsdCwgZnJhZ21lbnQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBVUkkgbm9ybWFsaXplRmlsZVByb3RvY29sKFVSSSBhRmlsZVVyaSwgU3RyaW5nIGZyYWdtZW50KSB7Ci0JCVVSSSByZXN1bHQgPSBudWxsOwotCQkvL01ha2UgdGhlIHJlbGF0aXZlIHBhdGggYWJzb2x1dGUgYW5kIHJldHVybiBhIHBsYXRmb3JtIFVSSS4KLQkJU3RyaW5nIGRldmljZVBhdGggPSBhRmlsZVVyaS5kZXZpY2VQYXRoKCk7Ci0JCS8vVGVzdCBmb3Igd29ya3NwYWNlIGxvY2F0aW9uLgotCQlpZiAoIWRldmljZVBhdGguc3RhcnRzV2l0aChNRVRBREFUQV9MT0NBVElPTikgJiYKLQkJCWRldmljZVBhdGguc3RhcnRzV2l0aChXT1JLU1BBQ0VfUk9PVF9MT0NBVElPTikgJiYgZGV2aWNlUGF0aC5sZW5ndGgoKSA+IFdPUktTUEFDRV9ST09UX0xPQ0FUSU9OLmxlbmd0aCgpKSB7Ci0JCQkvL3Rlc3QgZm9yIHdvcmtzcGFjZSBsb2NhdGlvbgotCQkJcmVzdWx0ID0gbm9ybWFsaXplVG9Xb3Jrc3BhY2VVUkkobmV3IFBhdGgoZGV2aWNlUGF0aC5zdWJzdHJpbmcoV09SS1NQQUNFX1JPT1RfTE9DQVRJT04ubGVuZ3RoKCkpKSwgZnJhZ21lbnQpOwotCQl9IGVsc2UgaWYgKGFGaWxlVXJpLmlzUmVsYXRpdmUoKSkgewotCQkJcmVzdWx0ID0gbm9ybWFsaXplVG9Xb3Jrc3BhY2VVUkkobmV3IFBhdGgoYUZpbGVVcmkudG9TdHJpbmcoKSksIGZyYWdtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGFGaWxlVXJpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBVUkkgYXBwZW5kRnJhZ21lbnQoVVJJIHJlc3VsdCwgU3RyaW5nIGZyYWdtZW50KSB7Ci0JCWlmIChmcmFnbWVudCAhPSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdC5hcHBlbmRGcmFnbWVudChmcmFnbWVudCk7Ci0JCWVsc2UKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRPdXRwdXRGaWxlV2l0aE1hcHBpbmdBcHBsaWVkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElGaWxlIGdldE91dHB1dEZpbGVXaXRoTWFwcGluZ0FwcGxpZWQoU3RyaW5nIHVyaSkgewotCQlVUkkgY29udmVydGVkID0gZ2V0SW50ZXJuYWxVUklNYXAoKS5nZXRVUkkoVVJJLmNyZWF0ZVVSSSh1cmkpKTsKLQkJcmV0dXJuIGdldE91dHB1dEZpbGUobmV3IFBhdGgoY29udmVydGVkLnRvU3RyaW5nKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGwjY3JlYXRlUGxhdGZvcm1SZXNvdXJjZU91dHB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPdXRwdXRTdHJlYW0gY3JlYXRlUGxhdGZvcm1SZXNvdXJjZU91dHB1dFN0cmVhbShTdHJpbmcgcGxhdGZvcm1SZXNvdXJjZVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSBXT1JLU1BBQ0VfUk9PVC5nZXRGaWxlKG5ldyBQYXRoKHBsYXRmb3JtUmVzb3VyY2VQYXRoKSk7Ci0JCVByb2plY3RVdGlsaXRpZXMuZW5zdXJlQ29udGFpbmVyTm90UmVhZE9ubHkoZmlsZSk7Ci0JCXJldHVybiBuZXcgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGZpbGUsIHJlc291cmNlU2V0U3luY2hyb25pemVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJJIGdldENvbnRhaW5lclJlbGF0aXZlVVJJKElGaWxlIGFGaWxlKSB7Ci0JCUlQYXRoIHBhdGggPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UGF0aEZyb21Db250YWluZXJzKGlucHV0Q29udGFpbmVycywgYUZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JCWlmIChwYXRoICE9IG51bGwpCi0JCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShwYXRoLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGwjY3JlYXRlUGxhdGZvcm1SZXNvdXJjZUlucHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgcGxhdGZvcm1SZXNvdXJjZVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSBXT1JLU1BBQ0VfUk9PVC5nZXRGaWxlKG5ldyBQYXRoKHBsYXRmb3JtUmVzb3VyY2VQYXRoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoIWZpbGUuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX09ORSkpIHsKLQkJCQl0cnkgewotCQkJCQlGaWxlIGlvZmlsZSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b0ZpbGUoKTsKLQkJCQkJaWYgKGlvZmlsZS5leGlzdHMoKSB8fCBmaWxlLmV4aXN0cygpKQotCQkJCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlpZiAoY2UuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpICE9IElSZXNvdXJjZVN0YXR1cy5XT1JLU1BBQ0VfTE9DS0VEKQotCQkJCQkJdGhyb3cgY2U7Ci0JCQkJfQotCQkJfQotCQkJLy8gQ0hBTkdFRCBmcm9tIDxuby1hcmdzPiB0byA8dHJ1ZT4gWzk0MDE1XQotCQkJcmV0dXJuIGZpbGUuZ2V0Q29udGVudHModHJ1ZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQl0aHJvdyBuZXcgUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvbmF0dXJlL0VNRk5hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvbmF0dXJlL0VNRk5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2YyODhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IEVNRk5hdHVyZS5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjQgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUGFyc2VyUG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUGFyc2VyUG9vbEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotCi0vKioKLSAqIFRoZSBiYXNlIEVNRk5hdHVyZS4KLSAqIDxwPgotICogVGhpcyBpcyBleHBlY3RlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMsIGJ1dCB0aGVyZSBhcmUgZGVmYXVsdCBzdWJjbGFzc2VzIGF2YWlsYWJsZS4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFTUZOYXR1cmUgaW1wbGVtZW50cyBJUHJvamVjdE5hdHVyZSwgSUVNRkNvbnRleHRDb250cmlidXRvciB7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBlbWZDb250ZXh0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQ29uZmlndXJlZCA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgWE1MUGFyc2VyUG9vbCBTSEFSRURfUEFSU0VSX1BPT0wgPSBuZXcgWE1MUGFyc2VyUG9vbEltcGwoKTsJCi0KLQlwdWJsaWMgRU1GTmF0dXJlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmF0dXJlIGlkIHRvIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qCi0JICogQHBhcmFtIG5hdHVyZUlkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUHJvamVjdFV0aWxpdGllcy5hZGROYXR1cmVUb1Byb2plY3QocHJvaiwgbmF0dXJlSWQpOwotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIHByb2plY3Qgd2l0aCB0aGlzIG5hdHVyZS4gVGhpcyBpcyBjYWxsZWQgYnkgPGNvZGU+SVByb2plY3QuYWRkTmF0dXJlPC9jb2RlPiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gVGhlCi0JICogbmF0dXJlIGV4dGVuc2lvbiBpZCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiBuYXR1cmVzIG9uIHRoZSBwcm9qZWN0IGJ5IDxjb2RlPklQcm9qZWN0LmFkZE5hdHVyZTwvY29kZT4sIGFuZCBuZWVkIG5vdCBiZSBhZGRlZCBoZXJlLgotCSAqIAotCSAqIDxwPgotCSAqIEFsbCBzdWJ0eXBlcyBtdXN0IGNhbGwgc3VwZXIuIFRoZSBiZXR0ZXIgd2F5IGZvciBzdWJ0eXBlcyBpcyB0byBvdmVycmlkZSBwcmltQ29uZmlndXJlIGluc3RlYWQuCi0JICogPC9wPgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZSgpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghaGFzQ29uZmlndXJlZCkgewotCQkJaGFzQ29uZmlndXJlZCA9IHRydWU7Ci0JCQlwcmltQ29uZmlndXJlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgZnJvbSBjb25maWd1cmUgdGhlIGZpcnN0IHRpbWUgY29uZmlndXJlIGlzIGNhbGxlZCBvbiB0aGUgbmF0dXJlLiBEZWZhdWx0IGlzIGRvIG5vdGhpbmcuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFuZCBhZGQgaW4gdGhlaXIgb3duCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUNvbmZpZ3VyZSgpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gRU1GIGNvbnRleHQgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVtZkNvbnRleHQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5jcmVhdGVFTUZDb250ZXh0KGdldFByb2plY3QoKSwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZm9sZGVyIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGJhc2VkIG9uIGFQcm9qZWN0UmVsYXRpdmVQYXRoU3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUZvbGRlciBjcmVhdGVGb2xkZXIoU3RyaW5nIGFQcm9qZWN0UmVsYXRpdmVQYXRoU3RyaW5nKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZyAhPSBudWxsICYmIGFQcm9qZWN0UmVsYXRpdmVQYXRoU3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBjcmVhdGVGb2xkZXIobmV3IFBhdGgoYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZm9sZGVyIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGJhc2VkIG9uIGFQcm9qZWN0UmVsYXRpdmVQYXRoU3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdFJlbGF0aXZlUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUZvbGRlciBjcmVhdGVGb2xkZXIoSVBhdGggYVByb2plY3RSZWxhdGl2ZVBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGFQcm9qZWN0UmVsYXRpdmVQYXRoICE9IG51bGwgJiYgIWFQcm9qZWN0UmVsYXRpdmVQYXRoLmlzRW1wdHkoKSkgewotCQkJSUZvbGRlciBmb2xkZXIgPSBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKGdldFByb2plY3RQYXRoKCkuYXBwZW5kKGFQcm9qZWN0UmVsYXRpdmVQYXRoKSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCVByb2plY3RVdGlsaXRpZXMuZW5zdXJlQ29udGFpbmVyTm90UmVhZE9ubHkoZm9sZGVyKTsKLQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIGZvbGRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoaXMgbmF0dXJlIGZyb20gdGhlIHByb2plY3QsIHBlcmZvcm1pbmcgYW55IHJlcXVpcmVkIGRlY29uZmlndXJhdGlvbi4gVGhpcyBpcyBjYWxsZWQgYnkgPGNvZGU+SVByb2plY3QucmVtb3ZlTmF0dXJlPC9jb2RlPiBhbmQKLQkgKiBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzLiBUaGUgbmF0dXJlIGlkIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBuYXR1cmVzIG9uIHRoZSBwcm9qZWN0IGJ5Ci0JICogPGNvZGU+SVByb2plY3QucmVtb3ZlTmF0dXJlPC9jb2RlPiwgYW5kIG5lZWQgbm90IGJlIHJlbW92ZWQgaGVyZS4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNvbmZpZ3VyZSgpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCWVtZkNvbnRleHQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBJRmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyBpbiB0aGlzIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFGaWxlTmFtZQotCSAqICAgICAgICAgICAgZmlsZW5hbWUgY2FuIGJlIHJlbGF0aXZlIHRvIG9uZSBvZiB0aGUgaW5wdXQgZmlsZSBwYXRocyBmb3IgdGhlIFdvcmtiZW5jaFVSSUNvbnZlcnRlci4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZpbGVuYW1lIGV4aXN0cyBpbiB0aGlzIHByb2plY3QKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaWxlRXhpc3RzKFN0cmluZyBhRmlsZU5hbWUpIHsKLQkJaWYgKGFGaWxlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChhRmlsZU5hbWUpOwotCQlpZiAocGF0aC5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmV4aXN0cygpOwotCQllbHNlCi0JCQlyZXR1cm4gZ2V0V29ya2JlbmNoVVJJQ29udmVydGVyKCkuY2FuR2V0VW5kZXJseWluZ1Jlc291cmNlKGFGaWxlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSBzZXQgZm9yIHRoZSBwcm9qZWN0Ci0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIGdldEVtZkNvbnRleHRCYXNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFTUYgcm9vdCBmb2xkZXIgZm9yIHRoZSBwcm9qZWN0LiBEZWZhdWx0cyB0byB0aGUgcHJvamVjdC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUuCi0JICogCi0JICogQHJldHVybiBFTUYgcm9vdCBmb2xkZXIgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyIGdldEVNRlJvb3QoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBmb3Igb3B0aW1pemF0aW9uczsgYW5zd2VycyB3aGV0aGVyIGEgbW9mIGNvbnRleHQgZm9yIHRoaXMgbmF0dXJlIGhhcyBleGlzdHMgeWV0Ci0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIGhhc1Jlc291cmNlU2V0KCk7Ci0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ29udGV4dCgpIHsKLQkJcmV0dXJuIGhhc1Jlc291cmNlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhlcmUgYSByZXNvdXJjZSBzZXQgeWV0IGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGEgcmVzb3VyY2Ugc2V0IGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIGVtZkNvbnRleHQgIT0gbnVsbCAmJiBlbWZDb250ZXh0Lmhhc1Jlc291cmNlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogTGF6eSBpbml0aWFsaXplcjsgZm9yIG1pZ3JhdGlvbiBvZiBleGlzdGluZyB3b3Jrc3BhY2VzIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5ldmVyIGdldCBjYWxsZWQuCi0JICogCi0JICogQHJldHVybiBjb250ZXh0IGJhc2UgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBnZXRFbWZDb250ZXh0QmFzZSgpIHsKLQkJaWYgKGVtZkNvbnRleHQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljcmVhdGVFbWZDb250ZXh0KCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW1mQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIElGaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUgaWYgaXQgaXMgaW4gdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIGZpbGVuYW1lIGNhbiBiZSByZWxhdGl2ZSB0byBvbmUgb2YgdGhlIGlucHV0IGZpbGUgcGF0aHMgZm9yIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIuCi0JICogQHJldHVybiBmaWxlIGl0IGl0IGlzIGluIHRoaXMgcHJvamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lc24ndC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgYUZpbGVOYW1lKSB7Ci0JCXJldHVybiBnZXRXb3JrYmVuY2hVUklDb252ZXJ0ZXIoKS5nZXRGaWxlKGFGaWxlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYXR1cmUncyBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIG5hdHVyZSBpZAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmF0dXJlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSUQgb2YgdGhlIHBsdWdpbiB0aGF0IHRoaXMgbmF0dXJlIGlzIGNvbnRhaW5lZCB3aXRoaW4uCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGx1Z2luSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBwcm9qZWN0IG5hdHVyZSBhcHBsaWVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgaGFuZGxlCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbCBwYXRoIG9mIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gZnVsbCBwcm9qZWN0IHBhdGggKHJlbGF0aXZlIHRvIHdvcmtzcGFjZSkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UHJvamVjdFBhdGgoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNlcnZlciBwcm9wZXJ0eSBvZiB0aGUgcHJvamVjdCBmcm9tIHRoZSBzdXBwbGllZCBrZXkKLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGRlcHJlY2F0ZWQgd2UgY2Fubm9udCB1c2UgcGVyc2lzdGVudCBwcm9wZXJ0aWVzIGJlY2F1c2UgdGhleSBhcmUgbm90IHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdFNlcnZlclZhbHVlKFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlRdWFsaWZpZWROYW1lIHdob2xlTmFtZSA9IHF1YWxpZmllZEtleShrZXkpOwotCQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRQZXJzaXN0ZW50UHJvcGVydHkod2hvbGVOYW1lKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vSWYgd2UgY2FuJ3QgZmluZCBpdCBhc3N1bWUgaXQgaXMgbnVsbAotCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgV29ya2JlbmNoVVJJQ29udmVydGVyIGZvciB0aGlzIHByb2plY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgVVJJQ29udmVydGVyIG9uIHRoZSBSZXNvdXJjZVNldCBpcyB0aGUgb25lIHRoYXQgd2FzIGNyZWF0ZWQgZm9yIHRoZSBSZXNvdXJjZVNldCBvbiBiZWhhbGYgb2YgdGhpcyBuYXR1cmUgcnVudGltZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgZ2V0V29ya2JlbmNoVVJJQ29udmVydGVyKCkgewotCQlyZXR1cm4gKFdvcmtiZW5jaFVSSUNvbnZlcnRlcikgZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFJlc291cmNlKFVSSSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0WG1pUmVzb3VyY2UoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIGZvciB0aGlzIHVyaS4gSXQgd2lsbCB1c2UgdGhlIHJlc291cmNlIHNldCBvZiB0aGUgcHJvamVjdCB0byBmaW5kIGl0LiBJdCB3aWxsIGxvYWQgaWYgbm90IGFscmVhZHkgbG9hZGVkLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHJlc291cmNlIGlzIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKCFXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNSZXNvdXJjZU5vdEZvdW5kKGV4KSkKLQkJCQl0aHJvdyBleDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UmVzb3VyY2VTZXQoKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRYbWlSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBzdXJlIHRoYXQgYWxsIGRlcGVuZGVudCBjb21wb25lbnRzIGFyZSBpbml0aWFsaXplZCBiZWZvcmUgY3JlYXRpbmcgdGhlIFJlc291cmNlU2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZXBlbmRlbnRDb21wb25lbnRzKCkgewotCQkvL2NvbS5pYm0uZXRvb2xzLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZVJlc291cmNlKFVSSSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZVhtaVJlc291cmNlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZVJlc291cmNlKFVSSSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZVhtaVJlc291cmNlKFN0cmluZyB1cmksIEVMaXN0IGFuRXh0ZW50KSB7Ci0JCVJlc291cmNlIHJlcyA9IG1ha2VYbWlSZXNvdXJjZSh1cmkpOwotCQlpZiAocmVzICE9IG51bGwpCi0JCQlyZXMuZ2V0Q29udGVudHMoKS5hZGRBbGwoYW5FeHRlbnQpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcmVzb3VyY2UgZm9yIHRoaXMgdXJpLiBJdCB3aWxsIHVzZSB0aGUgcmVzb3VyY2Ugc2V0IG9mIHRoZSBwcm9qZWN0IHRvIGNyZWF0ZSBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiByZXNvdXJjZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIFF1YWxpZmVkVmFsdWUgZm9yIGtleSBmb3Igc3RvcmFnZSBpbiB0aGUgcmVwb3NpdG9yeS4gVGhlIGtleSBpcyBxdWFsaWZlZCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUgdG8gYXZvaWQgY29sbGlzaW9uLiBAcmV0dXJuCi0JICogUXVhbGlmZWROYW1lIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWRLZXkoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUoZ2V0UGx1Z2luSUQoKSwga2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciB0aGUgZ2l2ZW4gbmF0dXJlIGlkIGFzIGFuIEVNRk5hdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmF0dXJlSUQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJOYXR1cmVJRChTdHJpbmcgbmF0dXJlSUQpIHsKLQkJRU1GTmF0dXJlUmVnaXN0cnkuc2luZ2xldG9uKCkuUkVHSVNURVJFRF9OQVRVUkVfSURTLmFkZChuYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJvamVjdCB0byB3aGljaCB0aGlzIG5hdHVyZSBhcHBsaWVzLiBVc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGlzIHByb2plY3QgbmF0dXJlIHJ1bnRpbWUuIFRoaXMgaXMgY2FsbGVkIGJ5Ci0JICogPGNvZGU+SVByb2plY3QuYWRkTmF0dXJlPC9jb2RlPiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBuYXR1cmUgYXBwbGllcwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3Qob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QgbmV3UHJvamVjdCkgewotCQlwcm9qZWN0ID0gbmV3UHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlcnZlciBwcm9wZXJ0eSBvZiB0aGUgcHJvamVjdCBmcm9tIHRoZSBzdXBwbGllZCB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFN0cmluZwotCSAqIEBkZXByZWNhdGVkIHdlIGNhbm5vbnQgdXNlIHBlcnNpc3RlbnQgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9qZWN0U2VydmVyVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChrZXkgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlRdWFsaWZpZWROYW1lIHdob2xlTmFtZSA9IHF1YWxpZmllZEtleShrZXkpOwotCQkJCWdldFByb2plY3QoKS5zZXRQZXJzaXN0ZW50UHJvcGVydHkod2hvbGVOYW1lLCB2YWx1ZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCS8vSWYgd2UgY2FuJ3QgZmluZCBpdCBhc3N1bWUgaXQgaXMgbnVsbAotCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaHV0ZG93biB0aGUgRU1GIG5hdHVyZQotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKQotCQkJKChQcm9qZWN0UmVzb3VyY2VTZXQpIGdldFJlc291cmNlU2V0KCkpLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIEVNRk5hdHVyZXMgYmFzZWQgb24gdGhlIG5hdHVyZXMgdGhhdCBoYXZlIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBvZiBFTUZOYXR1cmVzCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgbmF0dXJlcyBjb25maWd1cmVkIGZvciB0aGUgcHJvamVjdC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBudWxsOwotCQlFTUZOYXR1cmUgbmF0dXJlID0gbnVsbDsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlTdHJpbmcgbmF0dXJlSUQ7Ci0JCQlJdGVyYXRvciBpdCA9IEVNRk5hdHVyZVJlZ2lzdHJ5LnNpbmdsZXRvbigpLlJFR0lTVEVSRURfTkFUVVJFX0lEUy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCW5hdHVyZUlEID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCW5hdHVyZSA9IChFTUZOYXR1cmUpIHByb2plY3QuZ2V0TmF0dXJlKG5hdHVyZUlEKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJaWYgKG5hdHVyZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQkJCXJlc3VsdC5hZGQobmF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIG5hdHVyZSBpZHMgYmFzZWQgb24gdGhlIG5hdHVyZXMgdGhhdCBoYXZlIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiBjb25maWd1cmVkIG5hdHVyZSBpZHMuCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVJRHMoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBuYXR1cmVJRCA9IG51bGw7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJSXRlcmF0b3IgaXQgPSBFTUZOYXR1cmVSZWdpc3RyeS5zaW5nbGV0b24oKS5SRUdJU1RFUkVEX05BVFVSRV9JRFMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQluYXR1cmVJRCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUobmF0dXJlSUQpKSB7Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJCQkJCXJlc3VsdC5hZGQobmF0dXJlSUQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGlmIHRoZSBwcm9qZWN0IGhhcyB0aGUgZ2l2ZW4gbmF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIG5hdHVyZUlkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwcm9qZWN0IGhhcyBnaXZlbiBuYXR1cmUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUnVudGltZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmF0dXJlSWQpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCXJldHVybiBwcm9qZWN0Lmhhc05hdHVyZShuYXR1cmVJZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGlmIHRoZSBwcm9qZWN0IGhhcyBhbnkgb25lIG9mIHRoZSBwb3NzaWJsZSBnaXZlbiBuYXR1cmUgaWRzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHBvc3NpYmxlTmF0dXJlSWRzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIHBvc3NpYmxlIG5hdHVyZXMgaWQgaXMgY29uZmlndXJlZCBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gcG9zc2libGVOYXR1cmVJZHMpIHsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NzaWJsZU5hdHVyZUlkcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChoYXNSdW50aW1lKHByb2plY3QsIHBvc3NpYmxlTmF0dXJlSWRzW2ldKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzE0NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS4qOwotCi0KLS8qKgotICogQmFzZSBsb2cgcmVuZGVyZXIgdGhhdCBsb2dzIHRvIHRoZSB3b3JrYmVuY2guCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlciBpbXBsZW1lbnRzIElMb2dSZW5kZXJlcjIgewotCi0JcHJpdmF0ZSBib29sZWFuIGZUcmFjZU1vZGUgPSBmYWxzZTsgLy8gd2lsbCB3ZSBhY3R1YWxseSBwdW5jaCB0cmFjZSBtZXNzYWdlZCBvciBub3QKLQotCXByaXZhdGUgYm9vbGVhbiBmU2V0dGluZ1RyYWNlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgQnVuZGxlIGZNeUJ1bmRsZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTG9nZ2VyIGZNeUxvZ2dlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSUxvZyBmV29ya0JlbmNoTG9nZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdGVyIHRha2luZyBhIGxvZ2dlci4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIoTG9nZ2VyIGxvZ2dlcikgewotCQlzdXBlcigpOwotCQlmTXlMb2dnZXIgPSBsb2dnZXI7Ci0JCWZUcmFjZU1vZGUgPSBmTXlMb2dnZXIuZ2V0VHJhY2VNb2RlKCk7Ci0KLQkJU3RyaW5nIHBsdWdpbklEID0gZk15TG9nZ2VyLmdldFBsdWdpbklEKCk7Ci0JCWZNeUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JRCk7Ci0JCWlmIChmTXlCdW5kbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIFBsdWdpbiBJRCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZldvcmtCZW5jaExvZ2dlciA9IFBsYXRmb3JtLmdldExvZyhmTXlCdW5kbGUpOwotCQlzZXRUcmFjZU1vZGUoZk15TG9nZ2VyLmdldFRyYWNlTW9kZSgpIHx8IGlzRGVidWdnaW5nKGZNeUJ1bmRsZSkpOwotCQlmTXlMb2dnZXIuc2V0UmVuZGVyZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIHVzZWQgdG8gY29tZSBmcm9tIHRoZSBQbHVnaW4gaW5zdGFuY2UuIEJ1dCBpbiBuZXcgT1NHaSwgdGhlcmUgaXMgbm90IG5lY2Vzc2FyaWx5IGEgUGx1Z2luIGluc3RhbmNlLiBTbyB1c2UgdGhlIHNhbWUgbG9naWMgdGhleSB1c2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdnaW5nKEJ1bmRsZSBidW5kbGUpIHsKLQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJaWYgKHN5bWJvbGljTmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcga2V5ID0gc3ltYm9saWNOYW1lICsgIi9kZWJ1ZyI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKGtleSk7Ci0JCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIElzIHRoZSBjb25zb2xlIGxvZyBmb3IgZWNsaXBzZSB0dXJuZWQgb24gdG8gc3lzb3V0LiBJZiB0cnVlLCB0aGVuIHdlIHNob3VsZG4ndCBsb2cgdG8gY29uc29sZSBhbnl0aGluZyBhbHJlYWR5IGxvZ2dlZCBiZWNhdXNlIEVjbGlwc2Ugd291bGQgb2YKLQkgKiBsb2dnZWQgaXQgZm9yIHVzLiBUaGlzIGNvbWVzIGZyb20gdGhlIC1EZWNsaXBzZS5jb25zb2xlTG9nPSJ0cnVlIiB3aGljaCBpcyB0aGUgZGVmYXVsdCB3aGVuIHN0YXJ0aW5nIGVjbGlwc2UgZnJvbSBQREUuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbnNvbGVMb2dPbjsKLQlzdGF0aWMgewotCQlTdHJpbmcgY29uc29sb2dQcm9wZXJ0eU5hbWUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gQWNjZXNzaW5nIGFuIGludGVybmFsIGZpZWxkLCBzbyB1c2luZyByZWZsZWN0aW9uLiBUaGlzIHdheSBpZiBjaGFuZ2VzIGluIGZ1dHVyZSB3ZSB3b24ndCBjcmFzaC4KLQkJCUNsYXNzIGVjbGlwc2VTdGFydGVyID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IuRWNsaXBzZVN0YXJ0ZXIiKTsJLy8kTk9OLU5MUy0xJAotCQkJRmllbGQgY29uc29sZWxvZyA9IGVjbGlwc2VTdGFydGVyLmdldERlY2xhcmVkRmllbGQoIlBST1BfQ09OU09MRV9MT0ciKTsJLy8kTk9OLU5MUy0xJAotCQkJY29uc29sb2dQcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBjb25zb2xlbG9nLmdldChudWxsKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJfQotCQljb25zb2xlTG9nT24gPSBjb25zb2xvZ1Byb3BlcnR5TmFtZSAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KGNvbnNvbG9nUHJvcGVydHlOYW1lKSkgOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlciNzZXRUcmFjZU1vZGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBmbGFnKSB7Ci0JCWlmIChmU2V0dGluZ1RyYWNlKQotCQkJcmV0dXJuOyAvLyBEbyBub3QgYWxsb3cgY3ljbGVzCi0KLQkJZlNldHRpbmdUcmFjZSA9IHRydWU7Ci0JCWZUcmFjZU1vZGUgPSBmbGFnOwotCQlmTXlMb2dnZXIuc2V0VHJhY2VNb2RlKGZsYWcpOwotCQlmU2V0dGluZ1RyYWNlID0gZmFsc2U7Ci0JfQotCi0JLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBmb3IgaGlzdG9yaWNhbCByZW5kZXJlcnMgaW4gY2FzZSB0aGlzIGhhcyBiZWVuIHN1YmNsYXNzZWQgb3V0c2lkZQotCS8vIG9mIHV0aWwuCi0KLQkvKioKLQkgKiBMb2cgYSBzdHJpbmcgdG8gdGhlIHRyYWNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGxvZyhTdHJpbmcgcGFyYW0pOwotCi0JLyoqCi0JICogRGVmYXVsdCBvbmUgdGhhdCBsb2cgYSBzdHJpbmcgdG8gdGhlIHRyYWNlIGdpdmVuIGEgbGV2ZWwuIERlZmF1bHQgc2ltcGx5IHBhc3NlcyBpdCB0byBsb2coU3RyaW5nKSBzbyB0aGF0IHdlIGRvbid0IGJyZWFrIG9sZCBzdWJjbGFzc2VzLgotCSAqIDxwPgotCSAqIElmIGxvZ2dlZFRvV29ya2JlbmNoIGlzIHRydWUsIHRoZW4gaXQgc2hvdWxkbid0IGJlIGxvZ2dlZCB0byBjb25zb2xlIGlmIGNvbnNvbGVMb2dPbiBpcyB0cnVlIGJlY2F1c2Ugd29ya2JlbmNoIGFscmVhZHkgbG9nZ2VkIHRvIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSBsCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2csIExldmVsIGwsIGJvb2xlYW4gbG9nZ2VkVG9Xb3JrYmVuY2gpIHsKLQkJbG9nKG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKLQotCQlTdHJpbmcgdGFyZ2V0ID0gbG9nV29ya0JlbmNoKG1zZywgdHlwZSk7Ci0JCWlmIChmVHJhY2VNb2RlIHx8IHRhcmdldC5lcXVhbHMoTk9MT0dfREVTQ1JJUFRJT04pKQotCQkJcmV0dXJuIGxvZyhtc2cpOwotCQllbHNlCi0JCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIExvZyB0byB3b3JrYmVuY2gsIGEgc3RyaW5nIG9mIHRoZSBnaXZlbiBsZXZlbCA8Y29kZT5JTG9nUmVuZGVyZXIuTE9HXzwvY29kZT4uIGxldmVscy4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIG9mIHRoZSBsb2cncyBkZXN0aW5hdGlvbiBlLmcuLCA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OPC9jb2RlPgotCSAqIAotCSAqIEBzZWUgSUxvZ1JlbmRlcmVyI0xPR19FUlJPUiBhbmQgYWxsIG9mIHRoZSBvdGhlciBsb2cgdHlwZXMuCi0JICogQHNlZSBJTG9nUmVuZGVyZXIjQ09OU09MRV9ERVNDUklQVElPTgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nV29ya0JlbmNoKFN0cmluZyBtc2csIGludCB0eXBlKSB7Ci0KLQkJdHJ5IHsKLQkJCWludCBFcnJDb2RlOwotCQkJaWYgKGZXb3JrQmVuY2hMb2dnZXIgIT0gbnVsbCkgewotCQkJCXN3aXRjaCAodHlwZSkgewotCQkJCQljYXNlIChJTG9nUmVuZGVyZXIuTE9HX0VSUk9SKToKLQkJCQkJCUVyckNvZGUgPSBJU3RhdHVzLkVSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKElMb2dSZW5kZXJlci5MT0dfV0FSTklORyk6Ci0JCQkJCQlFcnJDb2RlID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKElMb2dSZW5kZXJlci5MT0dfSU5GTyk6Ci0JCQkJCQlFcnJDb2RlID0gSVN0YXR1cy5JTkZPOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKElMb2dSZW5kZXJlci5MT0dfVFJBQ0UpOgotCQkJCQkJRXJyQ29kZSA9IElTdGF0dXMuT0s7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIExvZyBUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoRXJyQ29kZSwgZk15QnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLCBtc2csIG51bGwpOwotCQkJCWZXb3JrQmVuY2hMb2dnZXIubG9nKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIFdPUktCRU5DSF9ERVNDUklQVElPTjsKLQkJCX0gZWxzZQotCQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQkJfQotCX0KLQotCS8vIERlZmF1bHQgaW1wbGVudGF0aW9uIG9mIHRoZSBJTG9nUmVuZGVyZXIyIGludGVyZmFjZS4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvZ2dpbmcoTGV2ZWwgbGV2ZWwpIHsKLQkJcmV0dXJuIGZUcmFjZU1vZGUgfHwgZk15TG9nZ2VyLmlzTG9nZ2luZ0xldmVsKGxldmVsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBTVEFUVVNfTEVWRUw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMZXZlbFtdIFNUQVRVU19MRVZFTF9MT09LVVA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMZXZlbFtdIExFVkVMX1NUQVRVUzsKLQotCXN0YXRpYyB7Ci0JCS8vIFN0YXR1cyBsZXZlbHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBsb2cgbGV2ZWxzLCBmcm9tIGZpbmVzdCB0byBub25lLCBzYW1lIGluZGV4ZXMgYXMgZnJvbSBTVEFUVVNfTEVWRUxfTE9PS1VQLgotCQlTVEFUVVNfTEVWRUxfTE9PS1VQID0gbmV3IExldmVsW10geyBMZXZlbC5JTkZPLCBMZXZlbC5XQVJOSU5HLCBMZXZlbC5TRVZFUkV9OwotCQlTVEFUVVNfTEVWRUwgPSBuZXcgaW50W10geyBJU3RhdHVzLklORk8sIElTdGF0dXMuV0FSTklORywgSVN0YXR1cy5FUlJPUn07Ci0KLQkJLy8gTGV2ZWxzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgSVN0YXR1cyBsZXZlbHMuCi0JCWludCBtYXhJRCA9IE1hdGgubWF4KElTdGF0dXMuT0ssIE1hdGgubWF4KElTdGF0dXMuSU5GTywgTWF0aC5tYXgoSVN0YXR1cy5XQVJOSU5HLCBJU3RhdHVzLkVSUk9SKSkpOwotCQlMRVZFTF9TVEFUVVMgPSBuZXcgTGV2ZWxbbWF4SUQgKyAxXTsKLQkJTEVWRUxfU1RBVFVTW0lTdGF0dXMuT0tdID0gTGV2ZWwuRklORTsKLQkJTEVWRUxfU1RBVFVTW0lTdGF0dXMuSU5GT10gPSBMZXZlbC5JTkZPOwotCQlMRVZFTF9TVEFUVVNbSVN0YXR1cy5XQVJOSU5HXSA9IExldmVsLldBUk5JTkc7Ci0JCUxFVkVMX1NUQVRVU1tJU3RhdHVzLkVSUk9SXSA9IExldmVsLlNFVkVSRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgTGV2ZWwgZm9yIHRoZSBzdGF0dXMgY29kZSBmcm9tIHRoZSBnaXZlbiBJU3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiBAcmV0dXJuIHRoZSBKYXZhIExldmVsCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIExldmVsIGdldExvZ0xldmVsKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBMRVZFTF9TVEFUVVNbc3RhdHVzLmdldFNldmVyaXR5KCldOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVN0YXR1cyBzdGF0dXMgY29kZSBmb3IgdGhlIGdpdmVuIEphdmEgTGV2ZWwuCi0JICogCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiB0aGUgSVN0YXR1cyBzdGF0dXMgY29kZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFN0YXR1c1NldmVyaXR5KExldmVsIGxvZ0xldmVsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgU1RBVFVTX0xFVkVMX0xPT0tVUC5sZW5ndGg7IGkrKykgewotCQkJaWYgKFNUQVRVU19MRVZFTF9MT09LVVBbaV0gPT0gbG9nTGV2ZWwpCi0JCQkJcmV0dXJuIFNUQVRVU19MRVZFTFtpXTsKLQkJfQotCQlyZXR1cm4gSVN0YXR1cy5PSzsgLy8gRGVmYXVsdCB0byBvay4KLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHN0cmluZyB0byB0aGUgd29ya2JlbmNoIGZvciB0aGUgZ2l2ZW4gbGV2ZWwKLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBvZiB0aGUgbG9nJ3MgZGVzdGluYXRpb24gZS5nLiwgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvZ1dvcmtiZW5jaChTdHJpbmcgbXNnLCBMZXZlbCBsZXZlbCkgewotCQlTdHJpbmcgcmVzdWx0ID0gTk9MT0dfREVTQ1JJUFRJT047Ci0JCS8vIFRlc3QgYWdhaW4gYmVjYXVzZSB3ZSBjb3VsZCBiZSBoZXJlIHNpbXBseSBkdWUgdG8gdHJhY2UgbW9kZSwgaW4gd2hpY2ggY2FzZSB3ZQotCQkvLyBkb24ndCB3YW50IHRvIHdvcmtiZW5jaCBsb2cgaXQuCi0JCWlmIChmTXlMb2dnZXIuaXNMb2dnaW5nTGV2ZWwobGV2ZWwpKSB7Ci0JCQlQbGF0Zm9ybS5nZXRMb2coZk15QnVuZGxlKS5sb2cobmV3IFN0YXR1cyhnZXRTdGF0dXNTZXZlcml0eShsZXZlbCksIGZNeUJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbXNnLCBudWxsKSk7Ci0JCQlyZXN1bHQgPSBXT1JLQkVOQ0hfREVTQ1JJUFRJT047Ci0JCQlpZiAoZlRyYWNlTW9kZSkKLQkJCQlsb2cobXNnLCBsZXZlbCwgdHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoZlRyYWNlTW9kZSkKLQkJCWxvZyhtc2csIGxldmVsLCBmYWxzZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdHVzTXNnKElTdGF0dXMgcywgTGV2ZWwgbCkgewotCQlpZiAocy5nZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJcmV0dXJuIGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKHMudG9TdHJpbmcoKSArIGZNeUxvZ2dlci5mTGluZVNlcGVyYXRvciArIGZNeUxvZ2dlci5leGNlcHRpb25Ub1N0cmluZyhzLmdldEV4Y2VwdGlvbigpKSwgbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhzLnRvU3RyaW5nKCksIGwpOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgSVN0YXR1cyB0byB0aGUgd29ya2JlbmNoIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4gZGVzY3JpcHRpb24gb2YgdGhlIGxvZydzIGRlc3RpbmF0aW9uIGUuZy4sIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT048L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2dXb3JrYmVuY2goSVN0YXR1cyBzLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gZ2V0TG9nTGV2ZWwocyk7Ci0JCVN0cmluZyByZXN1bHQgPSBOT0xPR19ERVNDUklQVElPTjsKLQkJLy8gVGVzdCBhZ2FpbiBiZWNhdXNlIHdlIGNvdWxkIGJlIGhlcmUgc2ltcGx5IGR1ZSB0byB0cmFjZSBtb2RlLCBpbiB3aGljaCBjYXNlIHdlCi0JCS8vIGRvbid0IHdhbnQgdG8gd29ya2JlbmNoIGxvZyBpdC4KLQkJaWYgKGZNeUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChsZXZlbCkpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhmTXlCdW5kbGUpLmxvZyhzKTsKLQkJCXJlc3VsdCA9IFdPUktCRU5DSF9ERVNDUklQVElPTjsKLQkJCWlmIChmVHJhY2VNb2RlKQotCQkJCWxvZyhnZXRTdGF0dXNNc2cocywgbGV2ZWwpLCBsZXZlbCwgdHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoZlRyYWNlTW9kZSkKLQkJCWxvZyhnZXRTdGF0dXNNc2cocywgbGV2ZWwpLCBsZXZlbCwgZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIExvZyB0byB0aGUgd29ya2JlbmNoIHRoZSBUaHJvd2FibGUgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSB0Ci0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBvZiB0aGUgbG9nJ3MgZGVzdGluYXRpb24gZS5nLiwgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvZ1dvcmtiZW5jaChUaHJvd2FibGUgdCwgTGV2ZWwgbGV2ZWwpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IE5PTE9HX0RFU0NSSVBUSU9OOwotCQkvLyBUZXN0IGFnYWluIGJlY2F1c2Ugd2UgY291bGQgYmUgaGVyZSBzaW1wbHkgZHVlIHRvIHRyYWNlIG1vZGUsIGluIHdoaWNoIGNhc2Ugd2UKLQkJLy8gZG9uJ3Qgd2FudCB0byB3b3JrYmVuY2ggbG9nIGl0LgotCQlpZiAoZk15TG9nZ2VyLmlzTG9nZ2luZ0xldmVsKGxldmVsKSkgewotCQkJUGxhdGZvcm0uZ2V0TG9nKGZNeUJ1bmRsZSkubG9nKG5ldyBTdGF0dXMoZ2V0U3RhdHVzU2V2ZXJpdHkobGV2ZWwpLCBmTXlCdW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJFeGNlcHRpb24gdGhyb3duLiIsIHQpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gV09SS0JFTkNIX0RFU0NSSVBUSU9OOwotCQkJaWYgKGZUcmFjZU1vZGUpCi0JCQkJbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKGZNeUxvZ2dlci5leGNlcHRpb25Ub1N0cmluZyh0KSwgbGV2ZWwpLCBsZXZlbCwgdHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoZlRyYWNlTW9kZSkKLQkJCWxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhmTXlMb2dnZXIuZXhjZXB0aW9uVG9TdHJpbmcodCksIGxldmVsKSwgbGV2ZWwsIGZhbHNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhieXRlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhib29sZWFuIGIsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihiKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhieXRlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhieXRlIGIsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihiKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhjaGFyLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhjaGFyIGMsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihjKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhkb3VibGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGRvdWJsZSBkLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoZCksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coZmxvYXQsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGZsb2F0IGYsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihmKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhpbnQsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGludCBpLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoaSksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2cobG9uZywgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2cobG9uZyBsLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YobCksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coT2JqZWN0IG8sIExldmVsIGxldmVsKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgSVN0YXR1cykKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goKElTdGF0dXMpIG8sIGxldmVsKTsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKG8pLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKHNob3J0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhzaG9ydCBzLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YocyksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coamF2YS5sYW5nLlRocm93YWJsZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coVGhyb3dhYmxlIHQsIExldmVsIGxldmVsKSB7Ci0JCWlmICh0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goKChDb3JlRXhjZXB0aW9uKSB0KS5nZXRTdGF0dXMoKSwgbGV2ZWwpOwotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuU0VWRVJFOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkgewotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaCh0LCBsZXZlbCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvQ29uc29sZUxvZ1JlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0NvbnNvbGVMb2dSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODEwZTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvQ29uc29sZUxvZ1JlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBMb2cgcmVuZGVyZXIgdG8gdGhlIGNvbnNvbGUuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uc29sZUxvZ1JlbmRlcmVyIGV4dGVuZHMgQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciB0YWtpbmcgYSBsb2dnZXIuCi0JICogCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBDb25zb2xlTG9nUmVuZGVyZXIoTG9nZ2VyIGxvZ2dlcikgewotCQlzdXBlcihsb2dnZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIjbG9nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coU3RyaW5nIG1zZykgewotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkNPTlNPTEVfREVTQ1JJUFRJT047Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZywgTGV2ZWwgbCwgYm9vbGVhbiBsb2dnZWRUb1dvcmtiZW5jaCkgewotCQlpZiAoIWxvZ2dlZFRvV29ya2JlbmNoIHx8ICFjb25zb2xlTG9nT24pIHsKLQkJCWlmIChsID09IExldmVsLlNFVkVSRSkKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCWVsc2UKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3MzMxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0RlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBMb2dnZXIgdGhhdCBhbHNvIGxvZ3MgdG8gYSB0cmFjZSBmaWxlIGluIHRoZSBwbHVnaW4ncyBtZXRhZGF0YSBhcmVhLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyIGV4dGVuZHMgQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlciB7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIHRoZSB0cmFjZSBmaWxlIGluIHRoZSBtZXRhZGF0YSBhcmVhLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBsdWdpblRyYWNlRmlsZU5hbWUgPSAiLy5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBmVHJhY2VGaWxlID0gbnVsbDsKLQotCXByaXZhdGUgUHJpbnRXcml0ZXIgdHJhY2VGaWxlID0gbnVsbDsKLQotCS8qKgotCSAqIERlZmF1bHRVSUxvZ1JlbmRlcmVyIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXIoTG9nZ2VyIGxvZ2dlcikgewotCQlzdXBlcihsb2dnZXIpOwotCi0JCWZUcmFjZUZpbGUgPSBQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKGZNeUJ1bmRsZSkudG9TdHJpbmcoKSArIFBsdWdpblRyYWNlRmlsZU5hbWU7Ci0JCShuZXcgRmlsZShmVHJhY2VGaWxlKSkuZGVsZXRlKCk7IC8vIFN0YXJ0IGZyb20gZnJlc2ggLi4uIGRvIG5vdCB3YW50IHRvIGxlYWsgb24gZGlzayBzcGFjZQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlVHJhY2VGaWxlKCkgewotCQlpZiAodHJhY2VGaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQl0cmFjZUZpbGUuZmx1c2goKTsKLQkJCXRyYWNlRmlsZS5jbG9zZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJhY2VGaWxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIjbG9nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coU3RyaW5nIG1zZykgewotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCi0JCW9wZW5UcmFjZUZpbGUoKTsKLQkJaWYgKHRyYWNlRmlsZSAhPSBudWxsKSB7Ci0JCQl0cmFjZUZpbGUucHJpbnRsbihtc2cpOwotCQkJY2xvc2VUcmFjZUZpbGUoKTsKLQkJfQotCQlyZXR1cm4gZlRyYWNlRmlsZTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnLCBMZXZlbCBsLCBib29sZWFuIGxvZ2dlZFRvV29ya2JlbmNoKSB7Ci0JCWlmICghbG9nZ2VkVG9Xb3JrYmVuY2ggfHwgIWNvbnNvbGVMb2dPbikgewotCQkJaWYgKGwgPT0gTGV2ZWwuU0VWRVJFKQotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0KLQkJb3BlblRyYWNlRmlsZSgpOwotCQlpZiAodHJhY2VGaWxlICE9IG51bGwpIHsKLQkJCXRyYWNlRmlsZS5wcmludGxuKG1zZyk7Ci0JCQljbG9zZVRyYWNlRmlsZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5UcmFjZUZpbGUoKSB7Ci0JCXRyeSB7Ci0JCQl0cmFjZUZpbGUgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZlRyYWNlRmlsZSwgdHJ1ZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGVyZSB3YXMgYSBwcm9ibGVtIG9wZW5pbmcgdGhlIGxvZyBmaWxlIHNvIGxvZyB0byB0aGUgY29uc29sZQotCQkJdHJhY2VGaWxlID0gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0VjbGlwc2VMb2dnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvRWNsaXBzZUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTkxMjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvRWNsaXBzZUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLSAKLS8qKgotICogR2V0IGFuIEVjbGlwc2UgbG9nZ2VyLiBUaGlzIGdldHMgYSBsb2dnZXIgdGhhdCBrbm93cyBpdCBpcyBmb3IgYSBwbHVnaW4uIAotICogCi0gKiBGb3IgZWFjaCBwbHVnaW4sIHRoZSBmb2xsb3dpbmcgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgLm9wdGlvbiBmaWxlOgotICogCQl7cGx1Z2luLWlkfS9kZWJ1Zy9sb2dUcmFjZQotICogCQkJVGhlIHZhbHVlcyB2YWxpZCBmb3IgdGhpcyBhcmUgInRydWUiLCAiZmFsc2UiLCBvciAiZGVmYXVsdCIuIElmIHRydWUgdGhlbiBsb2dnZXJzIHdpbGwgYmUgc2V0IGludG8KLSAqIAkJCXRyYWNlIG1vZGUuIFRoaXMgbWVhbnMgZXZlcnl0aGluZyBsb2dnZWQgKGV2ZW4gdGhvc2UgdGhhdCBhcmUgZmlsdGVyZWQgb3V0IGR1ZSB0byBub3QgbWVldGluZyBsb2cgbGV2ZWwpCi0gKiAJCQl3aWxsIGJlIHRyYWNlZCBvdXQuIElmIHRoZSB2YWx1ZSBpcyAidHJ1ZSIgdGhleSB3aWxsIGJlIHRyYWNlZCB0byB0aGUgc3lzdGVtIGNvbnNvbGUuICAKLSAqIAkJCUlmIGl0IGlzICJkZWZhdWx0IiBvciBub3Qgc2V0IGF0IGFsbCwgdGhlbiBpdCB3aWxsIGJlIHRoZSB2YWx1ZSBpbiB0aGUgIm9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ1RyYWNlIiAub3B0aW9ucyBzZXR0aW5nLgotICogCQkJSWYgbm90IHNldCB0aGVyZSwgdGhlbiBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0gKiAKLSAqIAkJe3BsdWdpbi1pZH0vZGVidWcvbG9nVHJhY2VGaWxlCi0gKiAJCQlUaGUgdmFsdWVzIHZhbGlkIGZvciB0aGlzIGFyZSAidHJ1ZSIsICJmYWxzZSIsIG9yICJkZWZhdWx0Ii4gSWYgdHJ1ZSB0aGVuIGxvZ2dlcnMgd2lsbCB0cmFjZSB0byAKLSAqIAkJCXRoZSBzeXN0ZW0gY29uc29sZSBBTkQgdG8gdGhlICIubG9nIiBmaWxlIGluIHRoZSBwbHVnaW5zIHdvcmsgYXJlYSBpbiB0aGUgbWV0YWRhdGEgc2VjdGlvbiBvZiB0aGUgd29ya3NwYWNlLgotICogCQkJSWYgImZhbHNlIiB0aGVuIG5vdCB0cmFjZWQgdG8gYSB0cmFjZSBmaWxlLiAKLSAqIAkJCUlmIGl0IGlzICJkZWZhdWx0IiBvciBub3Qgc2V0IGF0IGFsbCwgdGhlbiBpdCB3aWxsIGJlIHRoZSB2YWx1ZSBpbiB0aGUgIm9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ1RyYWNlRmlsZSIgLm9wdGlvbnMgc2V0dGluZy4KLSAqIAkJCUlmIG5vdCBzZXQgdGhlcmUsIHRoZW4gZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIGZhbHNlLgotICogCi0gKiAJCXtwbHVnaW4taWR9LmRlYnVnL2xvZ0xldmVsCi0gKiAJCQlUaGUgdmFsdWVzIHZhbGlkIGZvciB0aGlzIGFyZSB0aGUgbmFtZXMgZnJvbSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbDwvY29kZT4sIGFuZCAiZGVmYXVsdCIuIFRoZXNlCi0gKiAJCQlhcmUgdGhlIHRyYWNlIGN1dG9mZiBsZXZlbHMgdG8gdXNlLiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBsZXZlbCB3YXMgU0VWRVJFLCB0aGVuIG9ubHkgbGV2ZWwgU0VWRVJFIG1zZ3MKLSAqIAkJCWFyZSBsb2dnZWQuIFRoZSByZXN0IGFyZSBza2lwcGVkLiBPciBpZiB0aGUgbGV2ZWwgd2FzIFdBUk5JTkcsIHRoZW4gb25seSBsZXZlbCBTRVZFUkUgYW5kIFdBUk5JTkcgYXJlCi0gKiAJCQlsb2dnZWQuCi0gKiAJCQlJZiBpdCBpcyAiZGVmYXVsdCIgb3Igbm90IHNldCBhdCBhbGwsIHRoZW4gaXQgd2lsbCBiZSB0aGUgdmFsdWUgaW4gdGhlICJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dMZXZlbCIgLm9wdGlvbnMgc2V0dGluZy4KLSAqIAkJCUlmIG5vdCBzZXQgdGhlcmUsIHRoZW4gZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIFdBUk5JTkcuCi0gKiAKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTG9nZ2VyIGV4dGVuZHMgTG9nZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1RSQUNFX09QVElPTiA9ICIvZGVidWcvbG9ndHJhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfVFJBQ0VfRklMRV9PUFRJT04gPSAiL2RlYnVnL2xvZ3RyYWNlZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19MT0dfTEVWRUxfT1BUSU9OID0gIi9kZWJ1Zy9sb2dsZXZlbCI7IC8vIFRoZSBsb2dnaW5nIGxldmVsIHRvIHVzZSB3aGVuIG5vIEh5YWVkZXMuICh3aGljaCB3ZSBkb24ndCBzdXBwb3J0IGF0IHRoaXMgdGltZSkuIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09QVElPTiA9ICJkZWZhdWx0IjsJLy8gSWYgb3B0aW9uIHZhbHVlIGlzIHRoaXMsIHRoZW4gdGhlIHZhbHVlIGZyb20gV1RQIENvbW1vbiBwbHVnaW4gb3B0aW9ucyB3aWxsIGJlIHVzZWQgZm9yIGJvdGggbG9nVHJhY2UgYW5kIGxvZ0xldmVsLgkgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiBhIGxvZ2dlciBiYXNlZCB1cG9uIHRoZSBQbHVnaW4uIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0RWNsaXBzZUxvZ2dlcihQbHVnaW4gcGx1Z2luKSB7Ci0JCXJldHVybiBnZXRFY2xpcHNlTG9nZ2VyKHBsdWdpbi5nZXRCdW5kbGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxvZ2dlciBiYXNlZCB1cG9uIHRoZSBidW5kbGUuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExvZ2dlciBnZXRFY2xpcHNlTG9nZ2VyKEJ1bmRsZSBidW5kbGUpIHsKLQkJU3RyaW5nIGlkID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOwotCQlMb2dnZXIgbG9nZ2VyID0gZ2V0TG9nZ2VySWZFeGlzdHMoaWQpOwotCQlpZiAobG9nZ2VyICE9IG51bGwpCi0JCQlyZXR1cm4gbG9nZ2VyOwotCQkKLQkJbG9nZ2VyID0gZ2V0TG9nZ2VyKGlkKTsJLy8gQ3JlYXRlIG9uZSwgd2Ugd2lsbCBub3cgY3VzdG9taXplIGl0LgotCQkKLQkJU3RyaW5nIHBsdWdpbk9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKGlkICsgREVCVUdfVFJBQ0VfT1BUSU9OKTsKLQkJaWYgKHBsdWdpbk9wdGlvbiA9PSBudWxsIHx8ICJkZWZhdWx0Ii5lcXVhbHNJZ25vcmVDYXNlKHBsdWdpbk9wdGlvbikpIC8vJE5PTi1OTFMtMSQKLQkJCXBsdWdpbk9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpFTVV0aWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgREVCVUdfVFJBQ0VfT1BUSU9OKTsKLQkJYm9vbGVhbiBsb2dUcmFjZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHBsdWdpbk9wdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQlwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihpZCArIERFQlVHX1RSQUNFX0ZJTEVfT1BUSU9OKTsKLQkJaWYgKHBsdWdpbk9wdGlvbiA9PSBudWxsIHx8ICJkZWZhdWx0Ii5lcXVhbHNJZ25vcmVDYXNlKHBsdWdpbk9wdGlvbikpIC8vJE5PTi1OTFMtMSQKLQkJCXBsdWdpbk9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpFTVV0aWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgREVCVUdfVFJBQ0VfRklMRV9PUFRJT04pOwotCQlib29sZWFuIGxvZ1RyYWNlRmlsZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHBsdWdpbk9wdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXBsdWdpbk9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKGlkICsgREVCVUdfTE9HX0xFVkVMX09QVElPTik7Ci0JCWlmIChwbHVnaW5PcHRpb24gPT0gbnVsbCB8fCAiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZShwbHVnaW5PcHRpb24pKSAvLyROT04tTkxTLTEkCi0JCQlwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKRU1VdGlsUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArIERFQlVHX0xPR19MRVZFTF9PUFRJT04pOwotCQkKLQkJTGV2ZWwgbG9nTGV2ZWwgPSBMZXZlbC5XQVJOSU5HOwotCQlpZiAocGx1Z2luT3B0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbG9nTGV2ZWwgPSBMZXZlbC5wYXJzZShwbHVnaW5PcHRpb24pOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGxvZ1RyYWNlKQotCQkJbG9nZ2VyLnNldFRyYWNlTW9kZSh0cnVlKTsKLQkJbG9nZ2VyLnNldExldmVsKGxvZ0xldmVsKTsKLQkJaWYgKCFsb2dUcmFjZUZpbGUpCi0JCQlsb2dnZXIuc2V0UmVuZGVyZXIobmV3IENvbnNvbGVMb2dSZW5kZXJlcihsb2dnZXIpKTsKLQkJZWxzZQotCQkJbG9nZ2VyLnNldFJlbmRlcmVyKG5ldyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihsb2dnZXIpKTsKLQkJCi0JCXJldHVybiBsb2dnZXI7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9JTXNnTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0lNc2dMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmNDVkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0lNc2dMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBtZXNzYWdlIGxvZ2dlci4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1zZ0xvZ2dlciB7Ci0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9wbHVnaW4vSkVNVXRpbFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL3BsdWdpbi9KRU1VdGlsUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjliOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL3BsdWdpbi9KRU1VdGlsUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogSkVNVXRpbFBsdWdpbi5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjUgJCQgICQkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo0NSAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0KLS8qKgotICogUGx1Z2luIGZvciBFTUZXb3JrYmVuY2ggdXRpbHMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgSkVNVXRpbFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qZW0udXRpbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBQbHVnaW4gaWQgb2YgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gSUQ7CQotCi0JLyoqCi0JICogVUkgQ29udGV4dCBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9FWFRFTlNJT05fUE9JTlQgPSAidWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVSVRlc3RlciBlbGVtZW50IG5hbWUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0VYVEVOU0lPTl9QT0lOVCA9ICJ1aVRlc3RlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBQcm90b2NvbCBmb3Igd29ya3NwYWNlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS1NQQUNFX1BST1RPQ09MID0gIndvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByb3RvY29sIGZvciBwbGF0Zm9ybSB1cmkncy4gaS5lLiAicGxhdGZvcm06Ly4uLiIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUFJPVE9DT0wgPSAicGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXNvdXJjZSBpbmRpY2F0aW9uIGluIHBsYXRmb3JtIHByb3RvY29sLiBJbmRpY2F0ZXMgdXJsIGlzIGZvciBhIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2UuIGkuZS4gInBsYXRmb3JtOi9yZXNvdXJjZS9wcm9qZWN0bmFtZS8uLi4iCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUkVTT1VSQ0UgPSAicmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQbHVnaW4gaW5kaWNhdGlvbiBpbiBwbGF0Zm9ybSBwcm90b2NvbC4gSW5kaWNhdGVzIHVybCBpcyBmb3IgYSBmaWxlL2RpcmVjdG9yeSBpbiB0aGUgcGx1Z2lucyBhcmVhLiBpLmUuICJwbGF0Zm9ybTovcGx1Z2luL3BsdWdpbmlkLy4uLiIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9QTFVHSU4gPSAicGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllciBzaGFyZWRDYWNoZTsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlU2V0IHBsdWdpblJlc291cmNlU2V0OwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gR0xPQkFMX0xPQURJTkdfUExVR0lOX05BTUVTOwotCi0JcHJpdmF0ZSBzdGF0aWMgSkVNVXRpbFBsdWdpbiBERUZBVUxUOwotCi0JcHVibGljIEpFTVV0aWxQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCURFRkFVTFQgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgd29ya3NwYWNlLiBKdXN0IHVzZSBSZXNvdXJjZVBsdWdpbi5nZXRXb3Jrc3BhY2UoKSBpbnN0ZWFkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGx1Z2luIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gcGx1Z2luIGluc3RhbmNlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkVNVXRpbFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaGFyZWRDYWNoZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIgZ2V0U2hhcmVkQ2FjaGUoKSB7Ci0JCWlmIChzaGFyZWRDYWNoZSA9PSBudWxsKQotCQkJc2hhcmVkQ2FjaGUgPSBuZXcgV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllcigpOwotCQlyZXR1cm4gc2hhcmVkQ2FjaGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hhcmVkQ2FjaGUuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzaGFyZWRDYWNoZQotCSAqICAgICAgICAgICAgVGhlIHNoYXJlZENhY2hlIHRvIHNldAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaGFyZWRDYWNoZShXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyIGFTaGFyZWRDYWNoZSkgewotCQlzaGFyZWRDYWNoZSA9IGFTaGFyZWRDYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlSXNvbGF0ZWRSZXNvdXJjZVNldChJUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGNyZWF0ZUlzb2xhdGVkUmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbiBBZGFwdGVyLiBZb3UgY2FuIHVzZSB0aGlzIGFwaSB0byBsaXN0ZW4gZm9yIGFueSBzaGFyZWQgcmVzb3VyY2UgYmVpbmcgbG9hZGVkIG9yIHJlbW92ZWQgZnJvbSBhbnkgUHJvamVjdFJlc291cmNlU2V0IGluIHRoZSBXb3JrYmVuY2gKLQkgKiBpbnN0ZWFkIG9mIHRyeWluZyB0byBsaXN0ZW4gdG8gZWFjaCBpbmRpdmlkdWFsIFByb2plY3RSZXNvdXJjZVNldC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRXb3Jrc3BhY2VFTUZSZXNvdXJjZUxpc3RlbmVyKEFkYXB0ZXIgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlciAhPSBudWxsICYmICFnZXRTaGFyZWRDYWNoZSgpLmVBZGFwdGVycygpLmNvbnRhaW5zKGFkYXB0ZXIpKQotCQkJZ2V0U2hhcmVkQ2FjaGUoKS5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgYWRhcHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIAotCSAqIEBzZWUgI2FkZFdvcmtzcGFjZUVNRlJlc291cmNlTGlzdGVuZXIoQWRhcHRlcikKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlV29ya3NwYWNlRU1GUmVzb3VyY2VMaXN0ZW5lcihBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWdldFNoYXJlZENhY2hlKCkuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgcGx1Z2luIGFjdGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFjdGl2ZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGl2YXRlZCgpIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShJRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCXJldHVybiBidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIFdvcmtiZW5jaENvbnRleHQgaXMgaW5zdGFudGlhdGVkIG9uIGFuIEVNRk5hdHVyZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIAotCSAqIEBzZWUgcGx1Z2luLnhtbCNSZXNvdXJjZUhhbmRsZXJFeHRlbnNpb24gZXh0ZW5zaW9uIHBvaW50LgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4dGVuZGVkUmVzb3VyY2VIYW5kbGVycyhQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWlmIChhUmVzb3VyY2VTZXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBjdCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KGdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAiUmVzb3VyY2VIYW5kbGVyRXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbiA9IHBjdC5nZXRFeHRlbnNpb25zKCk7Ci0JCUlFeHRlbnNpb24gY29uZmlnOwotCQlmb3IgKGludCBsID0gMDsgbCA8IGV4dGVuc2lvbi5sZW5ndGg7ICsrbCkgewotCQkJY29uZmlnID0gZXh0ZW5zaW9uW2xdOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY0VsZW1zID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjRWxlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQloYW5kbGVyID0gKFJlc291cmNlSGFuZGxlcikgY0VsZW1zW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oInJ1biIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJaGFuZGxlciA9IG51bGw7Ci0JCQkJfQotCQkJCWlmIChoYW5kbGVyICE9IG51bGwpCi0JCQkJCWFSZXNvdXJjZVNldC5hZGQoaGFuZGxlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgKGFuZCB0aGUgZGlyZWN0b3J5IGlmIGRlbGV0ZVJvb3QgaXMgdHJ1ZSkuCi0JICogQHBhcmFtIHJvb3QKLQkgKiBAcGFyYW0gZGVsZXRlUm9vdCA8Y29kZT50cnVlPC9jb2RlPiB0byBkZWxldGUgdGhlIHJvb3QgZGlyZWN0b3J5IHRvby4KLQkgKiBAcGFyYW0gbW9uaXRvciAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIHdhcyBhbiBlcnJvciBkZWxldGluZyBhbnl0aGluZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRGlyZWN0b3J5Q29udGVudChGaWxlIHJvb3QsIGJvb2xlYW4gZGVsZXRlUm9vdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLQkJaWYgKHJvb3QuY2FuUmVhZCgpKSB7Ci0JCQlpZiAocm9vdC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJRmlsZVtdIGZpbGVzID0gcm9vdC5saXN0RmlsZXMoKTsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlRm9ybWF0LmZvcm1hdChFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQcm9qZWN0VXRpbF9EZWxldGVfMSIpLCBuZXcgT2JqZWN0W10ge3Jvb3QuZ2V0TmFtZSgpfSksIGZpbGVzLmxlbmd0aCsoZGVsZXRlUm9vdCA/IDEgOiAwKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKQotCQkJCQkJZXJyb3IgfD0gZGVsZXRlRGlyZWN0b3J5Q29udGVudChmaWxlc1tpXSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJCWVsc2UgewotCQkJCQkJZXJyb3IgfD0gIWZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZUZvcm1hdC5mb3JtYXQoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdFV0aWxfRGVsZXRlXzEiKSwgbmV3IE9iamVjdFtdIHtyb290LmdldE5hbWUoKX0pLCAxKTsJCQkJIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChkZWxldGVSb290KSB7Ci0JCQkJZXJyb3IgfD0gIXJvb3QuZGVsZXRlKCk7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBlbHNlIHsKLQkJCWVycm9yID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhIGNsZWFuIHJlc291cmNlIGNoYW5nZWxpc3RlbmVyLgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqIEBwYXJhbSBldmVudE1hc2sgbWFzayBvZiBldmVudCB0eXBlcyB0byBsaXN0ZW4gZm9yIGluIGFkZGl0aW9uIHRvIG9uZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IGZvciBjbGVhbi4gVXNlIDAgaWYgbm8gYWRkaXRpb25hbCBvbmVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDbGVhblJlc291cmNlQ2hhbmdlTGlzdGVuZXIoQ2xlYW5SZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyLCBpbnQgZXZlbnRNYXNrKSB7Ci0JCS8vIFBSRV9CVUlMRDogSGFuZGxlIENsZWFuLgotCQkvLyBUT0RPIFVudGlsIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDE5NDIgaXMgZml4ZWQsIHdlIG11c3QgZG8gUE9TVF9CVUlMRCwgdGhhdCB3aWxsIHByb2JhYmx5IGJlIHNlbnQgYmVjYXVzZSBhIGNsZWFuIHdpbGwgY2F1c2UgYSBidWlsZCB0byBvY2N1ciB3aGljaCBzaG91bGQgY2F1c2UgYSBkZWx0YS4KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsIGV2ZW50TWFzayB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQpOwkJCi0JfQotCQotCS8qKgotCSAqIEEgcmVzb3VyY2UgbGlzdGVuZXIgdGhhdCBjYW4gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBsaXN0ZW4gZm9yIENsZWFuIHJlcXVlc3RzIGFuZCBwcm9jZXNzIHRoZW0uCi0JICogPHA+Ci0JICogVXNlIDxjb2RlPntAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQUkVfQlVJTER9PC9jb2RlPiB3aGVuIGFkZGluZyBhcyBsaXN0ZW5lciB0byBnZXQgdGhlCi0JICogY2xlYW4gZXZlbnRzLgotCSAqIDxwPgotCSAqIDxiPk5vdGU8L2I+IDogVE9ETyBVbnRpbCBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxOTQyIGlzIGZpeGVkLCB5b3UgbXVzdCBkbyBQT1NUX0JVSUxELCB0aGF0IHdpbGwgcHJvYmFibHkgYmUgc2VudCBiZWNhdXNlIGEgY2xlYW4gd2lsbCBjYXVzZSBhIGJ1aWxkIHRvIG9jY3VyIHdoaWNoIHNob3VsZCBjYXVzZSBhIGRlbHRhLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQ2xlYW5SZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQkKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGhhbmRsZSBtb3JlIGV2ZW50cyB0aGFuIGp1c3QgY2xlYW4uCi0JCQlpZiAoZXZlbnQuZ2V0QnVpbGRLaW5kKCkgPT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCkgewotCQkJCWlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJCQljbGVhblByb2plY3QoKElQcm9qZWN0KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQkJZWxzZSBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJV29ya3NwYWNlKQotCQkJCQljbGVhbkFsbCgpOwkJCQkKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBDbGVhciBvdXQgdGhlIHByb2plY3QuCi0JCSAqIEBwYXJhbSBwcm9qZWN0Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNsZWFuUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KTsKLQotCQkvKioKLQkJICogQ2xlYW4gYWxsLgotCQkgKiA8cD4KLQkJICogQnkgZGVmYXVsdCB0aGlzIHdpbGwgc2ltcGx5IGNhbGwgYSBjbGVhbiBwcm9qZWN0IG9uIGVhY2ggb3BlbiBwcm9qZWN0LiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhbmQgZWl0aGVyCi0JCSAqIGFkZCBtb3JlIGZ1bmN0aW9uIHRvIGNsZWFyIG91dCBub24tcHJvamVjdCBkYXRhIGFuZCB0aGVuIGNhbGwgc3VwZXIuIE9yIGlmIHRoZXkgY2FuIGhhbmRsZSBhbGwgb2YgdGhlIHByb2plY3RzCi0JCSAqIGluIGEgZmFzdGVyIHdheSwgdGhlbiBjYW4gY29tcGxldGVseSBoYW5kbGUgdGhpcy4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgY2xlYW5BbGwoKSB7Ci0JCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotCQkJCQljbGVhblByb2plY3QocHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IHJlc291cmNlIHNldCBmb3IgdGhlIHBsdWdpbiAodGhlcmUgaXMgb25lIGZvciB0aGUgd2hvbGUgc3lzdGVtKS4KLQkgKiAKLQkgKiBAcmV0dXJuIHN5c3RlbS13aWRlIHJlc291cmNlIHNldC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGdldFBsdWdpblJlc291cmNlU2V0KCkgewotCQlpZiAocGx1Z2luUmVzb3VyY2VTZXQgPT0gbnVsbCkKLQkJCXBsdWdpblJlc291cmNlU2V0ID0gbmV3IFByb2plY3RSZXNvdXJjZVNldEltcGwobnVsbCk7Ci0JCXJldHVybiBwbHVnaW5SZXNvdXJjZVNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHN5c3RlbS13aWRlIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gc2V0Ci0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFBsdWdpblJlc291cmNlU2V0KFJlc291cmNlU2V0IHNldCkgewotCQlwbHVnaW5SZXNvdXJjZVNldCA9IHNldDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGdsb2JhbCBsb2FkaW5nIHBsdWdpbiBuYW1lcy4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0R2xvYmFsTG9hZGluZ1BsdWdpbk5hbWVzKCkgewotCQlpZiAoR0xPQkFMX0xPQURJTkdfUExVR0lOX05BTUVTID09IG51bGwpCi0JCQlHTE9CQUxfTE9BRElOR19QTFVHSU5fTkFNRVMgPSByZWFkR2xvYmFsTG9hZGluZ1BsdWdpbk5hbWVzKCk7Ci0JCXJldHVybiBHTE9CQUxfTE9BRElOR19QTFVHSU5fTkFNRVM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBMb2dnZXIgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gbG9nZ2VyIGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCXJldHVybiBMb2dnZXIuZ2V0TG9nZ2VyKElEKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSByZWFkR2xvYmFsTG9hZGluZ1BsdWdpbk5hbWVzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4UG9pbnQgPSByZWcuZ2V0RXh0ZW5zaW9uUG9pbnQoSUQsICJnbG9iYWxQbHVnaW5SZXNvdXJjZUxvYWQiKTsgLy8kTk9OLU5MUy0xJAotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4UG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbZXh0ZW5zaW9ucy5sZW5ndGhdOwotCQlpZiAoZXh0ZW5zaW9ucy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0JCQkJbmFtZXNbaV0gPSBleHRlbnNpb25zW2ldLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMjljODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL1BFUkZNU1IuUkVBRE1FLnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvUEVSRk1TUi5SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTg2YTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvUEVSRk1TUi5SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotVGhpcyBpcyBhIHN0dWIgcGx1Z2luIGZvciBwZXJmbXNyLiBJdCBpcyBoZXJlIGp1c3Qgc28gdGhhdCBvcmcuZWNsaXBzZS5qZW0udXRpbCBjYW4gY29tcGlsZS4KLQotSXQgc2hvdWxkIG5vdCBiZSBhbiBvcGVuIHByb2plY3QgZHVyaW5nIG5vcm1hbCB1c2FnZS4gV2hlbmV2ZXIgYW55IG9mIHRoZSBmaWxlcyBpbiB0aGlzIHByb2plY3QKLWFyZSBjaGFuZ2VkLCAicGVyZm1zci5qYXJkZXNjIiBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG5ldyBjaGFuZ2VkIGFwcHJvcHJpYXRlIGphci4gRG8gdGhpcyBieToKLQotMSkgU2VsZWN0IHBlcmZtc3IuamFyZGVzYwotMikgT24gcG9wdXAgbWVudSBzZWxlY3QgIkNyZWF0ZSBKQVIiCi0zKSBIaXQgIkZpbmlzaCIKLTQpIENvbW1pdCBhbGwgY2hhbmdlcyB0byBDVlMuCi01KSBHbyB0byBvcmcuZWNsaXBzZS5qZW0udXRpbCBwcm9qZWN0LCBzZWxlY3QgdGhlIG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViIGZvbGRlcgotICAgYW5kIHNlbGVjdCBSZXBsYWNlLT5MYXRlc3QgZnJvbSBIRUFELiBUaGlzIHdpbGwgY2F1c2UgeW91ciBqdXN0IGNvbW1pdHRlZCBjaGFuZ2VzCi0gICBmcm9tIHN0ZXAgNCB0byBiZSBwdXQgaW50byBvcmcuZWNsaXBzZS5qZW0udXRpbCBhbmQgd2lsbCBiZSBwaWNrZWQgdXAgZm9yIHRoYXQKLSAgIHBsdWdpbiB0byBjb21waWxlIGFnYWluc3QuCi02KSBFaXRoZXIgY2xvc2Ugb3IgZGVsZXRlIHRoZSBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1ZiBwcm9qZWN0IGZyb20gdGhlIHdvcmtzcGFjZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjIzOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjMwdGggTWFyY2gsIDIwMDQ8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIEVQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBFUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIEVQTC48L3A+Ci0KLTxwPjxiPlZlcnNpb246PC9iPiB2MjAwNDA2MjRhCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNGRiNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgKi5qYXIKLXNvdXJjZS5wZXJmbXNyLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXIgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWJiYThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyZGVzYyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXJkZXNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhlMjIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXJkZXNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxqYXJkZXNjPgotICAgIDxqYXIgcGF0aD0ib3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXIiLz4KLSAgICA8b3B0aW9ucyBidWlsZElmTmVlZGVkPSJ0cnVlIiBjb21wcmVzcz0idHJ1ZSIgZGVzY3JpcHRpb25Mb2NhdGlvbj0iL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyZGVzYyIgZXhwb3J0RXJyb3JzPSJ0cnVlIiBleHBvcnRXYXJuaW5ncz0idHJ1ZSIgb3ZlcndyaXRlPSJmYWxzZSIgc2F2ZURlc2NyaXB0aW9uPSJ0cnVlIiB1c2VTb3VyY2VGb2xkZXJzPSJmYWxzZSIvPgotICAgIDxtYW5pZmVzdCBnZW5lcmF0ZU1hbmlmZXN0PSJ0cnVlIiBtYW5pZmVzdExvY2F0aW9uPSIvVkVTY3JhcFByb2plY3QvTUFOSUZFU1QubWYiIG1hbmlmZXN0VmVyc2lvbj0iMS4wIiByZXVzZU1hbmlmZXN0PSJmYWxzZSIgc2F2ZU1hbmlmZXN0PSJmYWxzZSIgdXNlc01hbmlmZXN0PSJ0cnVlIj4KLSAgICAgICAgPHNlYWxpbmcgc2VhbEphcj0iZmFsc2UiPgotICAgICAgICAgICAgPHBhY2thZ2VzVG9TZWFsLz4KLSAgICAgICAgICAgIDxwYWNrYWdlc1RvVW5TZWFsLz4KLSAgICAgICAgPC9zZWFsaW5nPgotICAgIDwvbWFuaWZlc3Q+Ci0gICAgPHNlbGVjdGVkRWxlbWVudHMgZXhwb3J0Q2xhc3NGaWxlcz0idHJ1ZSIgZXhwb3J0SmF2YUZpbGVzPSJ0cnVlIiBleHBvcnRPdXRwdXRGb2xkZXI9ImZhbHNlIj4KLSAgICAgICAgPGphdmFFbGVtZW50IGhhbmRsZUlkZW50aWZpZXI9Ij1vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMiLz4KLSAgICA8L3NlbGVjdGVkRWxlbWVudHM+Ci08L2phcmRlc2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyMGVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBsdWdpbi5uYW1lPVBlcmZvcm1hbmNlIE1vbml0b3IKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTY5MjZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UucGVyZm1zci5jb3JlIgotICAgbmFtZT0iJVBsdWdpbi5uYW1lIgotICAgdmVyc2lvbj0iMy4wLjAiCi0gICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuUGVyZk1zckNvcmVQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InBlcmZtc3IuamFyIj48ZXhwb3J0IG5hbWU9IioiLz48L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICAKLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9JUGVyZm9ybWFuY2VNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvSVBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDk5MmM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9JUGVyZm9ybWFuY2VNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmU7Ci0KLS8qKgotICogVGFrZSBzbmFwc2hvdHMgb2YgdGhlIHZhcmlvdXMgcGVyZm9ybWFuY2UgY291bnRlcnMuCi0gKiAqKioqKioqKioqKioqIFRoaXMgaXMganVzdCBhIHN0dWIgb2YgdGhlIHJlYWwgaW50ZXJmYWNlIHRvIGdldCBvcmcuZWNsaXBzZS5qZW0udXRpbCAKLSAqICAgICAgICAgICAgICAgdG8gY29tcGlsZS4gSXQgaXMgbm90IHVzYWJsZSBieSBpdHNlbGYuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJUGVyZm9ybWFuY2VNb25pdG9yCi17Ci0JLyoqCi0JICogVGhlc2UgY29uc3RhbnRzIGNvbnRyb2wgaG93IG11Y2ggaW5mb3JtYXRpb24gaXMgZ2F0aGVyZWQgZm9yIGEgcGFydGljdWxhciBzbmFwc2hvdC4KLQkgKiBUaGV5IGFyZSBvcidlZCB0b2dldGhlciBhbmQgcGFzc2VkIGludG8gdGhlIHNuYXBzaG90IG1ldGhvZC4gIAotCSAqLwotCWludGVyZmFjZSBUeXBlcwotCXsKLQkJLyoqIAotCQkgKiAxIC0gV3JpdGUgb3V0IHRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBUaGVzZQotCQkgKiBpbmNsdWRlIHdvcmtpbmcgc2V0LCBwZWFrIHdvcmtpbmcgc2V0LCBlbGFwc2VkIHRpbWUsIHVzZXIgdGltZSwgYW5kIAotCQkgKiBrZXJuZWwgdGltZS4KLQkJICovCi0JCWludCBPcGVyYXRpbmdTeXN0ZW1Db3VudGVycwkJPSAxOwotCQkKLQkJLyoqCi0JCSAqIDIgLSBXcml0ZSBvdXQgdGhlIGdsb2JhbCBwZXJmb3JtYW5jZSBpbmZvLiBUaGlzIGluY2x1ZGVzIHRoaW5ncyBsaWtlIHRoZSB0b3RhbAotCQkgKiBjb21taXR0ZWQgbWVtb3J5IGZvciB0aGUgZW50aXJlIHN5c3RlbS4KLQkJICogCi0JCSAqIFRoaXMgZnVuY3Rpb24gZGVwZW5kcyBvbiB0aGUgR2V0UGVyZm9ybWFuY2VJbmZvKCkgZnVuY3Rpb24gYmVpbmcgYXZhaWxhYmxlIGluCi0JCSAqIHRoZSBXaW5kb3dzIHBzYXBpLmRsbC4gVGhpcyBpcyBhdmFpbGFibGUgaW4gWFAgYnV0IGlzIHVzdWFsbHkgbm90IGF2YWlsYWJsZQotCQkgKiBpbiBXaW4vMjAwMC4gSWYgaXQgaXMgbm90IGF2YWlsYWJsZSB0aGVuIHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgotCQkgKi8KLQkJaW50IEdsb2JhbFN5c3RlbUNvdW50ZXJzCQk9IDI7Ci0JCQotCQkvKioKLQkJICogNCAtIFdyaXRlIG91dCB0aGUgc2l6ZSBvZiB0aGUgSmF2YSBIZWFwLgotCQkgKi8KLQkJaW50IEphdmFIZWFwU2l6ZQkJCQk9IDQ7Ci0KLQkJLyoqCi0JCSAqIDggLSBXcml0ZSBvdXQgaG93IG11Y2ggb2YgdGhlIEphdmEgaGVhcCBpcyBiZWluZyB1c2VkLiBUaGlzIGNhbGxzIHRoZSAKLQkJICogZ2FyYmFnZSBjb2xsZWN0b3Igc28gaXQgbWF5IHNrZXcgdGltaW5nIHJlc3VsdHMuCi0JCSAqLwotCQlpbnQgSmF2YUhlYXBVc2VkCQkJCT0gODsKLQkJCi0JCS8qKgotCQkgKiAxNiAtIFRoZSBwbHVnaW4gc3RhcnR1cCBhbmQgc2l6ZSBpbmZvcm1hdGlvbi4KLQkJICovCi0JCWludCBQbHVnaW5JbmZvCQkJCQk9IDE2OwotCQkKLQkJLyoqIDB4ZmZmZiAtIEV2ZXJ5dGhpbmcuICovCi0JCWludCBBbGwJCQkJCQkJPSAweGZmZmY7CQotCX0KLQkKLQkvKioKLQkgKiBBZGQgc29tZSBtb3JlICJleHRyYSIgdmFyaWF0aW9ucy4gCi0JICogCi0JICogVGhlIHZhcmlhdGlvbnMgdGhhdCBhcmUgaW4gZWZmZWN0IGFyZSBtYWRlIHVwIG9mIHRoZXNlIGV4dHJhIHZhcmlhdGlvbnMgcGx1cyBhbnkgdmFyaWF0aW9ucwotCSAqIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgd2l0aCB0aGUgc2V0VmFyKCkgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB2YXJMaXN0IGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdmFyaWF0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZhckFwcGVuZChTdHJpbmcgdmFyTGlzdCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBkcml2ZXIgbmFtZS4gCi0JICogCi0JICogQHBhcmFtIGRyaXZlciBhIGxhYmVsIHRoYXQgaWRlbnRpZmllcyB0aGUgZHJpdmVyIHRoYXQgaXMgYmVpbmcgdGVzdGVkLiBJZiBpdCBpcyBhIFdTQUQKLQkgKiBkcml2ZXIsIHRoaXMgd2lsbCB1c3VhbGx5IGJlIHNldCBieSB0aGUgZXh0ZW5zaW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERyaXZlcihTdHJpbmcgZHJpdmVyKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBmaWxlLCB0aGF0IGlzIHRoZSBwbGFjZSB3aGVyZQotCSAqIHRoZSBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nRmlsZSB0aGUgZmlsZSBuYW1lIG9mIHdoZXJlIHRoZSBsb2cgc2hvdWxkIGJlIHdyaXR0ZW4uIFVzdWFsbHkgdGhpcyBpcyBmdWxseSBxdWFsaWZpZWQKLQkgKiBwYXRoIG5hbWUuIEZvciBleGFtcGxlICJ4Olxsb2dzXHRpbWVyLnhtbCIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9nRmlsZShTdHJpbmcgbG9nRmlsZSk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIHRvIGJlIG9uIG9yIG9mZi4gSWYgaXQgaXMgb2ZmIHRoZW4gbW9zdCBvZiB0aGUgb3RoZXIgCi0JICogb3BlcmF0aW9ucyB3aWxsIG5vLW9wLgotCSAqIAotCSAqIFRoZSBkZWZhdWx0IGlzIGZvciB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciB0byBiZSBvZmYgdW5sZXNzIGl0J3Mgc3BlY2lhbCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuIAotCSAqIFdoZW4gY2FsbGVkIGZyb20gdGhlIFVJLCB0aGUgVUkgc2hvdWxkIGNhbGwgdGhpcyB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc09uKGJvb2xlYW4gaXNPbik7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdGVzdCBjYXNlIG51bWJlciBmb3IgdGhpcyBtZWFzdXJlbWVudCBydW4uCi0JICogIAotCSAqIEBwYXJhbSB0ZXN0ZCB0ZXN0IGNhc2UgaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlc3RkKGludCB0ZXN0ZCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdGVzdCBjYXNlIG5hbWUuIElmIHdpbGwgY2F1c2UgYSBuZXcgdGVzdCBjYXNlIHRvIGJlIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdE5hbWUgYSBzaW1wbGUgKHNob3J0KSB0ZXN0IGNhc2UgbmFtZS4gSW4gdGhlIGNhc2Ugb2YgSlVuaXQgdGVzdCBjYXNlcywgaXQgd291bGQgdXN1YWxseSAKLQkgKiBiZSB0aGUgSlVuaXQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXN0TmFtZShTdHJpbmcgdGVzdE5hbWUpOwotCQotCS8qKgotCSAqIFNldCB0aGUgdmFyaWF0aW9ucyB0aGF0IGFyZSBpbiBlZmZlY3QuCi0JICogCi0JICogQHBhcmFtIHZhciBhIGNvbW1hIGRlbGltaXRlZCBzdHJpbmcgb2YgdmFyaWF0aW9uIG51bWJlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcik7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB1cGxvYWQgaG9zdAotCSAqIAotCSAqIEBwYXJhbSBob3N0IEROUyBuYW1lIG9mIHRoZSB1cGxvYWQgaG9zdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwbG9hZEhvc3QoU3RyaW5nIGhvc3QpOwotCQotCS8qKgotCSAqIFNldCB0aGUgdXBsb2FkIHBvcnQKLQkgKiAKLQkgKiBAcGFyYW0gcG9ydCB1cGxvYWQgcG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwbG9hZFBvcnQoaW50IHBvcnQpOwotCQotCS8qKgotCSAqIFNldCB0aGUgdXBsb2FkIHVzZXJpZAotCSAqIAotCSAqIEBwYXJhbSB1c2VyaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGxvYWRVc2VyaWQoU3RyaW5nIHVzZXJpZCk7Ci0JCi0JLyoqCi0JICogVGFrZSBhIHNuYXBzaG90IG9mIHNvbWUgZGVmYXVsdCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMuCi0JICogCi0JICogQHBhcmFtIHN0ZXAgdGhpcyBpZGVudGlmaWVzIHRoZSBzdGVwIHRoYXQgdGhlIHNuYXBzaG90IGlzIGZvcgotCSAqLwotCXZvaWQgc25hcHNob3QoaW50IHN0ZXApOwotCQotCS8qKgotCSAqIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgc2VsZWN0ZWQgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBzdGVwIHRoaXMgaWRlbnRpZmllcyB0aGUgc3RlcCB0aGF0IHRoZSBzbmFwc2hvdCBpcyBmb3IKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZXMgVGhpcyBjb250cm9scyB3aGljaCBtZWFzdXJlbWVudHMgYXJlIHNlbGVjdGVkLiBJdCBpcyBhbiBvcidkIHRvZ2V0aGVyCi0JICogbGlzdCBvZiB0aGUgSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcyBjb25zdGFudHMuCi0JICogCi0JICogQHNlZSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzIAotCSAqLwotCXZvaWQgc25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcyk7Ci0JCi0JLyoqCi0JICogV3JpdGUgdGhlIGNvbW1lbnQgdG8gdGhlIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGZpbGUuCi0JICogCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKi8KLQl2b2lkIHdyaXRlQ29tbWVudChTdHJpbmcgY29tbWVudCk7Ci0JCi0JLyoqCi0JICogVXBsb2FkIHRoZSByZXN1bHRzIHRvIHRoZSBzZXJ2ZXIuIFRoaXMgY2F1c2VzIHRoZSBmaWxlIHRvIGJlCi0JICogY2xvc2VkLCBhbmQgdGhlIG1vbml0b3IgdG8gYmUgcGxhY2VkIGludG8gdGhlIGZpbmlzaGVkIHN0YXRlLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgdXBsb2FkaG9zdCwgdXBsb2FkcG9ydCBhbmQgdXBsb2FkdXNlcmlkCi0JICogaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgYmVmb3JlIGhhbmQuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIChpdCBjYW4gYmUgbnVsbCkKLQkgKiAKLQkgKiBAcmV0dXJuIHNvbWUgc3RhdHVzIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIFVwbG9hZC5TdGF0dXMgdXBsb2FkKFN0cmluZyBkZXNjcmlwdGlvbik7Ci0vLwkKLS8vCS8qKgotLy8JICogVXBsb2FkIHRoZSByZXN1bHRzIHRvIHRoZSBzZXJ2ZXIuIFRoaXMgY2F1c2VzIHRoZSBmaWxlIHRvIGJlCi0vLwkgKiBjbG9zZWQsIGFuZCB0aGUgbW9uaXRvciB0byBiZSBwbGFjZWQgaW50byB0aGUgZmluaXNoZWQgc3RhdGUuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBob3N0IHRoZSBob3N0IG5hbWUgdGhhdCB0aGUgZmlsZSBpcyBiZWluZyBzZW50IHRvCi0vLwkgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCBvbiB0aGUgaG9zdAotLy8JICogQHBhcmFtIHVzZXJpZCB0aGUgdXNlcmlkIHRoYXQgaXMgZG9pbmcgdGhlIHVwbG9hZAotLy8JICogQHBhcmFtIGRlc2NyaXB0aW9uIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIChpdCBjYW4gYmUgbnVsbCkKLS8vCSAqIAotLy8JICogQHJldHVybiBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbgotLy8JICovCi0vLwlVcGxvYWQuU3RhdHVzIHVwbG9hZChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyB1c2VyaWQsIFN0cmluZyBkZXNjcmlwdGlvbik7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL1BlcmZNc3JDb3JlUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvUGVyZk1zckNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1YmEyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvUGVyZk1zckNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotIAotCi0vKioKLSAqICoqKioqKioqKioqKiogVGhpcyBpcyBqdXN0IGEgc3R1YiBvZiB0aGUgcmVhbCBjbGFzcyB0byBnZXQgb3JnLmVjbGlwc2UuamVtLnV0aWwgCi0gKiAgICAgICAgICAgICAgIHRvIGNvbXBpbGUuIEl0IGlzIG5vdCB1c2FibGUgYnkgaXRzZWxmLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcmZNc3JDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkKLQlwdWJsaWMgc3RhdGljIElQZXJmb3JtYW5jZU1vbml0b3IgZ2V0UGVyZm9ybWFuY2VNb25pdG9yKGJvb2xlYW4gYm9vbCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9VcGxvYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9VcGxvYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmYTY3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvVXBsb2FkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlOwotIAotCi0vKioKLSAqIFVwbG9hZC4KLSAqICoqKioqKioqKioqKiogVGhpcyBpcyBqdXN0IGEgc3R1YiBvZiB0aGUgcmVhbCBpbnRlcmZhY2UgdG8gZ2V0IG9yZy5lY2xpcHNlLmplbS51dGlsIAotICogICAgICAgICAgICAgICB0byBjb21waWxlLiBJdCBpcyBub3QgdXNhYmxlIGJ5IGl0c2VsZi4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVwbG9hZCB7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0dXMgewotCQlwdWJsaWMgYm9vbGVhbiBzdWNjZXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTNkYjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9jb21tb24ubW92ZS93ZWJ0b29scy5jb21tb24uZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzAyLzE1IDIzOjA3OjQ1ICQKLSMKLQotCi1wbHVnaW5OYW1lPUphdmEgRU1GIE1vZGVsIFV0aWxpdGllcwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxYmU0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgIAotPCEtLSBFeHRlbnNpb24gcG9pbnQgdG8gcmVnaXN0ZXIgUmVzb3VyY2VIYW5kbGVycyB0aGF0IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIAotCW5ldyBXb3JrYmVuY2hDb250ZXh0cyAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IlJlc291cmNlSGFuZGxlckV4dGVuc2lvbiIgbmFtZT0iUmVzb3VyY2VIYW5kbGVyRXh0ZW5zaW9uIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJnbG9iYWxQbHVnaW5SZXNvdXJjZUxvYWQiIG5hbWU9Ikdsb2JhbCBQbHVnaW4gUmVzb3VyY2UgTG9hZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibmF0dXJlX3JlZ2lzdHJhdGlvbiIgbmFtZT0iRU1GIE5hdHVyZSByZWdpc3RyYXRpb24iLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImludGVybmFsV29ya2JlbmNoQ29udGV4dEZhY3RvcnkiIG5hbWU9IkludGVybmFsIFdvcmtiZW5jaCBDb250ZXh0IEZhY3RvcnkiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIiBuYW1lPSJVSSBDb250ZXh0IFNlbnNpdGl2ZSBDbGFzcyIgc2NoZW1hPSJzY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idWlUZXN0ZXIiIG5hbWU9IlVJIFRlc3RlciIgc2NoZW1hPSJzY2hlbWEvdWlUZXN0ZXIuZXhzZCIvPiAgIAotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcHJvcGVydHlfZmlsZXMvZW1md29ya2JlbmNoLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3Byb3BlcnR5X2ZpbGVzL2VtZndvcmtiZW5jaC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWQ5NDgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcHJvcGVydHlfZmlsZXMvZW1md29ya2JlbmNoLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMD1JV0FFMDAwM0UgTWV0aG9kIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCi1FTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8xPUlXQUUwMDA1RSBQcm9qZWN0IGNhbiBub3QgYmUgbnVsbC4KLUVNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzI9SVdBRTAwMDZFIEF0dGVtcHQgdG8gY3JlYXRlIHJlc291cmNlIHNldCB3aXRoIG51bGwgcHJvamVjdAotRU1GTmF0dXJlUmVnaXN0cnlfRVJST1JfMD1JV0FFMDAwN0UgRHVwbGljYXRlIEVNRiBuYXR1cmUgcmVnaXN0cmF0aW9uIGZvciBpZDogezB9Ci1FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeV9VSV8wPVRoZSBwcm9qZWN0IHNob3VsZCBub3QgYmUgbnVsbC4KLUVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5X1VJXzE9VGhlIHByb2plY3QgXCJ7MH1cIiBpcyBub3QgYWNjZXNzaWJsZS4KLQotUHJvamVjdFV0aWxfRGVsZXRlXzE9RGVsZXRpbmcgXCJ7MH1cIi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3NjaGVtYS91aUNvbnRleHRTZW5zaXRpdmVDbGFzcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3MGU5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3NjaGVtYS91aUNvbnRleHRTZW5zaXRpdmVDbGFzcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmplbS51dGlsIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIgaWQ9InVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIiBuYW1lPSJVSSBDb250ZXh0IFNlbnNpdGl2ZSBDbGFzcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb21wb25lbnRzIGFyZSBvZnRlbiBkZXNpZ25lZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlICZxdW90O0hlYWRsZXNzJnF1b3Q7IG9yIG5vbi1ncmFwaGljYWwgcG9ydGlvbnMgYXJlIHNlcGFyYXRlIGZyb20gdGhlIEdyYXBoaWNhbCBVc2VyIEludGVyZmFjZSAoR1VJKSBwb3J0aW9ucy4gU29tZXRpbWVzIHRoaXMgaXMgZG9uZSB0byBmb2xsb3cgZ29vZCBkZXNpZ24gcHJpbmNpcGxlcywgb3RoZXIgdGltZXMgdGhlcmUgaXMgYSBzcGVjaWZpYyB1c2UgY2FzZSBmb3IgZG9pbmcgc28uIFdoZW4gcGx1Z2lucyBmb2xsb3cgdGhpcyBwcmFjdGljZSBiZWNhdXNlIHRoZXkgbXVzdCB2YXJ5IHRoZWlyIGJlaGF2aW9yIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgcnVubmluZyBpbiBhIGhlYWRsZXNzIGVudmlyb25tZW50IG9yIGEgZ3JhcGhpY2FsIGVudmlyb25tZW50LCB0aGV5IG9mdGVuIG5lZWQgdG8gY2hvb3NlIHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uIG9mIGEgcGFydGljdWxhciB0eXBlLiBUaGUgb3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVkIGJ5IHRoZSBKRU0gY29tcG9uZW50IHNvbHZlcyBleGFjdGx5IHRoaXMgcHJvYmxlbS4KLSZsdDtwJmd0OyAgICAKLVRvIHVzZSB0aGUgZXh0ZW5zaW9uIHBvaW50LCB5b3UgbXVzdCBwcm92aWRlIHR3byBleHRlbnNpb25zIHRoYXQgYXJlIGxpbmtlZCBieSBhIGtleS4gVGhlIGtleSBpcyBhIHVuaXF1ZSBTdHJpbmctYmFzZWQgdmFsdWUgdGhhdCB5b3Ugd2lsbCBsYXRlciB1c2UgdG8gaW5zdGFuaXRhdGUgeW91ciBjbGFzcy4KLSZsdDtwJmd0OwotVGhlIGZpcnN0IHVzYWdlIG9mIHRoZSBleHRlbnNpb24gc3BlY2lmaWVzIHlvdXIga2V5LCBhbmQgdGhlIEhlYWRsZXNzIGNvbnRleHQsIGFuZCB0aGUgY2xhc3MgdGhhdCBzaG91bGQgYmUgaW5zdGFudGlhdGVkIGZvciB0aGlzIChrZXksIGNvbnRleHQpIHBhaXIuIFRoaXMgbWVhbnMgaW4gdGhlIGhlYWRsZXNzIGVudmlyb25tZW50IHRoaXMgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXF1ZXN0ZWQuCi0mbHQ7cCZndDsKLVRoZSBzZWNvbmQgZXh0ZW5zaW9uIHNwZWNpZmllcyB0aGUgVUkgY29udGV4dCBhbmQgdGhlIHNhbWUga2V5LCBidXQgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGVzaWduZWQgZm9yIGdyYXBoaWNhbCBlbnZpcm9ubWVudHMuIFRoaXMgbWVhbnMgaW4gdGhlIFVJIGVudmlyb25tZW50IHRoaXMgb3RoZXIgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXF1ZXN0ZWQuCi0mbHQ7cCZndDsKLVRoZSBhY3R1YWwgcmVxdWVzdCBpcyBkb25lIGluIHlvdXIgY29kZSB2aWE6Ci0mbHQ7cHJlJmd0OwotSU15SW50ZXJmYWNlIGluc3RhbmNlID0gKElNeUludGVyZmFjZSkgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZSgmcXVvdDtteUtleSZxdW90Oyk7Ci0mbHQ7L3ByZSZndDsKLXdoZXJlICZsdDtjb2RlJmd0OyZxdW90O215S2V5JnF1b3Q7Jmx0Oy9jb2RlJmd0OyBpcyB0aGUga2V5IHVzZWQgb24gYm90aCBleHRlbnNpb25zLiBJdCB3aWxsIHRoZW4gY2hvb3NlIGVpdGhlciB0aGUgVUkgb3IgdGhlIEhlYWRsZXNzIGV4dGVuc2lvbiBkZXBlbmRpbmcgdXBvbiB0aGUgY29udGV4dC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBbiBleHRlbnNpb24gcG9pbnQgdGhhdCBkZWZpbmVzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgYW5kIGl0cyBhcHByb3ByaWF0ZSBjb250ZXh0IChVSSBvciBIZWFkbGVzcykKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBrZXkgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIENvbnRleHQgU2Vuc2l0aXZlIHN1cGVyIGNsYXNzL2ludGVyZmFjZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgZWl0aGVyIGEgVUkgb3IgSGVhZGxlc3MgY29udGV4dC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZXh0IiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBPbmUgb2YgJnF1b3Q7VUkmcXVvdDsgb3IgJnF1b3Q7SGVhZGxlc3MmcXVvdDsgVGhpcyBpcyBjYXNlLXNlbnNpdGl2ZS4gSXQgbXVzdCBtYXRjaCBleGFjdGx5IGFzIHNob3duIGhlcmUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJVSSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJIZWFkbGVzcyI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgNi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFVzYWdlIGZvciB0aGUgVUkgY29udGV4dDoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgaWQ9JnF1b3Q7Y29udGV4dC5TZW5zaXRpdmUuQ2xhc3Mud29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7Ci0gICAgICAgbmFtZT0mcXVvdDtXb3JraW5nIENvcHkgTWFuYWdlciAtIFVJIENvbnRleHQgQ2xhc3MmcXVvdDsKLSAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZW0udXRpbC5Db250ZXh0U2Vuc2l0aXZlQ2xhc3MmcXVvdDsmZ3Q7Ci0gICAgICZsdDt1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgIGNvbnRleHQ9JnF1b3Q7VUkmcXVvdDsKLSAgICAgICBrZXk9JnF1b3Q7d29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7Ci0gICAgICAgY2xhc3NOYW1lPSZxdW90O2NvbS5pYm0ud3RwLmNvbW1vbi51aS5XVFBVSVdvcmtpbmdDb3B5TWFuYWdlciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0O2JyJmd0OwotVXNhZ2UgZm9yIHRoZSBIZWFkbGVzcyBjb250ZXh0OgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICBpZD0mcXVvdDtjb250ZXh0LlNlbnNpdGl2ZS5DbGFzcy53b3JraW5nQ29weU1hbmFnZXImcXVvdDsKLSAgICAgICBuYW1lPSZxdW90O1dvcmtpbmcgQ29weSBNYW5hZ2VyIC0gSGVhZGxlc3MgQ29udGV4dCBDbGFzcyZxdW90OwotICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmplbS51dGlsLkNvbnRleHRTZW5zaXRpdmVDbGFzcyZxdW90OyZndDsKLSAgICAgJmx0O3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICBjb250ZXh0PSZxdW90O0hlYWRsZXNzJnF1b3Q7Ci0gICAgICAgICBrZXk9JnF1b3Q7d29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7Ci0gICAgICAgICBjbGFzc05hbWU9JnF1b3Q7Y29tLmlibS53dHAuY29tbW9uLnVpLldUUEhlYWRsZXNzV29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7YnImZ3Q7Ci1BbmQgZmluYWxseSB0aGUgcmV0cmlldmFsIG9mIHRoZSBjbGFzcyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dDoKLQotJmx0O3ByZSZndDsKLUlXb3JraW5nQ29weU1hbmFnZXIgbWFuYWdlciA9IChJV29ya2luZ0NvcHlNYW5hZ2VyKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKCZxdW90O3dvcmtpbmdDb3B5TWFuYWdlciZxdW90Oyk7Ci0mbHQ7L3ByZSZndDsKLQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFNlZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uJmx0Oy9jb2RlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgSUJNIDIwMDMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlUZXN0ZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvc2NoZW1hL3VpVGVzdGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOWFiMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlUZXN0ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qZW0udXRpbCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnV0aWwiIGlkPSJ1aVRlc3RlciIgbmFtZT0iVUkgVGVzdGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgaXMgdXNlZCB0byB0ZWxsIEpFTSB0aGF0IGl0IGlzIHJ1bm5pbmcgaW4gYSBub24tSEVBRExFU1MgZW52aXJvbm1lbnQuIFR5cGljYWxseSBVSSBlbnZpcm9ubWVudCBpcyBub24tSEVBRExFU1MuIFRoZSBkZWZhdWx0IGlmIHRoZXJlIGFyZSBubyBpbXBsZW1lbnRlcnMgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQgdGhhdCByZXR1cm4gdHJ1ZSBpcyBIRUFETEVTUy4KLSZsdDtwJmd0OwotQSBIRUFETEVTUyBlbnZpcm9ubWVudCBpcyB0eXBpY2FsbHkgYSBiYXRjaCBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgbm8gVUkgYW5kIHRoZSB3b3Jrc3BhY2UgaXMgdXNlZCBmb3Igb25lIG9wZXJhdGlvbiBhbmQgdGhlbiB0ZXJtaW5hdGVkLiBNb3N0IGhlYWRsZXNzIHRhc2tzIGFyZSBkb25lIHVuZGVyIG9uZSBvcGVyYXRpb24gYW5kIHRoZSBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplciBtYXkgbm90IGhhdmUgYSBjaGFuY2UgdG8gZmx1c2ggYSBiYWQgcmVmbGVjdGlvbiBiZWZvcmUgdGhlIHJlYWwgdHlwZSBuZWVkcyB0byBiZSBmb3VuZCBhbmQgY2FuIGJlIGZvdW5kLiBTbyB3aGF0IHdvdWxkIGhhcHBlbiBpcyBpZiBhIGNsYXNzIHdhcyBjcmVhdGVkIGR1cmluZyB0aGlzIG9uZSBvcGVyYXRpb24gaXQgd291bGQgbm90IGJlIGZvdW5kIGJlY2F1c2UgdGhlIG5vdGlmaWNhdGlvbnMgaGFkIG5vdCB5ZXQgZ29uZSBvdXQuIAotJmx0O3AmZ3Q7Ci1JbiBhIFVJIGVudmlyb25tZW50IHRoZSBvcGVyYXRpb25zIGFyZSB0eXBpY2FsbHkgc2hvcnQgYW5kIGRvIG9ubHkgYSBmZXcgdGhpbmdzIGFuZCB0aGUgcmVzdWx0cyBhcmVuJmFwb3M7dCBuZWVkZWQgdW50aWwgYWZ0ZXIgdGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiBJbiB0aGF0IGNhc2UgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gbm90IGtlZXAgY2hlY2tpbmcgaWYgYSBjbGFzcyBoYXMgYXBwZWFyZWQgZXZlcnl0aW1lIGEgcmVxdWVzdCBpcyBtYWRlLCBpbnN0ZWFkIGl0IHdpbGwgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbiBvZiB0aGUgYWRkZWQgY2xhc3MgdG8gYXBwZWFyIGJlZm9yZSByZXNldHRpbmcgdGhlIGRlZmluaXRpb24gdG8gYWxsb3cgY2hlY2tpbmcgYWdhaW4gbGF0ZXIuCi0mbHQ7cCZndDsKLUlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgaW1wbGVtZW50ZXIgb2YgdGhpcyBpbnRlcmZhY2UgaW4gdGhlIGFwcGxpY2F0aW9uLCB0aGVuIGl0IHdpbGwgZ28gdGhyb3VnaCBlYWNoIG9mIHRoZW0gb25jZSB1bnRpbCBvbmUgcmV0dXJucyB0cnVlLiBBcyBzb29uIGFzIG9uZSByZXR1cm5zIHRydWUgaXQgd2lsbCBzdG9wIGFuZCBtYXJrIHRoZSBhcHBsaWNhdGlvbiBhcyBiZWluZyBub24tSEVBRExFU1MuIFRoaXMgd2lsbCBiZSBkb25lIG9ubHkgb25jZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiBJdCB3aWxsIG5vdCBiZSBhZ2FpbiB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KLSZsdDtwJmd0OwotVGhpcyBpcyB0eXBpY2FsbHkgYW4gaW50ZXJuYWwgZXh0ZW5zaW9uIHBvaW50IG9ubHkuIFRoZSBKRU0gVUkgcGx1Z2luIHdpbGwgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIFBsYXRmb3JtIFVJIGlzIGFjdGl2ZS4gU28gdGhpcyB3aWxsIG5vcm1hbGx5IG5vdCBiZSBuZWVkZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgbW9zdCBjdXN0b21lcnMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVpVGVzdGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1aVRlc3RlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIHVpVGVzdGVyIGRlZmluaXRpb24gZWxlbWVudC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBVSVRlc3RlciBmb3IgdGhpcyBleHRlbnNpb24uIEl0IG11c3QgaW1wbGVtZW50ICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmplbS51dGlsLlVJVGVzdGVyJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmplbS51dGlsLlVJVGVzdGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMC4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBpbXBsZW1lbnRlcjogCi0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmplbS51dGlsLnVpVGVzdGVyJnF1b3Q7Jmd0OwotICAmbHQ7dWlUZXN0ZXIKLSAgIGNsYXNzTmFtZT0mcXVvdDtjb20uZXhhbXBsZS5VSVRlc3RlckltcGxlbWVudGF0aW9uJnF1b3Q7LyZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSAmbHQ7c2FtcCZndDtjbGFzc05hbWUmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBtdXN0IGJlIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLnV0aWwuVUlUZXN0ZXImbHQ7L3NhbXAmZ3Q7IGludGVyZmFjZSBmb3IgdGhlIHRlc3Rlci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlcmUgaXMgbm8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWYyYTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1zZWFyY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjg2MWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1zcmMuemlwCi1AZG90Ci10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1ZWQyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uc2VhcmNoL3BlcmY9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmIxMmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwNmRlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jTW9uIEphbiAzMCAyMzo0MDo1MiBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjhjZWI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gSmFuIDMwIDE5OjQ1OjQxIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDQyZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAxLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkM2U5MmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMtc2VhcmNoLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTIzOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgCi0gIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZSI+Ci0gIDxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2Y2RlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotISBQbHVnLWluIHByb3BlcnRpZXMKLXBsdWdpbk5hbWUgICAgID0gV1NUIENvbW1vbiBDb3JlIFBsdWctaW4KLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyZjZhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlYXJjaFBhcnRpY2lwYW50cyIgbmFtZT0iJXNlYXJjaFBhcnRpY2lwYW50cyIgLz4gICAgICAKLTwvcGx1Z2luPgotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NjaGVtYS9zZWFyY2hQYXJ0aWNpcGFudHMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NjaGVtYS9zZWFyY2hQYXJ0aWNpcGFudHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3Yzk0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvc2VhcmNoUGFydGljaXBhbnRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc2VhcmNoIiBpZD0ic2VhcmNoUGFydGljaXBhbnRzIiBuYW1lPSIlc2VhcmNoUEFydGljaXBhbnRzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvSVNlYXJjaE9wdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9JU2VhcmNoT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzMwNWU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9JU2VhcmNoT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBtYXAgb2Ygc2VhcmNoIG9wdGlvbnMgcGFzc2VkCi0gKiB0bwotICoge0BsaW5rIFNlYXJjaEVuZ2luZSNzZWFyY2gob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm4sIFNlYXJjaFJlcXVlc3Rvciwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZSwgamF2YS51dGlsLk1hcCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gKiBTZWFyY2hFbmdpbmUuc2VhcmNoKCl9LgotICogPHA+Ci0gKiBOb3RlIHRoYXQgbm90IGFsbCBzZWFyY2ggcGFydGljaXBhbnRzIHdpbGwgcHJvdmlkZSBzcGVjaWFsaXplZCBiZWhhdmlvciBiYXNlZCBvbgotICogdXNlIG9mIHRoZXNlIHNlYXJjaCBvcHRpb25zLgotICogPHA+Ci0gKiBBbHNvIG5vdGUgdGhhdCBpbmRpdmlkdWFsIHNlYXJjaCBwYXJ0aWNpcGFudHMgbWF5IHN1cHBvcnQgYWRkaXRpb25hbCBvcHRpb25zIG5vdAotICogbGlzdGVkIGhlcmUuIFRoZXNlIHNlYXJjaCBvcHRpb25zIHNob3VsZCBiZSBmb3JtZWQgc28gdGhhdCBhIHNlYXJjaCBwYXJ0aWNpcGFudCBjYW4KLSAqIHNhZmVseSBpZ25vcmUgYW55IHRoYXQgaXQgZG9lcyBub3QgdW5kZXJzdGFuZC4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VhcmNoT3B0aW9ucyB7Ci0KLQkvKioKLQkgKiBTZWFyY2ggb3B0aW9uIHNwZWNpZnlpbmcgYSB0cmFkZS1vZmYgY2hvaWNlIGJldHdlZW4gc2VhcmNoIHBlcmZvcm1hbmNlIGFuZAotCSAqIGNvbXBsZXRlbmVzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9PUFRJT04gPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5QUklPUklUWSI7IC8vJE5PTl9OTFNfMSQKLQkvKioKLQkgKiBDaG9pY2UgZm9yIHRoZSB7QGxpbmsgI1BSSU9SSVRZX09QVElPTn0gc2VhcmNoIG9wdGlvbiB0aGF0IGVtcGhhc2l6ZXMKLQkgKiBwZXJmb3JtYW5jZSBhdCB0aGUgcG9zc2libGUgZXhwZW5zZSBvZiBhY2N1cmFjeS4gVGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCBmb3IKLQkgKiBhbGwgc2VhcmNoIGNhbGxzIG1hZGUgb24gdGhlIHVzZXIgaW50ZXJmYWNlIHRocmVhZC4gSW4gc29tZSBjYXNlcywgc2VhcmNoCi0JICogcmVzdWx0cyBtYXkgbm90IGJlIGNvbXBsZXRlIGJlY2F1c2Ugb2YgaW5hY2N1cmFjaWVzIGNhdXNlZCBieSB0aW1pbmcgd2luZG93cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9WQUxVRV9USU1FTElORVNTID0gIkZBU1RfU0VBUkNIIjsgLy8kTk9OX05MU18xJAotCS8qKgotCSAqIENob2ljZSBmb3IgdGhlIHtAbGluayAjUFJJT1JJVFlfT1BUSU9OfSBzZWFyY2ggb3B0aW9uIHRoYXQgZW1waGFzaXplcwotCSAqIGFjY3VyYWN5IGF0IHRoZSBwb3NzaWJsZSBleHBlbnNlIG9mIHRpbWVsaW5lc3MuIFRoaXMgdmFsdWUgc2hvdWxkIG5ldmVyIGJlIHVzZWQKLQkgKiBmb3Igc2VhcmNoIGNhbGxzIG1hZGUgb24gdGhlIHVzZXIgaW50ZXJmYWNlIHRocmVhZCwgYmVjYXVzZSBzb21lIHNlYXJjaAotCSAqIHBhcnRpY2lwYW50cyBtYXkgY2hvb3NlIHRvIHVzZSB0aW1lLWNvbnN1bWluZyBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgdG8gcmV0dXJuIGEKLQkgKiBjb21wbGV0ZSBzZXQgb2YgbWF0Y2hlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9WQUxVRV9DT01QTEVURU5FU1MgPSAiQ09NUExFVEVfU0VBUkNIIjsgLy8kTk9OX05MU18xJAotCS8qKgotCSAqIERlZmF1bHQgY2hvaWNlIGZvciB0aGUge0BsaW5rICNQUklPUklUWV9PUFRJT059IHNlYXJjaCBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVkFMVUVfREVGQVVMVCA9IFBSSU9SSVRZX1ZBTFVFX1RJTUVMSU5FU1M7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hFbmdpbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hFbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlZDExNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWwuU2VhcmNoRG9jdW1lbnRTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci0KLS8qKgotICogVGhlIHtAbGluayBTZWFyY2hFbmdpbmV9IGNsYXNzIHByb3ZpZGVzIGEgZ2VuZXJpYyB3YXkgb2Ygc2VhcmNoaW5nIGZvciBpbmZvcm1hdGlvbgotICogd2l0aG91dCB0aGUgbmVlZCBvZiBrbm93aW5nIGhvdyBvciB3aGVyZSB0aGF0IGluZm9ybWF0aW9uIGlzIHN0b3JlZC4gVGhlIHJlc3VsdHMKLSAqIHJldHVybmVkIGJ5IGEgc2VhcmNoIGNvdWxkIGJlIHNjYXR0ZXJlZCBpbiBhIG51bWJlciBvZiBmaWxlcyBvciBzdG9yZWQgaW4gYW4gaW5kZXguCi0gKiBFeGFtcGxlcyBvZiB0aGUgaW5mb3JtYXRpb24geW91IGNhbiBzZWFyY2ggZm9yIGluY2x1ZGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kCi0gKiByZWZlcmVuY2VzLCByZWZlcmVuY2VzIGJldHdlZW4gZmlsZXMsIGFuZCB1c2Ugb2YgcXVhbGlmaWVycy4KLSAqIDxwPgotICogVGhlIHNlYXJjaCBjYW4gYmUgbGltaXRlZCB0byBhIHNwZWNpZmllZCBzZWFyY2ggc2NvcGUsIG9yIHRoZSBlbnRpcmUgd29ya3NwYWNlIGNhbgotICogYmUgc2VhcmNoZWQuIFNlYXJjaCBtYXRjaGVzIGFyZSByZXR1cm5lZCB0byB0aGUgc3BlY2lmaWVkIHtAbGluayBTZWFyY2hSZXF1ZXN0b3J9LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoRW5naW5lIGltcGxlbWVudHMgSVNlYXJjaE9wdGlvbnMKLXsKLQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciBtYXRjaGVzIG9mIGEgZ2l2ZW4gc2VhcmNoIHBhdHRlcm4gdXNpbmcgYSBzcGVjaWZpZWQgc2V0IG9mIHNlYXJjaAotCSAqIHBhcnRpY2lwYW50cyBhbmQgc2VhcmNoIHNjb3BlLiBTZWFyY2ggcGF0dGVybnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgZmFjdG9yeQotCSAqIG1ldGhvZHMgYW5kIGVuY2Fwc3VsYXRlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdG8gYmUgc2VhcmNoZWQgZm9yCi0JICogKGZvciBleGFtcGxlLCBlbGVtZW50IGRlY2xhcmF0aW9ucyBvZiBhIHNwZWNpZmllZCB0eXBlLCBpbiBhIGNhc2Ugc2Vuc2l0aXZlCi0JICogbWFubmVyKS4KLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgVGhlIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgaW5mb3JtYXRpb24gdG8gc2VhcmNoIGZvcgotCSAqIEBwYXJhbSByZXF1ZXN0b3IKLQkgKiAgICAgICAgICAgIENhbGxiYWNrIG9iamVjdCB0byBub3RpZnkgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoIChlYWNoIG1hdGNoCi0JICogICAgICAgICAgICBpcyByZXBvcnRlZCB0byB7QGxpbmsgU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoKX0pCi0JICogQHBhcmFtIHBhcnRpY2lwYW50cwotCSAqICAgICAgICAgICAgVGhlIHNlYXJjaCBwYXJ0aWNpcGFudHMgdGhhdCB3aWxsIGNvbmR1Y3QgdGhlIHNlYXJjaAotCSAqIEBwYXJhbSBzY29wZQotCSAqICAgICAgICAgICAgT3B0aW9uYWwgc2VhcmNoIHNjb3BlIHRvIGxpbWl0IHRoZSBzb3VyY2Ugb2Ygc2VhcmNoIGNhbmRpZGF0ZXM7Ci0JICogICAgICAgICAgICBzcGVjaWZ5IDxjb2RlPm51bGw8L2NvZGU+IHRvIHNlYXJjaCB0aGUgZW50aXJlIHdvcmtzcGFjZQotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zCi0JICogICAgICAgICAgICBPcHRpb25hbCBtYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBPcHRpb25hbCBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHdvcmsgY29tcGxldGVkCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICBpZiB0aGUgc2VhcmNoIGZhaWxzCi0JICovCi0JcHVibGljIHZvaWQgc2VhcmNoKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwKLQkJCVNlYXJjaFBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzLCBTZWFyY2hTY29wZSBzY29wZSwgTWFwIHNlYXJjaE9wdGlvbnMsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCi0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQotCQkvKiBpbml0aWFsaXplIHByb2dyZXNzIG1vbml0b3IgKi8KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmVuZ2luZV9zZWFyY2hpbmcsIDEwMCk7Ci0KLSAgICAgICAgU2VhcmNoRG9jdW1lbnRTZXQgc2V0ID0gbmV3IFNlYXJjaERvY3VtZW50U2V0SW1wbCgpOwotCQl0cnkKLQkJewotCQkJLy8gcmVxdWVzdG9yLmJlZ2luUmVwb3J0aW5nKCk7Ci0gICAgICAgICAgICBTZWFyY2hTY29wZVtdIHNjb3BlQXJyYXkgPSBuZXcgU2VhcmNoU2NvcGVbcGFydGljaXBhbnRzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMCwgbCA9IHBhcnRpY2lwYW50cyA9PSBudWxsID8gMCA6IHBhcnRpY2lwYW50cy5sZW5ndGg7IGkgPCBsOyBpKyspCi0JCQl7Ci0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0KLQkJCQlTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50c1tpXTsKLQkJCQlTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG1vbml0b3IgPT0gbnVsbCA/IG51bGwKLQkJCQkJCTogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKTsKLQkJCQlpZiAoc3ViTW9uaXRvciAhPSBudWxsKQotCQkJCQlzdWJNb25pdG9yLmJlZ2luVGFzaygiIiwgMTAwMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWlmIChzdWJNb25pdG9yICE9IG51bGwpCi0JCQkJCQlzdWJNb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuYmluZCgKLQkJCQkJCQkJTWVzc2FnZXMuZW5naW5lX3NlYXJjaGluZ19sb2NhdGluZ0RvY3VtZW50cywKLQkJCQkJCQkJbmV3IFN0cmluZ1tdCi0JCQkJCQkJCXsgcGFydGljaXBhbnQuZ2V0RGVzY3JpcHRpb24oKSB9KSk7Ci0JCQkJCXBhcnRpY2lwYW50LmJlZ2luU2VhcmNoaW5nKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotCQkJCQkvLyByZXF1ZXN0b3IuZW50ZXJQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCk7Ci0JCQkJCS8vIHBhcnRpY2lwYW50IGNyZWF0ZXMgaXQncyBvd24gc2VhcmNoIHNjb3BlIAotCQkJCQlTZWFyY2hTY29wZSBuZXdTY29wZSA9Ci0JCQkJCQlwYXJ0aWNpcGFudC5zZWxlY3REb2N1bWVudExvY2F0aW9ucyhwYXR0ZXJuLCBzY29wZSwgc2VhcmNoT3B0aW9ucywgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIHNjb3BlQXJyYXlbaV0gPSBuZXdTY29wZTsKLQkJCQkJLy8gcGFydGljaXBhbnQgY3JlYXRlcyBzZWFyY2ggZG9jdW1lbnRzIGJhc2VkIG9uIGl0J3Mgc2VhcmNoIHNjb3BlCi0JCQkJCXBhcnRpY2lwYW50LmNyZWF0ZVNlYXJjaERvY3VtZW50cyhzZXQsIHBhdHRlcm4sIG5ld1Njb3BlLCBzZWFyY2hPcHRpb25zLCBzdWJNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLQkJCX0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBsID0gcGFydGljaXBhbnRzID09IG51bGwgPyAwIDogcGFydGljaXBhbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykKLSAgICAgICAgICAgIHsgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50c1tpXTsKLSAgICAgICAgICAgICAgICBTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG1vbml0b3IgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApOyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzdWJNb25pdG9yICE9IG51bGwgJiYgc3ViTW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBsb2NhdGUgaW5kZXggbWF0Y2hlcyBpZiBhbnkgKG5vdGUgdGhhdCBhbGwgc2VhcmNoIG1hdGNoZXMKLSAgICAgICAgICAgICAgICAvLyBjb3VsZCBoYXZlIGJlZW4gaXNzdWVkIGR1cmluZyBpbmRleCBxdWVyeWluZykKLSAgICAgICAgICAgICAgICBpZiAoc3ViTW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzdWJNb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nX21hdGNoaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFydGljaXBhbnQuZ2V0RGVzY3JpcHRpb24oKSB9KSk7Ci0gICAgICAgICAgICAgICAgLy8gYSBzZWFyY2ggZG9jdW1lbnQgc2V0IHNob3VsZCBjb250YWluIGVub3VnaCBpbmZvIHRvIHJlZHVjZSB0aGUgc2VhcmNoIHNjb3BlIGV2ZW4gZnVydGhlciAKLSAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZmluZGluZyBwcmVjaXplIGxvY2F0aW9ucwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHRoZSBzY29wZSBjb3VsZCBiZSBudWxsIGlmIHRoZSBwYXJ0Y2lwYW50IGJhcmZlZCBhbmQgZXhlcHRpb24gaW4gdGhlIGZpcnN0IGxvb3AgCi0gICAgICAgICAgICAgICAgaWYgKHNjb3BlQXJyYXlbaV0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50LmxvY2F0ZU1hdGNoZXMoc2V0LCBwYXR0ZXJuLCBzY29wZUFycmF5W2ldLCByZXF1ZXN0b3IsIHNlYXJjaE9wdGlvbnMsIHN1Yk1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0b3IuZXhpdFBhcnRpY2lwYW50KHBhcnRpY2lwYW50KTsKLSAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50LmRvbmVTZWFyY2hpbmcocGF0dGVybiwgc2VhcmNoT3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgIAotICAgICAgICAgICAgfSAgICAKLQkJfSBmaW5hbGx5Ci0JCXsKLSAgICAgICAgICAgIHNldC5kaXNwb3NlKCk7Ci0JCQkvLyByZXF1ZXN0b3IuZW5kUmVwb3J0aW5nKCk7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgZm9yIG1hdGNoZXMgb2YgYSBnaXZlbiBzZWFyY2ggcGF0dGVybi4gU2VhcmNoIHBhdHRlcm5zIGNhbiBiZSBjcmVhdGVkCi0JICogdXNpbmcgZmFjdG9yeSBtZXRob2RzIGFuZCBlbmNhcHN1bGF0ZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRvIGJlCi0JICogc2VhcmNoZWQgZm9yIChmb3IgZXhhbXBsZSwgZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgYSBzcGVjaWZpZWQgdHlwZSwgaW4gYSBjYXNlCi0JICogc2Vuc2l0aXZlIG1hbm5lcikuCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gcmVxdWVzdG9yCi0JICogICAgICAgICAgICBDYWxsYmFjayBvYmplY3QgdG8gbm90aWZ5IHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaCAoZWFjaCBtYXRjaAotCSAqICAgICAgICAgICAgaXMgcmVwb3J0ZWQgdG8ge0BsaW5rIFNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9KQotCSAqIEBwYXJhbSBzY29wZQotCSAqICAgICAgICAgICAgT3B0aW9uYWwgc2VhcmNoIHNjb3BlIHRvIGxpbWl0IHRoZSBzb3VyY2Ugb2Ygc2VhcmNoIGNhbmRpZGF0ZXM7Ci0JICogICAgICAgICAgICBzcGVjaWZ5IDxjb2RlPm51bGw8L2NvZGU+IHRvIHNlYXJjaCB0aGUgZW50aXJlIHdvcmtzcGFjZQotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zCi0JICogICAgICAgICAgICBPcHRpb25hbCBtYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBPcHRpb25hbCBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHdvcmsgY29tcGxldGVkCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICBpZiB0aGUgc2VhcmNoIGZhaWxzCi0JICovCi0JcHVibGljIHZvaWQgc2VhcmNoKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwKLQkJCVNlYXJjaFNjb3BlIHNjb3BlLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVNlYXJjaFBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzID0KLQkJCWdldEFwcGxpY2FibGVQYXJ0aWNpcGFudHMocGF0dGVybiwgc2VhcmNoT3B0aW9ucyk7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJwYXJ0aWNpcGFudHMgPSAiICsgcGFydGljaXBhbnRzLmxlbmd0aCk7Ci0JCXNlYXJjaChwYXR0ZXJuLCByZXF1ZXN0b3IsIHBhcnRpY2lwYW50cywgc2NvcGUsIHNlYXJjaE9wdGlvbnMsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFF1ZXJpZXMgdGhlIHNldCBvZiBwYXJ0aWNpcGFudHMgdGhhdCBzdXBwb3J0IHNlYXJjaGVzIGRlc2NyaWJlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgc2VhcmNoIHBhdHRlcm4gYW5kIG9wdGlvbnMuCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgT3B0aW9uYWwgbWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKiBAcmV0dXJuIEFycmF5IG9mIGFwcGxpY2FibGUgc2VhcmNoIHBhcnRpY2lwYW50cwotCSAqLwotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudFtdIGdldEFwcGxpY2FibGVQYXJ0aWNpcGFudHMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLAotCQkJTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCQlyZXR1cm4gU2VhcmNoUGx1Z2luLmdldERlZmF1bHQoKS5sb2FkU2VhcmNoUGFydGljaXBhbnRzKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaE1hdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoTWF0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5NjllNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoTWF0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEEgc2VhcmNoIG1hdGNoIHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIHNlYXJjaCBxdWVyeS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgU2VhcmNoRW5naW5lI3NlYXJjaChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybiwgU2VhcmNoUGFydGljaXBhbnRbXSwgSVNlYXJjaFNjb3BlLAotICogICAgICBTZWFyY2hSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoTWF0Y2ggaW1wbGVtZW50cyBJQWRhcHRhYmxlCi17Ci0KLQkvKioKLQkgKiBPcHRpb25hbCByZXNvdXJjZSBvZiB0aGUgZWxlbWVudAotCSAqLwotCUlGaWxlIGZpbGU7IC8vIHJlc291cmNlIHdoZXJlIG1hdGNoIGlzIGZvdW5kCi0KLQkvKioKLQkgKiBUaGUgb2Zmc2V0IHRoZSBtYXRjaCBzdGFydHMgYXQsIG9yIC0xIGlmIHVua25vd24KLQkgKi8KLQlpbnQgb2Zmc2V0OwotCi0JLyoqCi0JICogVGhlIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCwgb3IgLTEgaWYgdW5rbm93bgotCSAqLwotCWludCBsZW5ndGg7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCBlbGVtZW50IHRoYXQgZW5jbG9zZXMgb3IgY29ycmVzcG9uZHMgdG8gdGhlIG1hdGNoCi0JICovCi0JT2JqZWN0IG9iamVjdDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VhcmNoIG1hdGNoLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0aGF0IGVuY2xvc2VzIG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXRjaCwgb3IKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRoZSBtYXRjaCBzdGFydHMgYXQsIG9yIC0xIGlmIHVua25vd24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCwgb3IgLTEgaWYgdW5rbm93bgotCSAqIEBwYXJhbSBwYXJ0aWNpcGFudAotCSAqICAgICAgICAgICAgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCB0aGF0IGNyZWF0ZWQgdGhlIG1hdGNoCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2Ugb2YgdGhlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgU2VhcmNoTWF0Y2goT2JqZWN0IGVsZW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIElGaWxlIHJlc291cmNlKQotCXsKLQkJdGhpcy5vYmplY3QgPSBlbGVtZW50OwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMuZmlsZSA9IHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLQl7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbGUoSUZpbGUgZmlsZSkKLQl7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKQotCXsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkKLQl7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCS8vIGlzc3VlIChjcy9lYikgaG9sZGluZyBvYmplY3RzIGlzIGEgYml0IG9kZCwgc2luY2UgaXQgaW1wbGllcyB0aGUgb2JqZWN0J3MKLQkvLyBsaWZlIHNwYW4KLQkvLyBpcyB0aGUgc2FtZSBhcyB0aGUgU2VhcmNoTWF0Y2guIFdoYXQgaGFwcGVucyB3aGVuIGFuIG9iamVjdCBpcyBkZWxldGVkPwotCS8vIGRvZXMgdGhlIFNlYXJjaE1hdGNoIGdldCBkZWxldGVkPyBBcmVuJ3QgY29vcmRpbmF0ZXMgZ29vZCBlbm91Z2g/Ci0JLy8gYXQgdGhlIHZlcnkgbGVhc3Qgd2Ugc2hvdWxkIGRvY3VtZW50IHRoYXQgdXNpbmcgdGhpcyBmaWVsZCBoYXMgc29tZQotCS8vIGNvbnNlcXVlbmNlcwotCS8qKgotCSAqIChlYikgc2VlIGNvbW1lbnRzIGZvciB7QGxpbmsgI3NldE9iamVjdChPYmplY3QpfQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkKLQl7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgT2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIHNvbWUgcGFydCBvZiB0aGUgbW9kZWwgdGhhdCByZXByZXNlbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHRoYXQgd2FzIHNlYXJjaGVkLiBJdCBtYXkgcmVxdWlyZSB0byBjYWxjdWxhdGUKLQkgKiAgICAgICAgICAgIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSByZXF1aXJlZCBieSB0aGUgdG9vbHMKLQkgKiAgICAgICAgICAgIHRocm91Z2gge0BsaW5rICNnZXRPYmplY3QoKSkgKGUuZy4gWE1MIG5vZGUgbmFtZXNwYWNlLAotCSAqICAgICAgICAgICAgbmVzc2VzYXJ5IHRvIG9idGFpbiB0aGUgcHJlZml4IGZvciB0aGUgcmVmYWN0b3JpbmcgdG9vbCkuCi0JICogICAgICAgICAgICA8cD4KLQkgKiAgICAgICAgICAgIFRoZXJlIHNob3VsZCBiZSBubyBkYW5nZXIgaGVyZSBvZiBwcmV2ZW50aW5nIHRoZSBvYmplY3QgZnJvbQotCSAqICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0aW9uIGJlY2F1c2UgaW5zdGFuY2VzIG9mIHRoZSBzZWFyY2ggbWF0Y2hlcwotCSAqICAgICAgICAgICAgc3VwcG9zZWQgdG8gYmUgc2hvcnQgbGl2ZWQuIHtAbGluayBTZWFyY2hNYXRjaH0gaXMgdXN1YWxseQotCSAqICAgICAgICAgICAgY29sbGVjdGVkIGJ5IHtAbGluayBTZWFyY2hSZXF1ZXN0b3J9IHdoaWNoIGl0c2VsZiBpcyBsaXZlZCBmb3IKLQkgKiAgICAgICAgICAgIHRoZSB0aW1lIG9mIHRoZSBzZWFyY2ggYW5kIHRoZW4gZGlzY2FyZGVkIG9yIHJlLWluaXRpYWxpemVkLgotCSAqICAgICAgICAgICAgVXN1YWxseSB0aGUgdG9vbCB0aGF0IHJlcXVlc3RlZCBhIHNlYXJjaCBleHRyYWN0cyB0aGUKLQkgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbGxlY3RlZCB7QGxpbmsgU2VhcmNoTWF0Y2h9IGFuZCBhZnRlcgotCSAqICAgICAgICAgICAgdGhhdCB7QGxpbmsgU2VhcmNoTWF0Y2h9IGNvdWxkIGJlIGdhcmJhZ2UgY29sbGVjdGVkLCByZWxlYXNpbmcKLQkgKiAgICAgICAgICAgIG9iamVjdCB0aGF0IHRoZXkgaG9sZCB0by4KLQkgKiAgICAgICAgICAgIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG9iamVjdCkKLQl7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkKLQl7Ci0JCXJldHVybiBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpCi0JewotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLQl7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotICAgIAotICAgIHB1YmxpYyBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsgCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hQYXJ0aWNpcGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YTA0NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50U2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci0KLS8qKgotICogPHA+Ci0gKiBBIHNlYXJjaCBwYXJ0aWNpcGFudCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIGV4dGVuc2lvbiB0byBhIGdlbmVyaWMgc2VhcmNoCi0gKiBtZWNoYW5pc20sIHBlcm1pdHRpbmcgY29tYmluZWQgc2VhcmNoIGFjdGlvbnMgd2hpY2ggd2lsbCBpbnZvbHZlIGFsbCByZXF1aXJlZAotICogcGFydGljaXBhbnRzLgotICogPC9wPgotICogPHA+Ci0gKiBXaGVuIHRoZXJlIGlzIGEgbmVlZCB0byBzZWFyY2ggYSBkb2N1bWVudCB0aGF0IGhhcyBzb21lIG1peGVkIGNvbnRlbnQsIHRoZW4KLSAqIHVzaW5nIGEgb25lIHBhcnRpY2lwYW50IHdpbGwgbm90IGJlIGVub3VnaC4gRS5nLiBmb3IgdGhlIHNlYXJjaGluZyBvZiB0aGUgSlNQCi0gKiBjb250ZW50LCBhIEpTUCBwYXJ0aWNpcGFudCBuZWVkcyB0byBjcmVhdGUge0BsaW5rIFNlYXJjaERvY3VtZW50fSB0aGF0Ci0gKiBjb250YWluIEphdmEgY29tcGlsYXRpb24gdW5pdCBhbmQgdGhlbiBwYXNzIGl0IHRvIHRoZSBkZWZhdWx0IEphdmEgc2VhcmNoCi0gKiBwYXJ0aWNpcGFudCBvZiB0aGUgSmF2YSBTZWFyY2ggRW5naW5lLiBUaGUgc2FtZSB3aXRoIFhNTDogd2hlbiB0aGVyZSBpcyBhbgotICogWE1MIGNvbnRlbnQgdGhhdCBkZWZhdWx0IHNlYXJjaCBwYXJ0aWNpcGFudCBjb3VsZCBub3QgcHJvY2VzcywgYnV0IGl0IGlzCi0gKiByZXF1aXJlZCB0byBiZSBzZWFyY2ggb24sIGEgbmV3IHNlYXJjaCBwYXJ0aWNpcGFudCBuZWVkcyB0byBiZSBkZWZpbmVkLiBUaGF0Ci0gKiBzZWFyY2ggcGFydGljaXBhbnQgd291bGQga25vdyBob3cgY3JlYXRlIHNlYXJjaCBkb2N1bWVudCBmcm9tIHRoZSBjb250ZW50IGFuZAotICogdGhlbiBpdCBjYW4gY2FsbCBkZWZhdWx0IFhNTCBzZWFyY2ggcGFydGljaXBhbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFBhc3NpbmcgaXRzIG93biB7QGxpbmsgU2VhcmNoUmVxdWVzdG9yfSB0aGlzIHBhcnRpY2lwYW50IGNhbiB0aGVuIG1hcCB0aGUKLSAqIG1hdGNoIHBvc2l0aW9ucyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZW50cywgY3JlYXRlIGl0cyBvd24gbWF0Y2hlcyBhbmQKLSAqIHJlcG9ydCB0aGVtIHRvIHRoZSBvcmlnaW5hbCByZXF1ZXN0b3IuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWFyY2hQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElTZWFyY2hPcHRpb25zIAotewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvcGVyZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VhcmNoIHBhcnRpY2lwYW50LgotCSAqLwotCXByb3RlY3RlZCBTZWFyY2hQYXJ0aWNpcGFudCgpCi0JewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ2FsbGJhY2sgbWV0aG9kIGFsbG93aW5nIGEgc2VhcmNoIHBhcnRpY2lwYW50IHRvIGluZGljYXRlIHdoZXRoZXIgaXQgc3VwcG9ydHMKLQkgKiB0aGUgc3BlY2lmaWVkIHNlYXJjaCBwYXR0ZXJuIGFuZCBvcHRpb25zLgotCSAqIDxwPgotCSAqIElmIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBwYXJ0aWNpcGFudCB3aWxsIHBhcnRpY2lwYXRlIGluCi0JICogZmluZGluZyBtYXRjaGVzIGZvciB0aGUgc2VhcmNoIGRlZmluZWQgYnkgdGhlIHNlYXJjaCBwYXR0ZXJuLiBJbiB0aGlzIGNhc2UsIHRoZQotCSAqIHNlYXJjaCBwYXR0ZXJuIGFuZCBvcHRpb25zIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvZiB0aGUKLQkgKiBzZWFyY2ggcGFydGljaXBhbnQ6Ci0JICogPG9sPgotCSAqIDxsaT57QGxpbmsgI2JlZ2luU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4sIE1hcCl9Ci0JICogPGxpPntAbGluayAjc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMoU2VhcmNoUGF0dGVybiwgU2VhcmNoU2NvcGUsIE1hcCwgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogPGxpPntAbGluayAjY3JlYXRlU2VhcmNoRG9jdW1lbnRzKFNlYXJjaERvY3VtZW50U2V0LCBTZWFyY2hQYXR0ZXJuLCBTZWFyY2hTY29wZSwgTWFwLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiA8bGk+e0BsaW5rICNsb2NhdGVNYXRjaGVzKFNlYXJjaERvY3VtZW50U2V0LCBTZWFyY2hQYXR0ZXJuLCBTZWFyY2hTY29wZSwgU2VhcmNoUmVxdWVzdG9yLCBNYXAsIElQcm9ncmVzc01vbml0b3IpfQotCSAqIDxsaT57QGxpbmsgI2RvbmVTZWFyY2hpbmcoU2VhcmNoUGF0dGVybiwgTWFwKX0KLQkgKiA8L29sPgotCSAqIDxwPgotCSAqIElmIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBub25lIG9mIHRoZSBhYm92ZSBtZXRob2RzIHdpbGwgYmUKLQkgKiBjYWxsZWQsIGFuZCB0aGUgc2VhcmNoIHBhcnRpY2lwYW50IGNvbnRyaWJ1dGVzIG5vIG1hdGNoZXMgZm9yIHRoZSBzZWFyY2gKLQkgKiByZXF1cmVzdC4KLQkgKiA8cD4KLQkgKiBBIHNlYXJjaCBwYXJ0aWNpcGFudCBzaG91bGQgb25seSBwYXJ0aWNpcGF0ZSBpbiBhIHNlYXJjaCB3aGVuIGluIHVuZGVyc3RhbmRzCi0JICogdGhlIHNlYXJjaCBwYXR0ZXJuLiBVbnJlY29nbml6ZWQgc2VhcmNoIG9wdGlvbnMsIGhvd2V2ZXIsIGNhbiBiZSBpZ25vcmVkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGJ5IGRlZmF1bHQuIEFzIGEgcmVzdWx0LCBzdWJjbGFzc2VzIG11c3QKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwYXJ0aWNpcGF0ZSBpbiBhbnkgc2VhcmNoZXMuCi0JICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgaW5mb3JtYXRpb24gdG8gc2VhcmNoIGZvcgotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zIE1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9wdGlvbnMgYXJlIHNwZWNpZmllZDsKLQkgKiAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VhcmNoIHBhcnRpY2lwYW50IHdpbGwgcGFydGljaXBhdGUgaW4gdGhlCi0JICogICAgICAgICBzZWFyY2ggcmVxdWVzdDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCSBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0FwcGxpY2FibGUoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBNYXAgc2VhcmNoT3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdGhhdCB0aGlzIHBhcnRpY2lwYW50J3MgaGVscCBpcyBuZWVkZWQgaW4gYSBzZWFyY2guCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlLWltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIGRvCi0JICogc29tZXRoaW5nIHdoZW4gdGhlIHBhcnRpY2lwYW50IGlzIG5lZWRlZCBpbiBhIHNlYXJjaC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgaW5mb3JtYXRpb24gdG8gc2VhcmNoIGZvcgotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zIE1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9wdGlvbnMgYXJlIHNwZWNpZmllZDsKLQkgKiAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICovCi0JcHVibGljIHZvaWQgYmVnaW5TZWFyY2hpbmcoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBNYXAgc2VhcmNoT3B0aW9ucykKLQl7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdGhhdCB0aGlzIHBhcnRpY2lwYW50J3MgaGVscCBpcyBubyBsb25nZXIgbmVlZGVkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkbwotCSAqIHNvbWV0aGluZyB3aGVuIHRoZSBwYXJ0aWNpcGFudCBpcyBubyBsb25nZXIgbmVlZGVkIGluIGEgc2VhcmNoLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgVGhlIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgaW5mb3JtYXRpb24gdG8gc2VhcmNoIGZvcgotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zCi0JICogICAgICAgICAgICBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqLwotCXB1YmxpYyB2b2lkIGRvbmVTZWFyY2hpbmcoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBNYXAgc2VhcmNoT3B0aW9ucykKLQl7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGRpc3BsYXlhYmxlIG5hbWUgb2YgdGhpcyBzZWFyY2ggcGFydGljaXBhbnQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlLWltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIGRpc3BsYXkgYQotCSAqIG1lYW5pbmdmdWxsIG5hbWUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpc3BsYXlhYmxlIG5hbWUgb2YgdGhpcyBzZWFyY2ggcGFydGljaXBhbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiAiU2VhcmNoIHBhcnRpY2lwYW50IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzZWFyY2ggZG9jdW1lbnQgZm9yIHRoZSBnaXZlbiBwYXRoLiBUaGUgZ2l2ZW4gZG9jdW1lbnQgcGF0aCBpcwotCSAqIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnQuIE1vc3Qgb2YgdGhlIHRpbWUgaXQgaXMgYQotCSAqIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoLCBidXQgaXQgY2FuIGFsc28gYmUgYSBmaWxlIHN5c3RlbSBwYXRoLCBvciBhIHBhdGgKLQkgKiBpbnNpZGUgYSB6aXAgZmlsZS4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2QgY2FuIGVpdGhlciBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlaXIgb3duCi0JICogc3ViY2xhc3Mgb2Yge0BsaW5rIFNlYXJjaERvY3VtZW50fSBvciByZXR1cm4gYW4gZXhpc3RpbmcgaW5zdGFuY2Ugb2Ygc3VjaAotCSAqIGEgc3ViY2xhc3MuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudFBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIG9mIHRoZSBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIGEgc2VhcmNoIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IFNlYXJjaERvY3VtZW50IGNyZWF0ZVNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgpOwotCi0JLyoqCi0JICogTG9jYXRlcyB0aGUgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gZG9jdW1lbnRzLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkCi0JICogYnkgdGhlIG90aGVyIHNlYXJjaCBwYXJ0aWNpcGFudCBvciBzZWFyY2ggY2xpZW50IG9uY2UgaXQgaGFzCi0JICogcHJlLXByb2Nlc3NlZCBkb2N1bWVudHMgYW5kIGRlbGVnYXRpbmcgc2VhcmNoIHRvIHRoaXMgc2VhcmNoIHBhcnRpY2lwYW50LgotCSAqIEBwYXJhbSBkb2N1bWVudFNldAotCSAqICAgICAgICAgICAgVGhlIGRvY3VtZW50cyB0byBsb2NhdGUgbWF0Y2hlcyBpbgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZm9yCi0JICogQHBhcmFtIHNjb3BlCi0JICogICAgICAgICAgICBTZWFyY2ggc2NvcGUgdG8gbGltaXQgdGhlIHNvdXJjZSBvZiBzZWFyY2ggY2FuZGlkYXRlczsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgd29ya3NwYWNlIGlzIHRvIGJlCi0JICogICAgICAgICAgICBzZWFyY2hlZAotCSAqIEBwYXJhbSByZXF1ZXN0b3IKLQkgKiAgICAgICAgICAgIENhbGxiYWNrIG9iamVjdCB0byBub3RpZnkgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoIChlYWNoIG1hdGNoCi0JICogICAgICAgICAgICBpcyByZXBvcnRlZCB0byB7QGxpbmsgU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoKX0pCi0JICogQHBhcmFtIHNlYXJjaE9wdGlvbnMKLQkgKiAgICAgICAgICAgIE1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9wdGlvbnMgYXJlIHNwZWNpZmllZDsKLQkgKiAgICAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIFByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgd29yayBjb21wbGV0ZWQ7IDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiBubyBwcm9ncmVzcyBuZWVkcyB0byBiZSByZXBvcnRlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgSWYgdGhlIHJlcXVlc3RvciBoYWQgcHJvYmxlbSBhY2NlcHRpbmcgb25lIG9mIHRoZSBtYXRjaGVzCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFNldCBkb2N1bWVudFNldCwKLQkJCVNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoU2NvcGUgc2NvcGUsCi0JCQlTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHBvcHVsYXRlU2VhcmNoRG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiBkb2N1bWVudCBsb2NhdGlvbnMgdG8gY29uc2lkZXIgd2hlbiBwZXJmb3JtaW5nCi0JICogdGhlIGdpdmVuIHNlYXJjaCBxdWVyeSBpbiB0aGUgZ2l2ZW4gc2NvcGUuIFRoZSBzZWFyY2ggZW5naW5lIGNhbGxzIHRoaXMKLQkgKiBtZXRob2QgYmVmb3JlIGxvY2F0aW5nIG1hdGNoZXMuCi0JICogPHA+Ci0JICogQW4gZG9jdW1lbnQgbG9jYXRpb24gcmVwcmVzZW50cyBhIHBhdGggd29ya3NwYWNlIHRvIHRoZSBmaWxlIHdpdGggdGhlCi0JICogY29udGVudCB0aGF0IGhhcyBwb3RlbnRpYWwgbWF0Y2hlcwotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGFyZSBub3QgZXhwZWN0ZWQgdG8gY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiAgICAgICAgICAgIFNlYXJjaCBzY29wZSB0byBsaW1pdCB0aGUgc291cmNlIG9mIHNlYXJjaCBjYW5kaWRhdGVzOwotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSB3b3Jrc3BhY2UgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIHNlYXJjaGVkCi0JICogQHBhcmFtIHNlYXJjaE9wdGlvbnMKLQkgKiAgICAgICAgICAgIE1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9wdGlvbnMgYXJlIHNwZWNpZmllZDsKLQkgKiAgICAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIFByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgd29yayBjb21wbGV0ZWQ7IDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiBubyBwcm9ncmVzcyBuZWVkcyB0byBiZSByZXBvcnRlZAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgZG9jdW1lbnQgcGF0aHMgdG8gY29uc2lkZXIKLQkgKi8KLQlwdWJsaWMgU2VhcmNoU2NvcGUgc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLAotCQkJU2VhcmNoU2NvcGUgc2NvcGUsIE1hcCBzZWFyY2hPcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JewkKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBmb3IgZWFjaCBmaWxlIGluIHRoZSBzZWFyY2ggc2NvcGU6Ci0JICogPG9sPgotCSAqIDxsaT57QGxpbmsgI2NyZWF0ZVNlYXJjaERvY3VtZW50KFN0cmluZyl9Ci0JICogPGxpPntAbGluayAjcG9wdWxhdGVTZWFyY2hEb2N1bWVudChTZWFyY2hEb2N1bWVudCwgU2VhcmNoUGF0dGVybil9Ci0JICogPC9vbD4KLQkgKiBAcGFyYW0gZG9jdW1lbnRTZXQKLQkgKiAgICAgICAgICAgIFRoZSBkb2N1bWVudHMgdG8gbG9jYXRlIG1hdGNoZXMgaW4KLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgVGhlIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgaW5mb3JtYXRpb24gdG8gc2VhcmNoIGZvcgotCSAqIEBwYXJhbSBzY29wZQotCSAqICAgICAgICAgICAgU2VhcmNoIHNjb3BlIHRvIGxpbWl0IHRoZSBzb3VyY2Ugb2Ygc2VhcmNoIGNhbmRpZGF0ZXM7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIHdvcmtzcGFjZSBpcyB0byBiZQotCSAqICAgICAgICAgICAgc2VhcmNoZWQKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgTWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gb3B0aW9ucyBhcmUgc3BlY2lmaWVkOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgUHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCB3b3JrIGNvbXBsZXRlZDsgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIG5vIHByb2dyZXNzIG5lZWRzIHRvIGJlIHJlcG9ydGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlU2VhcmNoRG9jdW1lbnRzKFNlYXJjaERvY3VtZW50U2V0IGRvY3VtZW50U2V0LAotCQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTZWFyY2hTY29wZSBzY29wZSwgTWFwIHNlYXJjaE9wdGlvbnMsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiVGhlIFNlYXJjaFBhcnRpcGFudHMgaWQgaGFzIG5vdCBiZWVuIGluaXRhbGl6ZWQiKTsKLQkJSUZpbGVbXSBmaWxlcyA9IHNjb3BlLmVuY2xvc2luZ0ZpbGVzKCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBmaWxlc1tpXS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQlTZWFyY2hEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50U2V0LmdldFNlYXJjaERvY3VtZW50KGxvY2F0aW9uLCBpZCk7Ci0JCQlpZihkb2N1bWVudCA9PSBudWxsICYmIGlkICE9IG51bGwpewotCQkJCWRvY3VtZW50U2V0LnB1dFNlYXJjaERvY3VtZW50KGlkLCBkb2N1bWVudCA9IGNyZWF0ZVNlYXJjaERvY3VtZW50KGxvY2F0aW9uKSk7Ci0JCQl9Ci0JCQlwb3B1bGF0ZVNlYXJjaERvY3VtZW50KGRvY3VtZW50LCBwYXR0ZXJuKTsgCi0JCQkKLQkJfQotCi0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3YTlmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsLlNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5TZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbiBpbXBsZW1lbnRzIElTZWFyY2hPcHRpb25zCi17Ci0KLQlwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkgc2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeTsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VhcmNoUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoUGx1Z2luKCkKLQl7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VhcmNoUGx1Z2luIGdldERlZmF1bHQoKQotCXsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkgZ2V0U2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSgpCi0JewotCQlpZiAoc2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSA9PSBudWxsKQotCQl7Ci0JCQlzZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5ID0gbmV3IFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkoKTsKLQkJCW5ldyBTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyKHNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkpCi0JCQkJCS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gc2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeTsKLQl9Ci0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudCBnZXRTZWFyY2hQYXJ0aWNpcGFudChTdHJpbmcgaWQpCi0JewotCQlyZXR1cm4gZ2V0U2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSgpLmdldFNlYXJjaFBhcnRpY2lwYW50KGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIHNlYXJjaCBwYXJ0aWNpcGFudHMgdGhhdCBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgc2VhcmNoCi0JICogcGF0dGVybiBhbmQgb3B0aW9ucywgbG9hZGluZyBhbmQgY3JlYXRpbmcgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudHMgaWYgbmVjZXNzYXJ5LgotCSAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHJlcHJlc2VudGluZyBhIHNlYXJjaCByZXF1ZXN0Ci0JICogQHBhcmFtIHNlYXJjaE9wdGlvbnMgTWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gb3B0aW9ucyBhcmUgc3BlY2lmaWVkOwotCSAqICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKiBAcmV0dXJuIEFycmF5IG9mIHNlYXJjaCBwYXJ0aWNpcGFudHMgdGhhdCBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgc2VhcmNoIHJlcXVlc3QgCi0JICovCi0JU2VhcmNoUGFydGljaXBhbnRbXSBsb2FkU2VhcmNoUGFydGljaXBhbnRzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCQlyZXR1cm4gZ2V0U2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSgpLmdldFBhcnRpY2lwYW50cyhwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hSZXF1ZXN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwYjU4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIENvbGxlY3RzIHRoZSByZXN1bHRzIGZyb20gYSBzZWFyY2ggZW5naW5lIHF1ZXJ5LiBDbGllbnRzIGltcGxlbWVudCBhIHN1YmNsYXNzCi0gKiB0byBwYXNzIHRvIDxjb2RlPlNlYXJjaEVuZ2luZS5zZWFyY2g8L2NvZGU+IGFuZCBpbXBsZW1lbnQgdGhlCi0gKiB7QGxpbmsgI2FjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoKX0gbWV0aG9kLgotICogPHA+Ci0gKiBUaGUgc3ViY2xhc3NlcyBvZiB0aGUgU2VhcmNoUmVxdWVzdG9yIGNvdWxkIGNvbGxlY3RlZCBzZWFyY2ggbWF0Y2hlcywgZmlsdGVyLAotICogc29ydCBhbmQgZ3JvdXAgdGhlbS4gSXQncyB1cCB0byB0aGUgY2xpZW50IHRvIHBhc3MgdGhlIHJlcXVpcmVkIGV4dGVuc2lvbiBvZgotICogdGhlIFNlYXJjaFJlcXVlc3RvciB0byB0aGUgc2VhcmNoIGVuZ2luZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgU2VhcmNoRW5naW5lCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWFyY2hSZXF1ZXN0b3IKLXsKLQotCS8qKgotCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHNlYXJjaCBtYXRjaC4KLQkgKiAKLQkgKiBAcGFyYW0gbWF0Y2gKLQkgKiAgICAgICAgICAgIHRoZSBmb3VuZCBtYXRjaAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIG1hdGNoKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9Db21wb25lbnREZWNsYXJhdGlvbkVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTkzOTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9Db21wb25lbnREZWNsYXJhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5IGV4dGVuZHMgRW50cnkKLXsKLQlRdWFsaWZpZWROYW1lIG1ldGFOYW1lOwotICAgIFF1YWxpZmllZE5hbWUgbmFtZTsKLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShRdWFsaWZpZWROYW1lIG5hbWUpCi0JewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotICBwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRNZXRhTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbWV0YU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNZXRhTmFtZShRdWFsaWZpZWROYW1lIG1ldGFOYW1lKQotICB7Ci0gICAgdGhpcy5tZXRhTmFtZSA9IG1ldGFOYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50UmVmZXJlbmNlRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9Db21wb25lbnRSZWZlcmVuY2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTMyZjI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9Db21wb25lbnRSZWZlcmVuY2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50UmVmZXJlbmNlRW50cnkgZXh0ZW5kcyBFbnRyeQotewotCVF1YWxpZmllZE5hbWUgbmFtZTsKLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShRdWFsaWZpZWROYW1lIG5hbWUpCi0JewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9FbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDEwYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudDsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRW50cnkKLXsKLSAgU3RyaW5nIGtleTsKLSAgU3RyaW5nIGNhdGVnb3J5OwotCi0JcHVibGljIEVudHJ5KCkKLXsKLQlzdXBlcigpOwotCQotfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpCi0JewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0JewotCQlyZXR1cm4ga2V5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkKLQl7Ci0JCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLQl7Ci0JCXRoaXMua2V5ID0ga2V5OwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L0ZpbGVSZWZlcmVuY2VFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L0ZpbGVSZWZlcmVuY2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzg5NTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9GaWxlUmVmZXJlbmNlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50OwotCi0vKioKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVJlZmVyZW5jZUVudHJ5IGV4dGVuZHMgRW50cnkKLXsKLQlTdHJpbmcgcmVsYXRpdmVGaWxlUGF0aDsKLSAgICBTdHJpbmcgcmVzb2x2ZWRVUkk7Ci0JU3RyaW5nIHB1YmxpY0lkZW50aWZpZXI7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkZW50aWZpZXIoKQotCXsKLQkJcmV0dXJuIHB1YmxpY0lkZW50aWZpZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWRlbnRpZmllcihTdHJpbmcgcHVibGljSWRlbnRpZmllcikKLQl7Ci0JCXRoaXMucHVibGljSWRlbnRpZmllciA9IHB1YmxpY0lkZW50aWZpZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZUZpbGVQYXRoKCkKLQl7Ci0JCXJldHVybiByZWxhdGl2ZUZpbGVQYXRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbGF0aXZlRmlsZVBhdGgoU3RyaW5nIHJlbGF0aXZlRmlsZVBhdGgpCi0JewotCQl0aGlzLnJlbGF0aXZlRmlsZVBhdGggPSByZWxhdGl2ZUZpbGVQYXRoOwotCX0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlc29sdmVkVVJJKCkKLSAgewotICAgIHJldHVybiByZXNvbHZlZFVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlc29sdmVkVVJJKFN0cmluZyByZXNvbHZlZFVSSSkKLSAgewotICAgIHRoaXMucmVzb2x2ZWRVUkkgPSByZXNvbHZlZFVSSTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L1NlYXJjaERvY3VtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliZmNiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci0KLS8qKgotICogQSBzZWFyY2ggZG9jdW1lbnQgZW5jYXBzdWxhdGVzIGEgY29udGVudCB0byBiZSBzZWFyY2hlZCBpbi4gQSBzZWFyY2gKLSAqIHBhcnRpY2lwYW50IGNyZWF0ZXMgYSBzZWFyY2ggZG9jdW1lbnQgYmFzZWQgb24gdGhlIGZpbGUgbG9jYXRpb25zIHRvIGxvY2F0ZQotICogbWF0Y2hlcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBpc3N1ZSAoY3MvZWIpIGRvZXMgYSBzZWFyY2ggcGFydGljaXBhbnQgYWx3YXlzIGNyZWF0ZSBhIFNlYXJjaERvY3VtZW50PwotICogCi0gKiA8cD4KLSAqIFNlYXJjaFBhcnRpY2lwYW50IG9yIHNlYXJjaCBjbGllbnQgY3JlYXRlIHNlYXJjaCBkb2N1bWVudHMgZm9yIHRoZSBzZWFyY2gKLSAqIHBhc3Mgd2hlcmUgcHJlY2lzZSBsb2NhdGlvbnMgb2YgdGhlIG1hdGNoZXMgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcKLSAqIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFuI2xvY2F0ZU1hdGNoZXN9Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFNlYXJjaFBhcnRpY2lwYW50IGtub3dzIGhvdyB0byBjcmVhdGUgc2VhcmNoIGRvY3VtZW50IHRoYXQgaXQgY2FuIHByb2Nlc3MuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBpbnRlbnQgb2YgdGhlIHNlcGFyYXRpb24gb2YgdGhlIHtAbGluayBTZWFyY2hEb2N1bWVudH0gZnJvbSB0aGUKLSAqIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudH0gaXMgdG8gZW5hYmxlIHRoZSBvdGhlciBzZWFyY2ggcGFydGljaXBhbnRzIHRvCi0gKiBwcm9jZXNzIHBhcnRzIG9mIHRoZSBkb2N1bWVudC4gRm9yIGV4YW1wbGUsIGlmIFhNTCBkb2N1bWVudCBoYXMgYSBmcmFnbWVudAotICogdGhhdCBpdCBjYW4gbm90IHByb2Nlc3MsIGUuZy4gSmF2YSwgdGhlbiBYTUwgcGFydGljaXBhbnQgd291bGQgY3JlYXRlCi0gKiBTZWFyY2hEb2N1bWVudCBmb3IgdGhhdCBmcmFnbWVudCB3aGljaCBjb250YWlucyBKYXZhIGNvbXBpbGF0aW9uIHVuaXQsIGFuZAotICogcGFzcyBpdCB0byB0aGUgSmF2YSBzZWFyY2ggcGFydGljaXBhbnQuIFBhc3NpbmcgaXRzIG93bgotICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yfSB0aGlzIHBhcnRpY2lwYW50IGNhbiB0aGVuIG1hcCB0aGUgbWF0Y2ggcG9zaXRpb25zCi0gKiBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZW50cywgY3JlYXRlIGl0cyBvd24gbWF0Y2hlcyBhbmQgcmVwb3J0IHRoZW0gdG8gdGhlCi0gKiBvcmlnaW5hbCByZXF1ZXN0b3IuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAc2VlIFNlYXJjaFBhcnRpY2lwYW50Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWFyY2hEb2N1bWVudAotewotCi0JcHJpdmF0ZSBTdHJpbmcgZG9jdW1lbnRQYXRoOwotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQ7IAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzZWFyY2ggZG9jdW1lbnQuIFRoZSBnaXZlbiBkb2N1bWVudCBwYXRoIGlzIGEgc3RyaW5nIHRoYXQKLQkgKiB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBkb2N1bWVudC4gTW9zdCBvZiB0aGUgdGltZSBpdCBpcyBhCi0JICogd29ya3NwYWNlLXJlbGF0aXZlIHBhdGgsIGJ1dCBpdCBjYW4gYWxzbyBiZSBhIGZpbGUgc3lzdGVtIHBhdGgsIG9yIGEgcGF0aAotCSAqIGluc2lkZSBhIHppcCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudFBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSBkb2N1bWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXByb3RlY3RlZCBTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoLCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkKLQl7Ci0JCXRoaXMuZG9jdW1lbnRQYXRoID0gZG9jdW1lbnRQYXRoOwotCQl0aGlzLnBhcnRpY2lwYW50ID0gcGFydGljaXBhbnQ7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IEVudHJ5W10gZ2V0RW50cmllcyhTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBrZXksIGludCBtYXRjaFJ1bGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kZWwgb2YgdGhpcyBkb2N1bWVudC4gTW9kZWwgbWF5IGJlIGRpZmZlcmVudCBmcm9tIGFjdHVhbAotCSAqIHJlc291cmNlIGF0IGNvcnJlc3BvbmRpbmcgZG9jdW1lbnQgcGF0aCBkdWUgdG8gcHJlcHJvY2Vzc2luZy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZGVsIG9mIHRoaXMgZG9jdW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldE1vZGVsKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoaXMgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoaXMgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgZmluYWwgU2VhcmNoUGFydGljaXBhbnQgZ2V0UGFydGljaXBhbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcnRpY2lwYW50OwotCX0KLQkKLQkKLS8vCSB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uCi0vLwkgdGhhdCBoYXMgYmVlbiBwcm9kdWNlZCBieSBhIHNlYXJjaCBwYXJ0aWNpcGFudAotLy8JIHR5cGljYWxseSBhZnRlciBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkCi0vLwkgYW4gRW50cnkgaXMgdHlwaWNhbGx5IGNvdXJzZSBncmFpbmVkIGluZm8gdGhhdCByZXN1bHRzIGZyb20gdGhlIFNlYXJjaFBhcnRpY2lwYW50cwotLy8JIGZpcnN0IHN0ZXAgLi4uIGFuZCBpcyB1c2VkIHRvIGNvbXB1dGUgbW9yZSBhY2N1cmF0ZSBTZWFyY2hNYXRjaGVzIGR1cmluZyBhIFNlYXJjaFBhcnRpY2lwYW50cyAybmQgc3RlcAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBhdGgoKQotCXsKLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnRQYXRoOwotCX0gCi0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcHV0RW50cnkoRW50cnkgZW50cnkpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvU2VhcmNoRG9jdW1lbnRTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9TZWFyY2hEb2N1bWVudFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmZiMzRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9TZWFyY2hEb2N1bWVudFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLS8qKgotICogVGhlIGNsYXNzIGlzIHVzZWQgdG8gbWFuYWdlIGEgc2V0IG9mIHNlYXJjaCBkb2N1bWVudHMKLSAqIHRoYXQgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIGJ5IHZhcmlvdXMgcGFydGljaXBhbnRzCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoRG9jdW1lbnRTZXQKLXsKLSAgcHVibGljIGFic3RyYWN0IFNlYXJjaERvY3VtZW50IGdldFNlYXJjaERvY3VtZW50KFN0cmluZyByZXNvdXJjZVBhdGgsIFN0cmluZyBwYXJ0aWNpcGFudElkKTsKLSAgcHVibGljIGFic3RyYWN0IFNlYXJjaERvY3VtZW50W10gZ2V0U2VhcmNoRG9jdW1lbnRzKFN0cmluZyBwYXJ0aWNpcGFudElkKTsKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0U2VhcmNoRG9jdW1lbnQoU3RyaW5nIHBhcnRpY2lwYW50SWQsIFNlYXJjaERvY3VtZW50IGRvY3VtZW50KTsKLSAgcHVibGljIGFic3RyYWN0IFNlYXJjaERvY3VtZW50IF90ZW1wR2V0U2VhcmNoRG9jdW1ldG4oU3RyaW5nIHJlc291cmNlUGF0aCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDFlOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8vIGlzc3VlIChjcykgaXMgdGhpcyBhIFVJIGlzc3VlPyAgd2hlcmUgZG9lcyB0aGUgZnJhbWV3b3JrIG5lZWQgdG8gZXhwb3NlIHN0aW5ncz8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUwotewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWwubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuZ2luZV9zZWFyY2hpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmdpbmVfc2VhcmNoaW5nX2xvY2F0aW5nRG9jdW1lbnRzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5naW5lX3NlYXJjaGluZ19tYXRjaGluZzsKLQotCXByaXZhdGUgTWVzc2FnZXMoKQotCXsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0Jc3RhdGljCi0JewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaERvY3VtZW50U2V0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaERvY3VtZW50U2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2Y2YzMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hEb2N1bWVudFNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnRTZXQ7Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hEb2N1bWVudFNldEltcGwgZXh0ZW5kcyBTZWFyY2hEb2N1bWVudFNldAotewotICAgIHB1YmxpYyBNYXAgZG9jdW1lbnRQYXRoTWFwID0gbmV3IEhhc2hNYXAoKTsgLy9wYXRoIC0tPiBkb2N1bWV0bgotCU1hcCBkb2N1bWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7ICAvLyBwYXJ0aWNpcGFudElkIC0gPiBsaXN0IChkb2N1bWVudCkKLQkKLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnRTZXRJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBTZWFyY2hEb2N1bWVudCBfdGVtcEdldFNlYXJjaERvY3VtZXRuKFN0cmluZyByZXNvdXJjZVBhdGgpCi0gICAgeyAgICAgIAotICAgICAgIHJldHVybiAoU2VhcmNoRG9jdW1lbnQpZG9jdW1lbnRQYXRoTWFwLmdldChyZXNvdXJjZVBhdGgpOyAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0U2VhcmNoRG9jdW1lbnQoU3RyaW5nIHJlc291cmNlUGF0aCwgU3RyaW5nIHBhcnRpY2lwYW50SWQpCi0JewotCQlpZihyZXNvdXJjZVBhdGggPT0gbnVsbCl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTZWFyY2hEb2N1bWVudFtdIGRvY3VtZW50cyA9IGdldFNlYXJjaERvY3VtZW50cyhwYXJ0aWNpcGFudElkKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N1bWVudHMubGVuZ3RoOyBpKyspCi0JCXsKLQkJCVNlYXJjaERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRzW2ldOwotCQkJaWYocmVzb3VyY2VQYXRoLmVxdWFscyhkb2N1bWVudC5nZXRQYXRoKCkpKXsKLQkJCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFNlYXJjaERvY3VtZW50W10gZ2V0U2VhcmNoRG9jdW1lbnRzKFN0cmluZyBwYXJ0aWNpcGFudElkKQotCXsKLQkJCi0JCU9iamVjdCBvYmplY3QgPSBkb2N1bWVudE1hcC5nZXQocGFydGljaXBhbnRJZCk7Ci0JCUxpc3QgZG9jdW1lbnRMaXN0ID0gbnVsbDsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTGlzdCl7Ci0JCQlkb2N1bWVudExpc3QgPSAoTGlzdClvYmplY3Q7Ci0JCX0KLQkJZWxzZXsKLQkJCWRvY3VtZW50TWFwLnB1dChwYXJ0aWNpcGFudElkLCBkb2N1bWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCkpOwotCQl9Ci0JCXJldHVybiAoU2VhcmNoRG9jdW1lbnRbXSkgZG9jdW1lbnRMaXN0LnRvQXJyYXkobmV3IFNlYXJjaERvY3VtZW50W2RvY3VtZW50TGlzdC5zaXplKCldKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgcHV0U2VhcmNoRG9jdW1lbnQoU3RyaW5nIHBhcnRpY2lwYW50SWQsIFNlYXJjaERvY3VtZW50IGRvY3VtZW50KQotCXsKLQkJT2JqZWN0IG9iamVjdCA9IGRvY3VtZW50TWFwLmdldChwYXJ0aWNpcGFudElkKTsKLQkJTGlzdCBkb2N1bWVudExpc3QgPSBudWxsOwotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBMaXN0KXsKLQkJCWRvY3VtZW50TGlzdCA9IChMaXN0KW9iamVjdDsKLQkJfQotCQllbHNlewotCQkJZG9jdW1lbnRNYXAucHV0KHBhcnRpY2lwYW50SWQsIGRvY3VtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKSk7Ci0JCX0KLQkJZG9jdW1lbnRMaXN0LmFkZChkb2N1bWVudCk7Ci0gICAgICAgIGRvY3VtZW50UGF0aE1hcC5wdXQoZG9jdW1lbnQuZ2V0UGF0aCgpLCBkb2N1bWVudCk7Ci0JfQotCi0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkb2N1bWVudE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgIHsgIAotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaiA9ICgoTGlzdClvKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvMiA9IGoubmV4dCgpOwotICAgICAgICAgICAgaWYgKG8yIGluc3RhbmNlb2YgU2VhcmNoRG9jdW1lbnQpCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgIFNlYXJjaERvY3VtZW50IHNlYXJjaERvY3VtZW50ID0gKFNlYXJjaERvY3VtZW50KW8yOwotICAgICAgICAgICAgICAgc2VhcmNoRG9jdW1lbnQuZGlzcG9zZSgpOwotICAgICAgICAgICAgfSAgIAotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0gICAgICAgCi0gICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzllMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25UYWdOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLklFdmFsdWF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OyAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IKLXsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZFbGVtZW50OwotCi0JcHJpdmF0ZSBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudDsKLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnQgZ2V0U2VhcmNoUGFydGljaXBhbnQoKQotCXsKLQkJaWYgKHBhcnRpY2lwYW50ID09IG51bGwpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCXBhcnRpY2lwYW50ID0gKFNlYXJjaFBhcnRpY2lwYW50KSBmRWxlbWVudAotCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcnRpY2lwYW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGZFbGVtZW50Ci0JCQkJLmdldENoaWxkcmVuKEV4cHJlc3Npb25UYWdOYW1lcy5FTkFCTEVNRU5UKTsKLQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlBc3NlcnQuaXNUcnVlKGVsZW1lbnRzLmxlbmd0aCA9PSAxKTsKLQkJRXhwcmVzc2lvbiBleHAgPSBFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKS5wZXJmb3JtKGVsZW1lbnRzWzBdKTsKLQkJcmV0dXJuIGNvbnZlcnQoZXhwLmV2YWx1YXRlKGNvbnRleHQpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udmVydChFdmFsdWF0aW9uUmVzdWx0IGV2YWwpCi0JewotCQlpZiAoZXZhbCA9PSBFdmFsdWF0aW9uUmVzdWx0LkZBTFNFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBObyByZXBsYWNlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRDb250ZW50VHlwZXMoKQotCXsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgTm8gcmVwbGFjZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTdXBwb3J0ZWRDb250ZW50VHlwZUlkKFN0cmluZyBjb250ZW50VHlwZUlkKQotCXsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50SWQoKXsKLQkJcmV0dXJuIGZFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTY5ZTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeQotewotCi0JcHJvdGVjdGVkIE1hcCBpZE1hcCA9IG5ldyBIYXNoTWFwKCk7IC8vIG1hcHMgc2VhcmNoUGFydGljaXBhbnQgaWQgdG8gYQotCQkJCQkJCQkJCQkvLyBzZWFyY2hQYXJ0aWNpcGFudCBkZXNjcmlwdG9yCi0KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSgpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHB1dFNlYXJjaFBhcnRpY2lwYW50KFN0cmluZyBpZCwKLQkJCVNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvciBzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IpCi0JewotCQlpZE1hcC5wdXQoaWQsIHNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvcik7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFNlYXJjaFBhcnRpY2lwYW50SWRzKCkKLQl7Ci0JCVNldCBpZHMgPSBpZE1hcC5rZXlTZXQoKTsKLQkJcmV0dXJuIChTdHJpbmdbXSkgaWRzLnRvQXJyYXkobmV3IFN0cmluZ1tpZHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0U2VhcmNoUGFydGljaXBhbnRzKCkKLQl7Ci0JCXJldHVybiBpZE1hcC52YWx1ZXMoKTsKLQl9Ci0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudCBnZXRTZWFyY2hQYXJ0aWNpcGFudChTdHJpbmcgaWQpCi0JewotCQlTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3Igc2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yID0gbnVsbDsKLQkJaWYgKGlkICE9IG51bGwpCi0JCXsKLQkJCXNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvciA9IChTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IpIGlkTWFwCi0JCQkJCS5nZXQoaWQpOwotCQl9Ci0JCXJldHVybiBzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IgIT0gbnVsbCA/IHNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvcgotCQkJCS5nZXRTZWFyY2hQYXJ0aWNpcGFudCgpCi0JCQkJOiBudWxsOwotCi0JfQotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50W10gZ2V0UGFydGljaXBhbnRzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCi0JCUV2YWx1YXRpb25Db250ZXh0IGV2YWxDb250ZXh0ID0gY3JlYXRlRXZhbHVhdGlvbkNvbnRleHQocGF0dGVybik7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRTZWFyY2hQYXJ0aWNpcGFudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCVNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvcikgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJaWYgKGRlc2NyaXB0b3IubWF0Y2hlcyhldmFsQ29udGV4dCkpCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBkZXNjcmlwdG9yCi0JCQkJCQkJCS5nZXRTZWFyY2hQYXJ0aWNpcGFudCgpOwotCQkJCQkJaWYgKCFTZWFyY2hQYXJ0aWNpcGFudC5jbGFzcy5pc0luc3RhbmNlKHBhcnRpY2lwYW50KSkKLQkJCQkJCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCk7Ci0JCQkJCQlpZiAocGFydGljaXBhbnQuaXNBcHBsaWNhYmxlKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpKQotCQkJCQkJewotCQkJCQkJCXJlc3VsdC5hZGQocGFydGljaXBhbnQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkKLQkJCQkJewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiAoU2VhcmNoUGFydGljaXBhbnRbXSkgcmVzdWx0Ci0JCQkJLnRvQXJyYXkobmV3IFNlYXJjaFBhcnRpY2lwYW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFdmFsdWF0aW9uQ29udGV4dCBjcmVhdGVFdmFsdWF0aW9uQ29udGV4dCgKLQkJCVNlYXJjaFBhdHRlcm4gcGF0dGVybikKLQl7Ci0JCUV2YWx1YXRpb25Db250ZXh0IHJlc3VsdCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBwYXR0ZXJuKTsKLQkJcmVzdWx0LmFkZFZhcmlhYmxlKCJwYXR0ZXJuIiwgcGF0dGVybik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzU3Y2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInNlYXJjaFBhcnRpY2lwYW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gInNlYXJjaFBhcnRpY2lwYW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnRJZDsKLQotCXByb3RlY3RlZCBTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnlSZWFkZXIoU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSByZWdpc3RyeSkKLQl7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotCXsKLQkJU3RyaW5nIGJ1bmRsZWlkID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKQotCQkJCS5nZXRFeHRlbnNpb25Qb2ludChidW5kbGVpZCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpCi0JCXsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJewotCQkJCXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpCi0JCXsKLQkJCVN0cmluZyBjb250cmlidXRvckNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQlpZiAoaWQgIT0gbnVsbCkKLQkJCXsKLQkJCQlpZiAoY29udHJpYnV0b3JDbGFzcyAhPSBudWxsKQotCQkJCXsKLQkJCQkJU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yKAotCQkJCQkJCWVsZW1lbnQpOwotCQkJCQlyZWdpc3RyeS5wdXRTZWFyY2hQYXJ0aWNpcGFudChpZCwgZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhMDFhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyBTZWFyY2ggbWVzc2FnZXMuCi0KLWVuZ2luZV9zZWFyY2hpbmcgPSBTZWFyY2hpbmcuLi4KLWVuZ2luZV9zZWFyY2hpbmdfbG9jYXRpbmdEb2N1bWVudHMgPSB7MH06IGxvY2F0ZSBzZWFyY2ggZG9jdW1lbnRzLi4uCi1lbmdpbmVfc2VhcmNoaW5nX21hdGNoaW5nID0gezB9OiBsb2NhdGUgbWF0Y2hlcy4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9Db21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmM2ZmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9Db21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLS8qKgotICoKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuIGV4dGVuZHMgQ29tcG9uZW50U2VhcmNoUGF0dGVybgotewotCi0JcHVibGljIENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihRdWFsaWZpZWROYW1lIG5hbWUsCi0JCQlRdWFsaWZpZWROYW1lIG1ldGFOYW1lLCBpbnQgbWF0Y2hSdWxlKQotCXsKLQkJc3VwZXIobnVsbCwgbmFtZSwgbWV0YU5hbWUsIG1hdGNoUnVsZSk7Ci0KLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKFF1YWxpZmllZE5hbWUgbmFtZSwKLQkJCVF1YWxpZmllZE5hbWUgbWV0YU5hbWUpCi0JewotCQlzdXBlcihudWxsLCBuYW1lLCBtZXRhTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9Db21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9Db21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMWUxMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuIGV4dGVuZHMgQ29tcG9uZW50U2VhcmNoUGF0dGVybgotewotCi0JcHVibGljIENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4oSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsCi0JCQlRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSwgaW50IG1hdGNoUnVsZSkKLQl7Ci0JCXN1cGVyKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lLCBtYXRjaFJ1bGUpOwotCi0JfQotCi0JcHVibGljIENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4oSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsCi0JCQlRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkKLQl7Ci0JCXN1cGVyKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50U2VhcmNoUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50U2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQxYTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgZ2VuZXJpYyBjb21wb25lbnQgcGF0dGVybi4gVXN1YWxseSB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mCi0gKiBjb21wb25lbnQgc2VhcmNoIHBhdHRlcm5zOiBwYXR0ZXJuIGZvciBjb21wb25lbnQgZGVjbGFyYXRpb24gYW5kIGZvcgotICogY29tcG9uZW50IGRlZmluaXRpb24uCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRTZWFyY2hQYXR0ZXJuIGV4dGVuZHMgU2VhcmNoUGF0dGVybgotewotCi0JUXVhbGlmaWVkTmFtZSBuYW1lOwotCi0JUXVhbGlmaWVkTmFtZSBtZXRhTmFtZTsKLQotCUlGaWxlIGZpbGU7IC8vIChvcHRpb25hbCkgbG9jYXRpb24gd2hlcmUgY29tcG9uZW50IGlzIGRlZmluZWQKLQotCXB1YmxpYyBDb21wb25lbnRTZWFyY2hQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLAotCQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUsIGludCBtYXRjaFJ1bGUpCi0JewotCQlzdXBlcihtYXRjaFJ1bGUpOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQluYW1lID0gZWxlbWVudFFOYW1lOwotCQltZXRhTmFtZSA9IHR5cGVRTmFtZTsKLQotCX0KLQotCXB1YmxpYyBDb21wb25lbnRTZWFyY2hQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLAotCQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpCi0JewotCi0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCW5hbWUgPSBlbGVtZW50UU5hbWU7Ci0JCW1ldGFOYW1lID0gdHlwZVFOYW1lOwotCi0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKQotCXsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWUgZ2V0TWV0YU5hbWUoKQotCXsKLQkJcmV0dXJuIG1ldGFOYW1lOwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9GaWxlUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vRmlsZVJlZmVyZW5jZVBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMTE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9GaWxlUmVmZXJlbmNlUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlUmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm4KLXsKLQotCUlGaWxlIGZpbGU7Ci0KLQlwdWJsaWMgRmlsZVJlZmVyZW5jZVBhdHRlcm4oSUZpbGUgZmlsZSkKLQl7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JfQotCi0JcHVibGljIEZpbGVSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIGludCBtYXRjaFJ1bGUpCi0JewotCQlzdXBlcihtYXRjaFJ1bGUpOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vUXVhbGlmaWVkTmFtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vUXVhbGlmaWVkTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjdhYjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL1F1YWxpZmllZE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuOwotCi0vKioKLSAqIFRoaXMgZGF0YSBjbGFzcyByZXByZXNlbnRzIGEgcXVhbGlmaWVkIG5hbWUsIGNvbnNpc3Rpbmcgb2YgYSBsb2NhbCBuYW1lIGFuZCBhCi0gKiBxdWFsaWZpZXIKLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotLy8gaXNzdWUgKGNzKSBzaG91bGQgdGhpcyBnbyBpbiB0aGUgJ21hdGNoaW5nJyBwYWNrYWdlIChCVFcuLi4gcmVuYW1lCi0vLyBtYXRjaGluZy0+cGF0dGVybikKLXB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lCi17Ci0KLQlwcml2YXRlIFN0cmluZyBxdWFsaWZpZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX0RFTElNXzEgPSAieyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOU19ERUxJTV8yID0gIn0iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBDcmVhdGVzIGEgcXVhbGlmaWVkIG5hbWUgZnJvbSBhIG5hbWVzcGFjZSBhbmQgbG9jYWwgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZXNwYWNlCi0JICogQHBhcmFtIGxvY2FsTmFtZQotCSAqLwotCXB1YmxpYyBRdWFsaWZpZWROYW1lKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpCi0JewotCi0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5xdWFsaWZpZXIgPSBuYW1lc3BhY2U7Ci0JCWlmIChuYW1lc3BhY2UgIT0gbnVsbCAmJiBuYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJdGhpcy5xdWFsaWZpZXIgPSBudWxsOwotCQl9Ci0JCWlmICh0aGlzLnF1YWxpZmllciAhPSBudWxsICYmIHRoaXMucXVhbGlmaWVyLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCXRoaXMucXVhbGlmaWVyID0gbnVsbDsKLQkJfQotCi0JCXRoaXMubmFtZSA9IGxvY2FsTmFtZTsKLQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmIGxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKQotCQl7Ci0JCQl0aGlzLm5hbWUgPSBudWxsOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lc3BhY2UgY29tcG9uZW50IG9mIHRoZSBxdWFsaWZpZWQgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuYW1lc3BhY2U7IDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgc3BlY2lmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotCXsKLQkJcmV0dXJuIHRoaXMucXVhbGlmaWVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsIG5hbWUgY29tcG9uZW50IG9mIHRoZSBxdWFsaWZpZWQgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbCBuYW1lOyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIHNwZWNpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkKLQl7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotCXsKLQkJYm9vbGVhbiBpc0VxdWFsID0gZmFsc2U7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJewotCQkgIGlzRXF1YWwgPSB0cnVlOwotCQl9Ci0JCWVsc2UKLQkJewkKLQkJICBpZiAob2JqIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSkKLQkJICB7Ci0JCQlRdWFsaWZpZWROYW1lIHRoYXQgPSAoUXVhbGlmaWVkTmFtZSkgb2JqOwotCQkgICAgaXNFcXVhbCA9IGlzTWF0Y2godGhpcy5nZXROYW1lc3BhY2UoKSwgdGhhdC5nZXROYW1lc3BhY2UoKSkgJiYKLQkJICAgICAgICAgICAgICBpc01hdGNoKHRoaXMuZ2V0TG9jYWxOYW1lKCksIHRoYXQuZ2V0TG9jYWxOYW1lKCkpOwkKLQkJICB9ICAKLQkJfQotCQlyZXR1cm4gaXNFcXVhbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgYSwgU3RyaW5nIGIpCi0JewotCSAgcmV0dXJuIGEgIT0gbnVsbCA/IGEuZXF1YWxzKGIpIDogYSA9PSBiOwotCX0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCXsKLQkJaW50IGhhc2ggPSAwOwotCQlpZiAodGhpcy5xdWFsaWZpZXIgIT0gbnVsbCkKLQkJewotCQkJaGFzaCArPSB0aGlzLnF1YWxpZmllci5oYXNoQ29kZSgpOwotCQl9Ci0JCWlmICh0aGlzLm5hbWUgIT0gbnVsbCkKLQkJewotCQkJaGFzaCArPSB0aGlzLm5hbWUuaGFzaENvZGUoKTsKLQkJfQotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWFsaWZpZWQgbmFtZSwgb2YgdGhlIGZvcm06Ci0JICoge25hbWVzcGFjZX1sb2NhbG5hbWUuIElmIG5vIG5hbWVzcGFjZSBpcyBzcGVjaWZpZWQsIHRoZSBzdHJpbmcgaGFzIHRoZQotCSAqIGZvcm06IHt9bG9jYWxuYW1lLiBOb3RlIHRoYXQgdGhlIHN0cmluZyBmb3JtYXQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN0cmluZyB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQotCQlyZXR1cm4gYXBwZW5kU3RyaW5ncyhuZXcgU3RyaW5nW10KLQkJeyBOU19ERUxJTV8xLCAvLyB7Ci0JCQkJdGhpcy5xdWFsaWZpZXIsIE5TX0RFTElNXzIsIC8vIH0KLQkJCQl0aGlzLm5hbWUgfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5LWxpa2UgbWV0aG9kIHRvIGNyZWF0ZSBhIFFOYW1lIG9iamVjdCBmcm9tIHRoZSBzdHJpbmcgZm9ybSBvZiBhCi0JICogUU5hbWUuIFRoZSBzdHJpbmcgbXVzdCBoYXZlIHRoZSBzYW1lIGZvcm1hdCBhcyByZXR1cm5lZCBieQotCSAqIFFOYW1lLnRvU3RyaW5nKCkuCi0JICogCi0JICogQHBhcmFtIHFuYW1lU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIFN0cmluZyBmb3JtIG9mIGEgUU5hbWUKLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIFFOYW1lIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgTWlzc2luZyBuYW1lc3BhY2UgZGVsaW1pdGVycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgUXVhbGlmaWVkTmFtZSB2YWx1ZU9mKFN0cmluZyBxbmFtZVN0cmluZykKLQkJCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQl7Ci0KLQkJU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0JCVN0cmluZyBsb2NhbE5hbWUgPSBudWxsOwotCQlpZiAocW5hbWVTdHJpbmcgPT0gbnVsbCB8fCBxbmFtZVN0cmluZy5sZW5ndGgoKSA9PSAwKQotCQl7Ci0JCQkvLyBCb3RoIG5hbWVzcGFjZSBhbmQgbG9jYWwgbmFtZSBhcmUgbnVsbC4KLQkJfSBlbHNlIGlmIChxbmFtZVN0cmluZy5zdGFydHNXaXRoKE5TX0RFTElNXzEpKQotCQl7Ci0JCQkvLyBUaGUgUU5hbWUgaGFzIHRoZSBub3RhdGlvbiBzcGVjaWZ5aW5nIGEgbmFtZXNwYWNlLgotCQkJaW50IGluZGV4ID0gcW5hbWVTdHJpbmcuaW5kZXhPZihOU19ERUxJTV8yKTsKLQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCXsKLQkJCQkvLyBUaGUgZW5kIGRlbGltaXRlciBmb3IgdGhlIG5hbWVzcGFjZSB3YXMgbm90IGZvdW5kLiBUaGUgUU5hbWUKLQkJCQkvLyBzdHJpbmcKLQkJCQkvLyBpcyBtYWxmb3JtZWQuCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJxbmFtZVN0cmluZyA9ICIgKyBxbmFtZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW5hbWVzcGFjZSA9IHFuYW1lU3RyaW5nLnN1YnN0cmluZygxLCBpbmRleCk7Ci0JCQlsb2NhbE5hbWUgPSBxbmFtZVN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJfSBlbHNlCi0JCXsKLQkJCS8vIEFzc3VtZSBubyBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkIGFuZCB0aGUgc3RyaW5nIGlzIGEgbG9jYWwgbmFtZS4KLQkJCWxvY2FsTmFtZSA9IHFuYW1lU3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZShuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2luZ2xlIHN0cmluZyBieSBhcHBlbmRpbmcgdG9nZXRoZXIgYW4gYXJyYXkgb2Ygc3RyaW5ncywKLQkgKiBza2lwcGluZyBudWxsIHN0cmluZ3MuCi0JICogCi0JICogQHBhcmFtIHN0cmluZ3MgLQotCSAqICAgICAgICAgICAgU3RyaW5ncyB0byBiZSBhcHBlbmRlZCB0b2dldGhlcgotCSAqIEByZXR1cm4gUmVzdWx0aW5nIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFN0cmluZ3MoU3RyaW5nW10gc3RyaW5ncykKLQl7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzdHJpbmdzICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZ0J1ZmZlciB0b2tlbkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBtYXhDb3VudCA9IHN0cmluZ3MubGVuZ3RoOwotCQkJU3RyaW5nIHN0cmluZzsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4Q291bnQ7IGkrKykKLQkJCXsKLQkJCQlzdHJpbmcgPSBzdHJpbmdzW2ldOwotCQkJCWlmIChzdHJpbmcgIT0gbnVsbCAmJiBzdHJpbmcubGVuZ3RoKCkgPiAwKQotCQkJCXsKLQkJCQkJdG9rZW5CdWZmZXIuYXBwZW5kKHN0cmluZyk7Ci0JCQkJfS8vIGlmCi0JCQl9Ly8gZm9yCi0JCQlyZXN1bHQgPSB0b2tlbkJ1ZmZlci50b1N0cmluZygpOwotCQl9Ly8gaWYKLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0vLyBhcHBlbmRTdHJpbmdzKCkKLQotfS8vIGNsYXNzIFFOYW1lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9TZWFyY2hQYXR0ZXJuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9TZWFyY2hQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMGFhZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vU2VhcmNoUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBBIHNlYXJjaCBkZWZpbmVzIGhvdyBzZWFyY2ggcmVzdWx0cyBhcmUgZm91bmQuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUGF0dGVybiBpbXBsZW1lbnRzIElBZGFwdGFibGUKLXsKLQotCS8qKgotCSAqIE1hdGNoIHJ1bGU6IFRoZSBzZWFyY2ggcGF0dGVybiBtYXRjaGVzIHRoZSBzZWFyY2ggcmVzdWx0IG9ubHkgaWYgY2FzZXMKLQkgKiBhcmUgdGhlIHNhbWUuIENhbiBiZSBjb21iaW5lZCB0byBwcmV2aW91cyBydWxlcywgZS5nLgotCSAqIHtAbGluayAjUl9FWEFDVF9NQVRDSH0gfCB7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9DQVNFX1NFTlNJVElWRSA9IDg7Ci0KLQkvLyBSdWxlcyBmb3IgcGF0dGVybiBtYXRjaGluZzogKGV4YWN0LCBwcmVmaXgsIHBhdHRlcm4pIFsgfCBjYXNlIHNlbnNpdGl2ZV0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gbWF0Y2hlcyBleGFjdGx5IHRoZSBzZWFyY2ggcmVzdWx0LCB0aGF0Ci0JICogaXMsIHRoZSBzb3VyY2Ugb2YgdGhlIHNlYXJjaCByZXN1bHQgZXF1YWxzIHRoZSBzZWFyY2ggcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSX0VYQUNUX01BVENIID0gMDsKLQotCS8qKgotCSAqIE1hdGNoIHJ1bGU6IFRoZSBzZWFyY2ggcGF0dGVybiBjb250YWlucyBvbmUgb3IgbW9yZSB3aWxkIGNhcmRzICgnKicpCi0JICogd2hlcmUgYSB3aWxkLWNhcmQgY2FuIHJlcGxhY2UgMCBvciBtb3JlIGNoYXJhY3RlcnMgaW4gdGhlIHNlYXJjaCByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9QQVRURVJOX01BVENIID0gMjsKLQotCS8qKgotCSAqIE1hdGNoIHJ1bGU6IFRoZSBzZWFyY2ggcGF0dGVybiBpcyBhIHByZWZpeCBvZiB0aGUgc2VhcmNoIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSX1BSRUZJWF9NQVRDSCA9IDE7Ci0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gY29udGFpbnMgYSByZWd1bGFyIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9SRUdFWFBfTUFUQ0ggPSA0OwotCi0JcHJpdmF0ZSBpbnQgbWF0Y2hSdWxlOwotCi0JcHVibGljIFNlYXJjaFBhdHRlcm4oKQotCXsKLQkJdGhpcy5tYXRjaFJ1bGUgPSBSX0VYQUNUX01BVENIIHwgUl9DQVNFX1NFTlNJVElWRTsKLQl9Ci0KLQlwdWJsaWMgU2VhcmNoUGF0dGVybihpbnQgbWF0Y2hSdWxlKQotCXsKLQkJdGhpcy5tYXRjaFJ1bGUgPSBtYXRjaFJ1bGU7Ci0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGdldE1hdGNoUnVsZSgpCi0JewotCQlyZXR1cm4gdGhpcy5tYXRjaFJ1bGU7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpCi0JewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL0NvbnRlbnRUeXBlU2VhcmNoU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Db250ZW50VHlwZVNlYXJjaFNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2N2FmMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL0NvbnRlbnRUeXBlU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci0KLS8qKgotICogU2NvcGUgdGhhdCBoYXMgZmlsdGVyZXJzIGZpbGVzIGJhc2VkIG9uIGNvbnRlbnQgdHlwZXMuIEl0IGNhbiBsaW1pdCBvdGhlcgotICogc2NvcGVzIHdpdGggdGhlIGdpdmVuIGZpbGUgY29udGVudCB0eXBlcy4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlU2VhcmNoU2NvcGUgZXh0ZW5kcyBTZWFyY2hTY29wZUltcGwKLXsKLQotCXByaXZhdGUgTGlzdCB2YWxpZENvbnRlbnRJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQ29udGVudFR5cGVTZWFyY2hTY29wZShTZWFyY2hTY29wZSBzY29wZSwgU3RyaW5nW10gdmFsaWRDb250ZW50VHlwZXMpCi0JewotCQlpZiAodmFsaWRDb250ZW50VHlwZXMgIT0gbnVsbCkKLQkJewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZENvbnRlbnRUeXBlcy5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQl0aGlzLnZhbGlkQ29udGVudElkcy5hZGQodmFsaWRDb250ZW50VHlwZXNbaV0pOwotCQkJfQotCQl9Ci0JCWlmIChzY29wZS5lbmNsb3NpbmdGaWxlcygpICE9IG51bGwpCi0JCXsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2NvcGUuZW5jbG9zaW5nRmlsZXMoKS5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBzY29wZS5lbmNsb3NpbmdGaWxlcygpW2ldOwotCQkJCWFjY2VwdEZpbGUoZmlsZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZpbGUoSUZpbGUgZmlsZSkKLQl7Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkJewotCQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBkZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJLy8gVE9ETyB1c2UgSUNvbnRlbnRUeXBlLmlzS2luZE9mCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWxpZENvbnRlbnRJZHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykKLQkJCQkJCXsKLQkJCQkJCQlTdHJpbmcgY29udGVudElkID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCQkJCQlJQ29udGVudFR5cGUgc3VwcG9ydGVkQ29udGVudFR5cGUgPSBjb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoY29udGVudElkKTsKLQkJCQkJCQlpZiAoc3VwcG9ydGVkQ29udGVudFR5cGUgIT0gbnVsbCkKLQkJCQkJCQl7Ci0JCQkJCQkJCWlmIChjb250ZW50VHlwZS5pc0tpbmRPZihzdXBwb3J0ZWRDb250ZW50VHlwZSkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCQkJCQkJCXByb2plY3RzLmFkZChmaWxlLmdldFByb2plY3QoKSk7Ci0JCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJLy8gaWdub3JlIHRoZSBmaWxlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1Byb2plY3RTZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1Byb2plY3RTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmFjZTcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Qcm9qZWN0U2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICoKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0U2VhcmNoU2NvcGUgZXh0ZW5kcyBTZWFyY2hTY29wZUltcGwKLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzY29wZSB0aGF0IGVjbG9zZXMgd29ya3NwYWNlIHBhdGggYW5kIGVjbG9zaW5nIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gd29ya3NwYWNlUGF0aCAtCi0JICogICAgICAgICAgICBwYXRoIHRvIHRoZSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLCBlLmcuCi0JICogICAgICAgICAgICAvTXlQcm9qZWN0L015RmlsZS54bWwKLQkgKi8KLQlwdWJsaWMgUHJvamVjdFNlYXJjaFNjb3BlKElQYXRoIHdvcmtzcGFjZVBhdGgpCi0JewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKHdvcmtzcGFjZVBhdGgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShJUGF0aCB3b3Jrc3BhY2VQYXRoKQotCXsKLQkJSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQotCQkJCS5maW5kTWVtYmVyKHdvcmtzcGFjZVBhdGgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkJewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCXRyYXZlcnNlQ29udGFpbmVyKHByb2plY3QpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VhcmNoU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGQzZWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWFyY2hTY29wZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiBBIDxjb2RlPlNlYXJjaFNjb3BlPC9jb2RlPiBkZWZpbmVzIHdoZXJlIHNlYXJjaCByZXN1bHQgc2hvdWxkIGJlIGZvdW5kIGJ5IGEKLSAqIDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT4gKGUuZy4gcHJvamVjdCwgd29ya3NwYWNlKS4KLSAqIAotICogQ2xpZW50cyBtdXN0IHBhc3MgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB0byB0aGUgPGNvZGU+c2VhcmNoKC4uLik8L2NvZGU+Ci0gKiBtZXRob2RzLiBTdWNoIGFuIGluc3RhbmNlIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmFjdG9yeSBtZXRob2RzCi0gKiBvbiA8Y29kZT5TZWFyY2hTY29wZTwvY29kZT46IDxjb2RlPm5ld1NlYXJjaFNjb3BlKElSZXNvdXJjZVtdKTwvY29kZT4sCi0gKiA8Y29kZT5uZXdXb3Jrc3BhY2VTY29wZSgpPC9jb2RlPgotICogCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhaW9uIG9mIHRoZSBzZWFyY2ggc2NvcGUgaGFzIG5vIGZpbHRlciwgYW5kIGF0IGNyZWF0aW9uCi0gKiBkb2VzIG5vdCBjb250YWluIGFueSBmaWxlcywgSXQgY291bGQgYWNjZXB0IGFueSB3b3Jrc3BhY2UgZmlsZS4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlYXJjaFNjb3BlCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgd29ya3NwYWNlIGZpbGVzIHRoYXQgYmVsb25nIGluIHRoaXMgc2VhcmNoIHNjb3BlLgotCSAqIChzZWUgPGNvZGU+SVJlc291cmNlLmdldEZ1bGxQYXRoKCk8L2NvZGU+KS4gRm9yIGV4YW1wbGUsCi0JICogL015UHJvamVjdC9NeUZpbGUudHh0Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBmaWxlcyBpbiB0aGUgd29ya3NwYWNlIHRoYXQgYmVsb25nIHRvIHRoaXMgc2NvcGUuCi0JICovCi0JcHVibGljIGFic3RyYWN0IElGaWxlW10gZW5jbG9zaW5nRmlsZXMoKTsKLQotCi0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlYXJjaFNjb3BlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlYXJjaFNjb3BlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2M0YzY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWFyY2hTY29wZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFNjb3BlSW1wbCBleHRlbmRzIFNlYXJjaFNjb3BlCi17Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBIYXNoU2V0IHByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBTZWFyY2hTY29wZUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVzb3VyY2UgYXQgdGhlIGdpdmVuIHBhdGggaXMgYmVsb25ncyB0byB0aGlzIHNjb3BlLgotCSAqIFJlc291cmNlIHBhdGggY291bGQgYmUgYWRkZWQgdG8gdGhlIHNjb3BlLCBpZiBzY29wZSBjb25kaXRpb25zIGFyZSBtZXQuCi0JICogaWYge0BsaW5rIElTZWFyY2hTY29wZS5lbmNsb3NlcyhTdHJpbmcgcmVzb3VyY2VQYXRoKX0gcmV0dXJucyBmYWxzZSBhbmQKLQkgKiB0aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhbmQgcmV0dXJucyB0cnVlLCBuZXh0IGNhbGwgdG8KLQkgKiB7QGxpbmsgSVNlYXJjaFNjb3BlLmVjbGlwc2VzKFN0cmluZyByZXNvdXJjZVBhdGgpfSBzaG91bGQgcmV0dXJuIHRydWUuCi0JICogCi0JICogQHBhcmFtIGZpbGUgLQotCSAqICAgICAgICAgICAgd29ya3NwYWNlIGZpbGUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGVuY2xvc2VkIGJ5IHRoaXMgc2NvcGUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGaWxlKElGaWxlIGZpbGUpCi0JewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZmlsZXMuYWRkKGZpbGUpOwotCQlwcm9qZWN0cy5hZGQoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBlbmNsb3NlZCBieSB0aGlzIHNjb3BlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVBhdGggLQotCSAqICAgICAgICAgICAgd29ya3NwYWNlIHJlbGF0aXZlIHJlc291cmNlIHBhdGgKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGVuY2xvc2VkIGJ5IHRoaXMgc2NvcGUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmNsb3NlcyhTdHJpbmcgcmVzb3VyY2VQYXRoKQotCXsKLQkJSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQotCQkJCS5maW5kTWVtYmVyKHJlc291cmNlUGF0aCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGZpbGVzLmNvbnRhaW5zKHJlc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgd29ya3NwYWNlIGZpbGVzIHRoYXQgYmVsb25nIGluIHRoaXMgc2VhcmNoIHNjb3BlLgotCSAqIChzZWUgPGNvZGU+SVJlc291cmNlLmdldEZ1bGxQYXRoKCk8L2NvZGU+KS4gRm9yIGV4YW1wbGUsCi0JICogL015UHJvamVjdC9NeUZpbGUudHh0Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBmaWxlcyBpbiB0aGUgd29ya3NwYWNlIHRoYXQgYmVsb25nIHRvIHRoaXMgc2NvcGUuCi0JICovCi0JcHVibGljIElGaWxlW10gZW5jbG9zaW5nRmlsZXMoKQotCXsKLQkJaWYgKGZpbGVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElGaWxlWzBdOwotCQlyZXR1cm4gKElGaWxlW10pIGZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGhzIHRvIHRoZSBlbmNsb3NpbmcgcHJvamVjdHMgZm9yIHRoaXMgc2VhcmNoIHNjb3BlLiAoc2VlCi0JICogPGNvZGU+SVJlc291cmNlLmdldEZ1bGxQYXRoKCk8L2NvZGU+KS4gRm9yIGV4YW1wbGUsIC9NeVByb2plY3QKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBhdGhzIHRvIHRoZSBlbmNsb3NpbmcgcHJvamVjdHMuCi0JICovCi0JcHJvdGVjdGVkIElQcm9qZWN0W10gZW5jbG9zaW5nUHJvamVjdHMoKQotCXsKLQotCQlyZXR1cm4gKElQcm9qZWN0W10pIHByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0W3Byb2plY3RzLnNpemUoKV0pOwotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRyYXZlcnNlQ29udGFpbmVyKElDb250YWluZXIgY29udGFpbmVyKQotCXsKLQotCQlJUmVzb3VyY2VWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlVmlzaXRvcigpCi0JCXsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkKLQkJCXsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJCQlhY2NlcHRGaWxlKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9OwotCQl0cnkKLQkJewotCQkJY29udGFpbmVyLmFjY2VwdCh2aXNpdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBpZ25vcmUgcmVzb3VyY2UKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlbGVjdGlvblNlYXJjaFNjb3BlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VsZWN0aW9uU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmY2QzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VsZWN0aW9uU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvblNlYXJjaFNjb3BlIGV4dGVuZHMgU2VhcmNoU2NvcGVJbXBsCi17Ci0KLQlwcm90ZWN0ZWQgSVJlc291cmNlW10gcmVzb3VyY2VzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNjb3BlIHRoYXQgZWNsb3NlcyB3b3Jrc3BhY2UgcGF0aCBhbmQgZWNsb3NpbmcgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSB3b3Jrc3BhY2VQYXRoIC0KLQkgKiAgICAgICAgICAgIHBhdGggdG8gdGhlIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2UsIGUuZy4KLQkgKiAgICAgICAgICAgIC9NeVByb2plY3QvTXlGaWxlLnhtbAotCSAqLwotCXB1YmxpYyBTZWxlY3Rpb25TZWFyY2hTY29wZShJUmVzb3VyY2VbXSByZXNvdXJjZXMpCi0JewotCQlzdXBlcigpOwotCQl0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKLQkJaW5pdGlhbGl6ZSgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpCi0JewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCByZXNvdXJjZXMubGVuZ3RoOyBpbmRleCsrKQotCQl7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaW5kZXhdOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQl7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKQotCQkJCXsKLQkJCQkJdHJhdmVyc2VDb250YWluZXIoKElGb2xkZXIpIHJlc291cmNlKTsKLQkJCQl9IGVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCQl7Ci0JCQkJCWFjY2VwdEZpbGUoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1dvcmtpbmdTZXRTZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1dvcmtpbmdTZXRTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWIxYTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Xb3JraW5nU2V0U2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byB3cmFwIHRoZSBjb250ZW50IG9mIGFuIElXb3JraW5nU2V0LgotICogV2UgY2FuJ3QgdXNlIElXb3JraW5nU2V0IGRpcmVjdGx5IGJlY2F1c2UgaXQncyBwYXJ0IG9mIGFuIGVjbGlwc2UudWkKLSAqIGNvbXBvbmVudC4gVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGlzIG9iamVjdCBhcyBhIHN1cnJvZ2F0ZS4KLSAqIDxicj4KLSAqIFVzYWdlOiBXZSBnZXQgdGhlIGFycmF5IElBZGFwdGFibGVbXSBvZiB0aGUgSVdvcmtpbmdTZXQgb2JqZWN0IGFuZCB1c2UgdGhpcwotICogYXJyYXkgYXMgYXJndW1lbnQgZm9yIGFsbCBtZXRob2RzIG9mIHRoaXMgY2xhc3MgaW5jbHVkaW5nIHRoZSBjb25zdHJ1Y3Rvci4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtpbmdTZXRTZWFyY2hTY29wZSBleHRlbmRzIFNlYXJjaFNjb3BlSW1wbHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IHNjb3BlIHdoZW4gbm8gcmVzb3VyY2VzIGlzIGdpdmVuLgotCSAqLwotCXB1YmxpYyBXb3JraW5nU2V0U2VhcmNoU2NvcGUoKXsKLQkJc3VwZXIoKTsKLQl9Ci0gIAotCS8qKgotCSAqIEludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBhbiBJV29ya2luZ1NldAotCSAqIDxicj4KLQkgKiBGb3IgZXhhbXBsZToKLQkgKiA8cHJlPgotCSAqIElXb3JraW5nU2V0IG9uZVdvcmtpbmdTZXQ7Ci0JICogLi4uCi0JICogSUFkYXB0YWJsZVtdIGVsZW1lbnRzID0gb25lV29ya2luZ1NldC5nZXRFbGVtZW50cygpOwotCSAqIFdvcmtpbmdTZXRTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBXb3JraW5nU2V0U2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBXb3JraW5nU2V0U2VhcmNoU2NvcGUoSUFkYXB0YWJsZVtdIGVsZW1lbnRzKQotCXsKLQkJc3VwZXIoKTsKLQkJYWRkRWxlbWVudHNPZldvcmtpbmdTZXQoZWxlbWVudHMpOwotCX0KLQkKLQkvKioKLQkgKiBJbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggYW4gSVdvcmtpbmdTZXQKLQkgKiA8YnI+Ci0JICogRm9yIGV4YW1wbGU6Ci0JICogPHByZT4KLQkgKiBXb3JraW5nU2V0U2VhcmNoU2NvcGUgc2NvcGUgPSAuLjsgCi0JICogLi4uCi0JICogSVdvcmtpbmdTZXQgYW5vdGhlcldvcmtpbmdTZXQ7IAotCSAqIElBZGFwdGFibGVbXSBlbGVtZW50cyA9IGFub3RoZXJXb3JraW5nU2V0LmdldEVsZW1lbnRzKCk7Ci0JICogc2NvcGUuYWRkQVdvcmtpbmdTZXRUb1Njb3BlKGVsZW1lbnRzKTsKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBV29ya2luZ1NldFRvU2NvcGUoSUFkYXB0YWJsZVtdIGVsZW1lbnRzKXsKLQkJYWRkRWxlbWVudHNPZldvcmtpbmdTZXQoZWxlbWVudHMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRWxlbWVudHNPZldvcmtpbmdTZXQoSUFkYXB0YWJsZVtdIGVsZW1lbnRzKXsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKyl7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBlbGVtZW50c1tqXS5nZXRBZGFwdGVyKElDb250YWluZXIuY2xhc3MpOwotCQkJaWYgKCBjb250YWluZXIgIT0gbnVsbCApewotCQkJCXRyYXZlcnNlQ29udGFpbmVyKGNvbnRhaW5lcik7Ci0JCQl9Ci0JCQllbHNlewotCQkJCUlGaWxlIGFGaWxlID0gKElGaWxlKSBlbGVtZW50c1tqXS5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCQlpZiAoIGFGaWxlICE9IG51bGwpCi0JCQkJCWFjY2VwdEZpbGUoYUZpbGUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1dvcmtzcGFjZVNlYXJjaFNjb3BlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvV29ya3NwYWNlU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxYzIwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvV29ya3NwYWNlU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLQotLyoqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlU2VhcmNoU2NvcGUgZXh0ZW5kcyBTZWFyY2hTY29wZUltcGwKLXsKLQotCXByb3RlY3RlZCBJUmVzb3VyY2UgY3VycmVudFJlc291cmNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNjb3BlIHRoYXQgZWNsb3NlcyB3b3Jrc3BhY2UgcGF0aCBhbmQgZWNsb3NpbmcgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSB3b3Jrc3BhY2VQYXRoIC0KLQkgKiAgICAgICAgICAgIHBhdGggdG8gdGhlIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2UsIGUuZy4KLQkgKiAgICAgICAgICAgIC9NeVByb2plY3QvTXlGaWxlLnhtbAotCSAqLwotCXB1YmxpYyBXb3Jrc3BhY2VTZWFyY2hTY29wZSgpCi0JewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkKLQl7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQl0cmF2ZXJzZUNvbnRhaW5lcihyb290KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3V0aWwvQ29sbGVjdGluZ1NlYXJjaFJlcXVlc3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3V0aWwvQ29sbGVjdGluZ1NlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjI3ZjkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC91dGlsL0NvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLQotLyoqCi0gKiBDb2xsZWN0cyB0aGUgcmVzdWx0cyByZXR1cm5lZCBieSBhIDxjb2RlPklTZWFyY2hFbmdpbmU8L2NvZGU+LgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi0vLyBpc3N1ZSBzaG91bGQgeW91IG1vdmUgdGhpcyB0byBhIHV0aWwgcGFja2FnZT8gd2hhdCBkb2VzIGpkdCBkbz8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW5nU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgU2VhcmNoUmVxdWVzdG9yCi17Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZkZvdW5kOwotCi0JcHVibGljIENvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IoKQotCXsKLQkJZkZvdW5kID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYSBMaXN0IG9mIHtAbGluayBTZWFyY2hNYXRjaH1lcyAobm90IHNvcnRlZCkKLQkgKi8KLQlwdWJsaWMgTGlzdC8qIDxTZWFyY2hNYXRjaD4gKi9nZXRSZXN1bHRzKCkKLQl7Ci0JCXJldHVybiBmRm91bmQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsLnByb3Zpc2lvbmFsLlNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNlYXJjaC5pbnRlcm5hbC5wcm92aXNpb25hbC5TZWFyY2hNYXRjaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZGb3VuZC5hZGQobWF0Y2gpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjIwMmQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ind0cGVtZi8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3b3JrYmVuY2gvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NDU4YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mXzEuMC4wLnppcAotc3JjLnppcAotQGRvdAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNWYwZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzQxOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jU2F0IE1hciAyNCAwMjowNjowMiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ5NDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4yMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzN2NmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSB3dHBlbWYvLFwKLSAgICAgICAgICAgd29ya2JlbmNoLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTMwZDMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4M2QwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGFja2FnZVVSSU1hcD1QYWNrYWdlVVJJTWFwCi1wbHVnaW5OYW1lPUVNRiBVdGlsaXRpZXMKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGU2YWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InBhY2thZ2VVUklNYXAiIG5hbWU9IiVQYWNrYWdlVVJJTWFwIiBzY2hlbWE9InNjaGVtYS9wYWNrYWdlVVJJTWFwLmV4c2QiLz4KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idHJhbnNsYXRvckV4dGVuc2lvbiIgbmFtZT0idHJhbnNsYXRvckV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvdHJhbnNsYXRvckV4dGVuc2lvbi5leHNkIi8+Ci0KLTwhLS0gTmVlZCB0byByZWdpc3RlciB0aGUgRWNvcmUgc3BlY2lmaWMgcGFja2FnZSBtYXBwaW5ncyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi5wYWNrYWdlVVJJTWFwIj4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICAgICAgICAgIHByZWZpeD0iZWNvcmUiPgotICAgICAgPC9tYXA+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvTWFwcGluZyIKLSAgICAgICAgICAgIHByZWZpeD0ibWFwcGluZyI+Ci0gICAgICA8L21hcD4KLTwhLS0gVHJpY2sgdG8gZ2V0IE1hcHBpbmcueG1pIGZvciBNT0Y1IHNlcmlhbGl6YXRpb24gLS0+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvTWFwcGluZyIKLSAgICAgICAgICAgIHByZWZpeD0iTWFwcGluZyI+Ci0gICAgICA8L21hcD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBjb250ZXh0PSJIZWFkbGVzcyIKLSAgICAgICAgICAgIGtleT0icmVuZGVyZXJGYWN0b3J5IgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5Ij4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwNzYwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuZW1mIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vd3RwZW1mIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vd3RwZW1mIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjlkOTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3BhY2thZ2VVUklNYXAuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiIGlkPSJwYWNrYWdlVVJJTWFwIiBuYW1lPSIlUGFja2FnZVVSSU1hcCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHJlZ2lzdGVyIHBhY2thZ2UgbWFwcGluZ3MuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hcCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtYXAiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3RyYW5zbGF0b3JFeHRlbnNpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3RyYW5zbGF0b3JFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhOTY2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3NjaGVtYS90cmFuc2xhdG9yRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIiBpZD0idHJhbnNsYXRvckV4dGVuc2lvbiIgbmFtZT0idHJhbnNsYXRvckV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGlzIHVzZWQgdG8gY29udHJpYnV0ZSBjaGlsZCB0cmFuc2xhdG9ycyB0byB0aGUgZGVmYXVsdCB0cmFuc2xhdG9ycyBpbiBFTUYyRE9NQWRhcHRlckltcGwuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRyYW5zbGF0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idHJhbnNsYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBjaGlsZCB0cmFuc2xhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzNGM3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyOwotCi0KLQotLyoqCi0gKiBUaGUgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyIGlzIHVzZWQgdG8gc3luY2hyb25pemUgdGhlIGxvYWRpbmcKLSAqIG9mIEVNRiByZXNvdXJjZXMuIFRoaXMgaXMgdGhlIEVjbGlwc2UgdmVyc2lvbiBvZiBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIsCi0gKiBhbmQgdXNlcyB0aGUgRWNsaXBzZSBJTG9jayB0ZWNobm9sb2d5IHRvIGFjcXVpcmUgYSBzZW1hcGhvcmUgdW50aWwgdGhlCi0gKiBSZXNvdXJjZSBpcyBsb2FkZWQuIHRoZSB3YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKSBtZXRob2Qgd2lsbCBwYXVzZSB1bnRpbAotICogZWl0aGVyIChhKSB0aGUgUmVzb3VyY2UgaGFzIGxvYWRlZCwgdGhlIEFkYXB0ZXIgaXMgbm90aWZpZWQsIGFuZCB0aGUKLSAqIHNlbWFwaG9yZSBpcyByZWxlYXNlZCBvciAoYikgdGhlIERFTEFZIHRpbWVvdXQgaXMgZXhjZWVkZWQsIHdoaWNoIHByZXZlbnRzCi0gKiBmdWxsIGRlYWRsb2NrLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlciBleHRlbmRzIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIElMb2NrIGxvYWRpbmdMb2NrOwotCi0JLyoqCi0JICogVGhlIGRlbGF5IGlzIGRlZmF1bHQgdG8gNSBtaW51dGVzLiBUaGlzIGlzIHRoZSB1cHdhcmQgdGhyZXNoaG9sZC4gVGhlCi0JICogbG9jayB3aWxsIHdhaXQgdXAgdG8gREVMQVkgbWlsbGlzZWNvbmRzIHRvIGFjcXVpcmUgdGhlIGxvY2ssIGFuZCBiYWlsCi0JICogaWYgbm90LiBJdCBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgd2lsbCB3YWl0IERFTEFZIG1pbGxpc2Vjb25kcyBhbHdheXMuCi0JICogSW4gZ2VuZXJhbCwgdGhlIHdhaXQgc2hvdWxkIGJlIGFsbW9zdCBpbnN0YW50ZW91cyAtLSBqdXN0IGFzIGxvbmcgYXMKLQkgKiBkb2N1bWVudCBsb2FkaW5nIHJlbWFpbnMgc3BlZWR5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVMQVkgPSAzMDAwMDA7Ci0KLQlwdWJsaWMgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyKCkgewotCQlsb2FkaW5nTG9jayA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7Ci0JCWlmIChsb2FkaW5nTG9jayAhPSBudWxsKQotCQkJbG9hZGluZ0xvY2suYWNxdWlyZSgpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnd0cC5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlciN3YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRGb3JSZXNvdXJjZVRvTG9hZCgpIHsKLQotCQlpZiAobG9hZGluZ0xvY2sgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlib29sZWFuIGxvY2tBY3F1aXJlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKGxvYWRpbmdMb2NrICE9IG51bGwpCi0JCQkJaWYgKCEobG9ja0FjcXVpcmVkID0gbG9hZGluZ0xvY2suYWNxdWlyZShERUxBWSkpKQotCQkJCQlsb2dXYXJuaW5nKCk7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwganVzdCBjb250aW51ZQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGxvY2tBY3F1aXJlZCkKLQkJCQlsb2FkaW5nTG9jay5yZWxlYXNlKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvZ1dhcm5pbmcoKSB7Ci0JCU5vdGlmaWVyIHRhcmdldCA9IGdldFRhcmdldCgpOwotCQlpZiAodGFyZ2V0ID09IG51bGwgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBSZXNvdXJjZSkpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSB0YXJnZXQ7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIltXQVJOSU5HXSBDb3VsZCBub3QgYWNxdWlyZSBTZW1hcGhvcmUgTG9jayBmb3IgUmVzb3VyY2U6IFwiIiArIHJlc291cmNlLmdldFVSSSgpICsgIlwiIGluICIgKyBnZXRDbGFzcygpKTsKLQkJfQotCi0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCi0JCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSAhPSBudWxsKSB7Ci0JCQkvLyBsaXN0ZW4gZm9yIHRoZSByZW1vdmUgb2YgdGhlIGxvYWRpbmcgYWRhcHRlcgotCQkJaWYgKGlzU2V0TG9hZGVkUmVzb3VyY2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSkgewotCQkJCWlmIChsb2FkaW5nTG9jayAhPSBudWxsKQotCQkJCQlsb2FkaW5nTG9jay5yZWxlYXNlKCk7Ci0JCQkJcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI2ZvcmNlUmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgZm9yY2VSZWxlYXNlKCkgewotCQlpZiAobG9hZGluZ0xvY2sgIT0gbnVsbCAmJiBsb2FkaW5nTG9jay5nZXREZXB0aCgpID4gMCkKLQkJCWxvYWRpbmdMb2NrLnJlbGVhc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5MGU4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkgewotCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmlibS53dHAuaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBjcmVhdGVSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKSB7IAotICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9FY29yZVV0aWxpdGllc1BsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL0Vjb3JlVXRpbGl0aWVzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjRjMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL0Vjb3JlVXRpbGl0aWVzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLlJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFY29yZVV0aWxpdGllc1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNMQVRPUl9FWFRFTlNUSU9OX1BPSU5UID0gInRyYW5zbGF0b3JFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBFY29yZVV0aWxpdGllc1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCVJlbmRlcmVyRmFjdG9yeS5zZXREZWZhdWx0SGFuZGxlcihQbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5JTlNUQU5DRSk7Ci0JCVBhY2thZ2VVUklNYXBSZWFkZXIgcmVhZGVyID0gbmV3IFBhY2thZ2VVUklNYXBSZWFkZXIoKTsKLQkJcmVhZGVyLnByb2Nlc3NFeHRlbnNpb25zKCk7Ci0JCS8vdXNlIGEgc3luY2hyb25pemVkIGxvYWRpbmcgYWRhcHRlciBmYWN0b3J5Ci0JCVJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UgPSBuZXcgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QYWNrYWdlVVJJTWFwUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGFja2FnZVVSSU1hcFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWMzOWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QYWNrYWdlVVJJTWFwUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5OwotCi0vKioKLSAqIFRoaXMgcmVhZGVyIHdpbGwgcmVhZCB0aGUgcGFja2FnZVVSSU1hcCBleHRlbnNpb24gcG9pbnQgYW5kIHBvcHVsYXRlIHRoZQotICogQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuCi0gKiAKLSAqIFRoZSBwYWNrYWdlVVJJTWFwIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLSAqIAotICogPG1hcCBwcmVmaXg9InNvbWVQYWNrYWdlUHJlZml4IiB1cmk9InNvbWVQYWNrYWdlVVJJIi8+Ci0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlVVJJTWFwUmVhZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0FUVF9OQU1FID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0FUVF9OQU1FID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAicGFja2FnZVVSSU1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUGFja2FnZVVSSU1hcFJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRFeHRlbnNpb25Qb2ludCgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoRWNvcmVVdGlsaXRpZXNQbHVnaW4uSUQsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIHJlYWQgYW5kIHByb2Nlc3MgYWxsIG9mIHRoZSBwYWNrYWdlVVJJTWFwIGV4dGVuc2lvbnMuICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzRXh0ZW5zaW9ucygpIHsKLQkJQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkgcmVnID0gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0U7Ci0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9uUG9pbnQoKS5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCXByb2Nlc3NFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSwgcmVnKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFeHRlbnNpb24oSUV4dGVuc2lvbiBleHRlbnNpb24sIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5IHJlZykgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspCi0JCQlwcm9jZXNzQ29uZmlndXJhdGlvbihjb25maWdzW2ldLCByZWcpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25maWd1cmF0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSByZWcpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFBSRUZJWF9BVFRfTkFNRSk7Ci0JCVN0cmluZyB1cmkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShVUklfQVRUX05BTUUpOwotCQlyZWcucmVnaXN0ZXJQcmVmaXhUb1BhY2thZ2VVUkkocHJlZml4LCB1cmkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlODA3NTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgZXh0ZW5kcyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgewotCi0Jc3RhdGljIGZpbmFsIFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIElOU1RBTkNFID0gbmV3IFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyKCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRfUE9JTlRfTkFNRSA9ICJyZW5kZXJlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyKCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLkVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciNnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgUmVuZGVyZXJGYWN0b3J5IGdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSB7Ci0JCVJlbmRlcmVyRmFjdG9yeSBhRmFjdG9yeSA9IChSZW5kZXJlckZhY3RvcnkpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoRVhUX1BPSU5UX05BTUUpOwotCQlyZXR1cm4gYUZhY3RvcnkgPT0gbnVsbCA/IHN1cGVyLmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSA6IGFGYWN0b3J5OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BYnN0cmFjdFJlbmRlcmVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQWJzdHJhY3RSZW5kZXJlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmODNiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BYnN0cmFjdFJlbmRlcmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckltcGwgaW1wbGVtZW50cyBSZW5kZXJlciB7Ci0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2U7Ci0JcHJpdmF0ZSBpbnQgdmVyc2lvbklkOwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0aW5nID0gdHJ1ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBYnN0cmFjdFJlbmRlcmVySW1wbC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RSZW5kZXJlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3NldFJlc291cmNlKFRyYW5zbGF0b3JSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShUcmFuc2xhdG9yUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJlc291cmNlID0gYVJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNnZXRSZXNvdXJjZSgpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklkKCkgewotCQlyZXR1cm4gdGhpcy52ZXJzaW9uSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbklkKGludCB2ZXJzaW9uSWQpIHsKLQkJdGhpcy52ZXJzaW9uSWQgPSB2ZXJzaW9uSWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHsKLQkJcmV0dXJuIHZhbGlkYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKGJvb2xlYW4gYikgewotCQl2YWxpZGF0aW5nID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjYWNjZXNzRm9yUmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjYWNjZXNzRm9yV3JpdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvcldyaXRlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNpc01vZGlmaWVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2lzU2hhcmVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNpc1NoYXJlZEZvcldyaXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3ByZURlbGV0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgcHJlRGVsZXRlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNwcmVVbmxvYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVVubG9hZCgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcmVsZWFzZUZyb21SZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3JlbGVhc2VGcm9tV3JpdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tV3JpdGUoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3NldEJhdGNoTW9kZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhdGNoTW9kZShib29sZWFuIGlzQmF0Y2gpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VTdHJlYW1zRm9ySU8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQmF0Y2hNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQwODY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0F0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyMSwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyIGV4dGVuZHMgVHJhbnNsYXRvckZpbHRlciB7Ci0KLQlwdWJsaWMgQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlcigpIHsKLQkJc3VwZXIobnVsbCwgLTEpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyKFRyYW5zbGF0b3IgdHJhbnMsIGludCB2ZXJzaW9uKSB7Ci0JCXN1cGVyKHRyYW5zLCB2ZXJzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IHNjYW5OZXh0VHJhbnNsYXRvcihUcmFuc2xhdG9yW10gY2hpbGRyZW4sIGludCBzdGFydCkgewotCQlpbnQgZm91bmQgPSBzdGFydCArIDE7Ci0JCWZvciAoOyBmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aDsgKytmb3VuZCkgewotCQkJaWYgKGNoaWxkcmVuW2ZvdW5kXS5pc0RPTUF0dHJpYnV0ZSgpKQotCQkJCWJyZWFrOwotCQl9Ci0JCWZvdW5kID0gKGZvdW5kIDwgY2hpbGRyZW4ubGVuZ3RoKSA/IGZvdW5kIDogLTE7Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NzU4MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0KLS8qKgotICogQ2FjaGVFdmVudE5vZGVzIChDRU5Pcykgc3RvcmUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gU0FYIEV2ZW50cy4gVGhpcyBpbmZvcm1hdGlvbiBjYW4gdGhlbiBiZQotICogdXNlZCBvbmNlIGFsbCBuZWNlc3NhcnkgU0FYIEV2ZW50cyBoYXZlIGJlZW4gZ2VuZXJhdGVkIHRvIGNyZWF0ZSBhbmQvb3Igc2V0IHZhbHVlcyBvbiBFTUYgbW9kZWwKLSAqIG9iamVjdHMuCi0gKiAKLSAqIENhY2hlRXZlbnROb2RlcyAoQ0VOT3MpIGhhdmUgYSBzaW1wbGUgbGlmZWN5Y2xlOiBpbml0aWFsaXplLCBjb2xsZWN0IGRhdGEsIGNvbW1pdCwgZGlzY2FyZC4gV2hlbgotICogaW5pdGlhbGl6ZWQsIENFTk9zIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSB0cmFuc2xhdG9yIGZvciBhIGdpdmVuIFhNTCBlbGVtZW50IG5hbWUsCi0gKiBhbmQgYWxzbyBjcmVhdGUvc2V0IGFueSBuZWNlc3NhcnkgRU1GIG1vZGVsIHZhbHVlcy4gRGF0YSBpcyBjb2xsZWN0ZWQgYXMgU0FYIGNoYXJhY3RlcigpIGV2ZW50cwotICogYXJlIGdlbmVyYXRlZC4gT24gdGhlIFNBWCBlbmRFbGVtZW50IGV2ZW50LCB0aGUgQ0VOTyBpcyBjb21taXR0ZWQoKSwgd2hpY2ggaXMgd2hlcmUgaXQgd2lsbAotICogY29tcGxldGUgaXRzIHByb2Nlc3NpbmcgdG8gY3JlYXRlIEVNRiBtb2RlbCBmZWF0dXJlcy4gSW4gdGhvc2UgY2FzZXMgd2hlcmUgaXQgY2Fubm90IGNvbXBsZXRlIGl0cwotICogcHJvY2Vzc2luZywgaXQgd2lsbCBkZWZlciBpdHMgcHJvY2Vzc2luZyB0byB0aGUgdXBkYXRlRU1GKCkgbWV0aG9kIG9mIGl0cyBwYXJlbnQuIERlZmVyZWQKLSAqIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBFTUYgZmVhdHVyZXMgdGhhdCByZXF1aXJlIHJlYWQgYWhlYWQgY3VlcyBmcm9tIHRoZSBYTUwuIENFTk9zCi0gKiB3aWxsIGFkZCB0aGVtc2VsdmVzIHRvIHRoZWlyIHBhcmVudHMgYXMgY2hpbGRyZW4gaW4gYSB0cmVlIGRhdGEgc3RydWN0dXJlLiBXaGVuIGFuIENFTk8KLSAqIGRldGVybWluZXMgaXQgaXMgdGhlIGdvbGRlbiBwaWVjZSBvZiBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBpbnN0YW50aWF0ZSBpdHMgcGFyZW50IGZlYXR1cmUsIGl0Ci0gKiB3aWxsIHRyaWdnZXIgaXRzIHBhcmVudCBDRU5PIHRvIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIGNhY2hlZCBDRU5PIHRyZWUuIEFzIG1lbnRpb25lZCwgdGhlCi0gKiBidWlsZGluZyBvZiBhIENFTk8gdHJlZSB3aWxsIG9ubHkgb2NjdXIgZm9yIG5vZGVzIHdpdGggcmVhZCBhaGVhZCBjdWVzLgotICogCi0gKiBkaXNjYXJkKCkgaXMgaW52b2tlZCBieSBpbml0KCkgdG8gZW5zdXJlIHRoYXQgbm8ganVuayBzdGF0ZSBpcyBsZWZ0IGZyb20gYSBwcmV2aW91cyB1c2Ugb2YgdGhlCi0gKiBDRU5PLiBjb21taXQoKSB3aWxsIGNhbGwgZGlzY2FyZCBhcyBuZWVkZWQuIEJlY2F1c2Ugb2YgdGhlIHVzZSBvZiBkaXNjYXJkLCBDRU5PcyBjYW4gYmUgcG9vbGVkCi0gKiBhbmQgcmV1c2VkLiBJZiBhIENFTk8gZGV0ZXJtaW5lcyB0aGF0IGl0IGlzIGNvbnRhaW5lZCBpbiBhIHBvb2wsIGl0IHdpbGwgbWFuYWdlIGl0cyBvd24gcmVsZWFzZQotICogZnJvbSB0aGF0IHBvb2wuIFNlbGYtIG1hbmFnZW1lbnQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgdGhlIHdheSBpbiB3aGljaCBDRU5PcyBtaWdodCBjYWNoZQotICogY2VydGFpbiBjaGlsZHJlbiB3aGlsZSB3YWl0aW5nIHRvIGNyZWF0ZSB0aGUgcGFyZW50IEVNRiBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIENhY2hlRXZlbnROb2RlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfTk9ERSA9ICJFTUZfUk9PVF9OT0RFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgbm9kZU5hbWUgPSBudWxsOwotCXByaXZhdGUgVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbnVsbDsKLQlwcml2YXRlIE5vdGlmaWVyIGVtZk93bmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCXByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdmVyc2lvbklEOwotCi0JLyoKLQkgKiBUaGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSB0aGUgYXR0cmlidXRlcyBpcyBhIFN0cmluZ1tdLiBUaGUgY2hvaWNlIHdhcyBtYWRlCi0JICogdG8gdXNlIGFuIGFycmF5IHRvIGF2b2lkIHRoZSBjcmVhdGlvbiBvZiBhbm90aGVyIG9iamVjdCAocHJvYmFibHkgYSBIYXNodGFibGUpIGFuZCB0byBleHBsb2l0Ci0JICogYXJyYXktYWNjZXNzIHRpbWVzIHRvIGdldCB0aGUgbmFtZSBhbmQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZXMgKG9wcG9zZWQgdG8gZnVsbCBmbGVkZ2VkCi0JICogbWV0aG9kIGludm9jYXRpb25zKS4KLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gbnVsbDsKLQlwcml2YXRlIENhY2hlRXZlbnROb2RlIHBhcmVudCA9IG51bGw7Ci0JcHJpdmF0ZSBDYWNoZUV2ZW50UG9vbCBjb250YWluaW5nUG9vbCA9IG51bGw7Ci0JcHJpdmF0ZSBCb29sZWFuIGlnbm9yYWJsZSA9IG51bGw7Ci0KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUoQ2FjaGVFdmVudFBvb2wgY29udGFpbmluZ1Bvb2wpIHsKLQkJdGhpcy5jb250YWluaW5nUG9vbCA9IGNvbnRhaW5pbmdQb29sOwotCX0KLQotCS8qKgotCSAqIExpZmVjeWNsZSBtZXRob2QuIGluaXQoVHJhbnNsYXRvclJlc291cmNlKSB3aWxsIGNvbmZpZ3VyZSB0aGlzIEFkYXB0ZXIgYXMgYSBST09UIG5vZGUuCi0JICogCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpbnZva2UgZGlzY2FyZCgpIGJlZm9yZSBjb21wbGV0aW5nIGl0cyB0YXNrcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0aGlzLmRpc2NhcmQoKTsKLQkJdGhpcy5zZXRFbWZPd25lcihyZXNvdXJjZSk7Ci0JCXRoaXMuc2V0VHJhbnNsYXRvcihyZXNvdXJjZS5nZXRSb290VHJhbnNsYXRvcigpKTsKLQkJdGhpcy5zZXRWZXJzaW9uSUQocmVzb3VyY2UuZ2V0VmVyc2lvbklEKCkpOwotCQl0aGlzLm5vZGVOYW1lID0gQ2FjaGVFdmVudE5vZGUuUk9PVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIExpZmVjeWNsZSBtZXRob2QuIGluaXQoQ2FjaGVFdmVudE5vZGUsIFN0cmluZywgQXR0cmlidXRlcykgd2lsbCBjb25maWd1cmUgdGhpcyBBZGFwdGVyIHRvIGJlCi0JICogYSBub24tUk9PVCBub2RlIG9mIHRoZSBBZGFwdGVyIGRhdGEgc3RydWN0dXJlCi0JICogCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpbnZva2UgZGlzY2FyZCgpIGJlZm9yZSBjb21wbGV0aW5nIGl0cyB0YXNrcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KENhY2hlRXZlbnROb2RlIHBhcmVudEFyZywgU3RyaW5nIG5vZGVOYW1lQXJnLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXNBcmcpIHsKLQkJdGhpcy5kaXNjYXJkKCk7Ci0JCXRoaXMubm9kZU5hbWUgPSBub2RlTmFtZUFyZzsKLQkJaW5pdChwYXJlbnRBcmcsIGF0dHJpYnV0ZXNBcmcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KENhY2hlRXZlbnROb2RlIHBhcmVudFJlY29yZCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzQXJnKSB7Ci0JCXNldFBhcmVudChwYXJlbnRSZWNvcmQpOwotCi0JCXNldEF0dHJpYnV0ZXMoYXR0cmlidXRlc0FyZyk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJLyogSSBhbSBub3QgdGhlIHJvb3QgKi8KLQotCQkJLyoKLQkJCSAqIElmIHRoZSBwYXJlbnQgaXMgcGFydCBvZiB0aGUgRE9NIFBhdGgsIHRoZW4gd2UgaWdub3JlIGl0IGFuZCBpbnRlcmFjdCB3aXRoIHRoZSBncmFuZAotCQkJICogcGFyZW50Ci0JCQkgKi8KLQkJCWlmIChwYXJlbnQudHJhbnNsYXRvciAhPSBudWxsICYmIHBhcmVudC5pc0luRE9NUGF0aCgpKSB7Ci0JCQkJc2V0UGFyZW50KHBhcmVudC5nZXRQYXJlbnQoKSk7Ci0JCQl9Ci0KLQkJCXNldFZlcnNpb25JRChwYXJlbnQuZ2V0VmVyc2lvbklEKCkpOwotCQkJaWYgKHBhcmVudC5nZXRFbWZPd25lcigpICE9IG51bGwgJiYgcGFyZW50LmdldFRyYW5zbGF0b3IoKSAhPSBudWxsKSB7Ci0KLQkJCQkvKiBNeSBwYXJlbnQgaGFkIGVub3VnaCBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlbXNlbGYgKi8KLQotCQkJCWlmIChwYXJlbnQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJCQlzZXRUcmFuc2xhdG9yKHBhcmVudC5nZXRUcmFuc2xhdG9yKCkuZmluZENoaWxkKG5vZGVOYW1lLCBwYXJlbnQuZ2V0RW1mT3duZXIoKSwgZ2V0VmVyc2lvbklEKCkpKTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldFRyYW5zbGF0b3IocGFyZW50LmdldFRyYW5zbGF0b3IoKSk7Ci0JCQkJfQotCi0JCQkJaWYgKHRoaXMudHJhbnNsYXRvciA9PSBudWxsKSB7Ci0JCQkJCS8qIE91ciB0cmFuc2xhdG9yIGlzIG51bGwhIEFoaCEgUnVuISAqLwotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQYXJlbnQgVHJhbnNsYXRvciAoIiArIHBhcmVudC5nZXRUcmFuc2xhdG9yKCkgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSIpIGRpZCBub3QgZmluZCBhIENoaWxkIFRyYW5zbGF0b3IgZm9yIFwiIiArIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCW5vZGVOYW1lICsgIlwiLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJaWYgKHRoaXMudHJhbnNsYXRvci5nZXRSZWFkQWhlYWRIZWxwZXIobm9kZU5hbWUpID09IG51bGwgJiYgIXRoaXMudHJhbnNsYXRvci5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEkgZG8gbm90IHJlcXVpcmUgYSByZWFkIGFoZWFkIGN1ZSwgYW5kIEkgYW0gbm90IG1hbmFnZWQgYnkgbXkgcGFyZW50IHNvIEkgY2FuCi0JCQkJCSAqIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBteSBFTUYgb2JqZWN0Ci0JCQkJCSAqLwotCi0JCQkJCU5vdGlmaWVyIG15RW1mT3duZXIgPSB0aGlzLnRyYW5zbGF0b3IuY3JlYXRlRU1GT2JqZWN0KGdldE5vZGVOYW1lKCksIG51bGwpOwotCQkJCQlzZXRFbWZPd25lcihteUVtZk93bmVyKTsKLQkJCQkJdGhpcy50cmFuc2xhdG9yLnNldE1PRlZhbHVlKHBhcmVudC5nZXRFbWZPd25lcigpLCBteUVtZk93bmVyKTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBFbHNlIEkgcmVxdWlyZSBhIHJlYWQgYWhlYWQgdmFsdWUgb3IgSSBhbSBiZWluZyBtYW5hZ2VkIGJ5IG15IHBhcmVudCwgc28gSSBoYXZlCi0JCQkJICogbm8gbmVlZCB0byBjcmVhdGUgYW4gRU1GIG9iamVjdAotCQkJCSAqLwotCQkJfQotCQkJLyoKLQkJCSAqIEVsc2UgSSBhbSBub3QgbWFwcGVkIHRvIHRoZSBFTUYgc3RhY2sgKFhNTCBFbGVtZW50cyBmb3VuZCBpbiB0aGUgRE9NUGF0aCBhcmUgaWdub3JlZCkKLQkJCSAqLwotCQl9Ci0JCS8qIHByb2Nlc3NBdHRyaWJ1dGVzIGlzIGd1YXJkZWQgYW5kIHdpbGwgbm90IGV4ZWN1dGUgdW5sZXNzIHJlYWR5ICovCi0JCXByb2Nlc3NBdHRyaWJ1dGVzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBjb21taXQoKSBpcyBpbnZva2VkIG9ubHkgaWYgdGhlIENhY2hlRXZlbnROb2RlIChDRU5PKSBoYXMgYWxsIHRoZSBpbmZvcm1hdGlvbiB0aGV5IG5lZWQgYW5kCi0JICogc2hvdWxkIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gZG8gdG8gdGhlIEVNRiBmZWF0dXJlLgotCSAqIAotCSAqIFRoZSBjb21taXQoKSBtZXRob2Qgd2lsbCBpbnZva2UgZGlzY2FyZCgpIHdoZW4gaXQgaGFzIGNvbXBsZXRlZCBpdHMgdGFza3MsIGlmIG5lZWRlZC4gVGh1cywKLQkgKiBhZnRlciBpbnZva2luZyB0aGlzIG1ldGhvZCwgdGhlIENFTk8gbWF5IGhhdmUgbm8gbWVhbmluZ2Z1bCBzdGF0ZS4gSWYgZGlzY2FyZCgpIGlzIGludm9rZWQsCi0JICogYWxsIHByZXZpb3VzbHkgaGVsZCByZWZlcmVuY2Ugd2lsbCBiZSByZWxlYXNlZCBpbiBvcmRlciB0byBiZSBtYWRlIGVsaWdpYmxlIGZvciBHYXJiYWdlCi0JICogQ29sbGVjdGlvbi4KLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgY29tbWl0KCkgewotCi0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCB0aGlzLmlzSWdub3JhYmxlKCkpIHsKLQkJCWRpc2NhcmQoKTsKLQkJCXJlbGVhc2VGcm9tQ29udGFpbmluZ1Bvb2woKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVJlYWRBaGVhZEhlbHBlciBoZWxwZXIgPSBudWxsOwotCQlUcmFuc2xhdG9yIGFjdGl2ZVRyYW5zbGF0b3IgPSBnZXRUcmFuc2xhdG9yKCk7Ci0JCVRyYW5zbGF0b3IgcGFyZW50VHJhbnNsYXRvciA9IGdldFBhcmVudCgpLmdldFRyYW5zbGF0b3IoKTsKLQotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldEVtZk93bmVyKCkgPT0gbnVsbCkgewotCi0JCQkvKgotCQkJICogTm90IGVub3VnaCBpbmZvcm1hdGlvbiB5ZXQsIGFkZCB0aGUgQ2FjaGVFdmVudE5vZGUgdG8gdGhlIERPTSBDYWNoZSB0cmVlCi0JCQkgKi8KLQotCQkJcGFyZW50LmFwcGVuZFRvQnVmZmVyKHRoaXMpOwotCQkJaWYgKChoZWxwZXIgPSBnZXRQYXJlbnQoKS5nZXRSZWFkQWhlYWRIZWxwZXIoKSkgIT0gbnVsbCkgewotCQkJCS8qCi0JCQkJICogSWYgdGhlIHBhcmVudFJlY29yZCdzIGVtZk93bmVyIGlzIG51bGwsIHRoZW4gaXQgbXVzdCBub3QgYmUgaW5pdGlhbGl6ZWQgdGhlcmVmb3JlCi0JCQkJICogaXQgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMgbXVzdCByZXF1aXJlIHJlYWQgYWhlYWQgY2x1ZXMKLQkJCQkgKiAKLQkJCQkgKiBUaGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCBjaGVja3MgaWYgdGhlIHBhcmVudCBpcyB0aGUgbm9kZSB3YWl0aW5nIGZvciBhCi0JCQkJICogcmVhZEFoZWFkIGN1ZQotCQkJCSAqLwotCQkJCUVPYmplY3QgcGFyZW50T3duZXIgPSBudWxsOwotCQkJCWlmIChoZWxwZXIubm9kZVZhbHVlSXNSZWFkQWhlYWROYW1lKGdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCS8qIFRoZSByZWFkQWhlYWROYW1lIGlzIHRoZSB2YWx1ZSBvZiB0aGUgcU5hbWUgY2hpbGQgbm9kZSAqLwotCi0JCQkJCS8qIFdlIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgRW1mT3duZXIgaW4gdGhlIHBhcmVudCEgKi8KLQkJCQkJcGFyZW50T3duZXIgPSBwYXJlbnRUcmFuc2xhdG9yLmNyZWF0ZUVNRk9iamVjdChnZXRQYXJlbnQoKS5nZXROb2RlTmFtZSgpLCBnZXRCdWZmZXIoKSk7Ci0KLQkJCQkJLyoKLQkJCQkJICogTm93IHdlIG5lZWQgdG8gcGFyc2UgdGhlIGNhY2hlZCBET00gdHJlZSBhbmQgdXBkYXRlIHRoZSBlbWZPd25lciBvZiB0aGUKLQkJCQkJICogcGFyZW50Ci0JCQkJCSAqLwotCQkJCQlnZXRQYXJlbnQoKS51cGRhdGVFTUYocGFyZW50T3duZXIpOwotCi0JCQkJfSBlbHNlIGlmIChoZWxwZXIubm9kZU5hbWVJc1JlYWRBaGVhZE5hbWUoZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJLyogVGhlIHJlYWRBaGVhZE5hbWUgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBjaGlsZCBub2RlIChxTmFtZSkgKi8KLQotCQkJCQkvKiBXZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlIEVtZk93bmVyIGluIHRoZSBwYXJlbnQhICovCi0JCQkJCXBhcmVudE93bmVyID0gcGFyZW50VHJhbnNsYXRvci5jcmVhdGVFTUZPYmplY3QoZ2V0UGFyZW50KCkuZ2V0Tm9kZU5hbWUoKSwgZ2V0Tm9kZU5hbWUoKSk7Ci0KLQkJCQkJLyoKLQkJCQkJICogTm93IHdlIG5lZWQgdG8gcGFyc2UgdGhlIGNhY2hlZCBET00gdHJlZSBhbmQgdXBkYXRlIHRoZSBlbWZPd25lciBvZiB0aGUKLQkJCQkJICogcGFyZW50Ci0JCQkJCSAqLwotCQkJCQlnZXRQYXJlbnQoKS51cGRhdGVFTUYocGFyZW50T3duZXIpOwotCQkJCX0KLQotCQkJfSAvKiBFbHNlIGFuIGFuY2VzdG9yIG9mIHRoZSBwYXJlbnQgaXMgd2FpdGluZyAqLwotCi0JCX0gZWxzZSB7Ci0JCQlpZiAoYWN0aXZlVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQkJaWYgKGFjdGl2ZVRyYW5zbGF0b3IuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCi0JCQkJCU9iamVjdCB2YWx1ZSA9IGFjdGl2ZVRyYW5zbGF0b3IuY29udmVydFN0cmluZ1RvVmFsdWUoZ2V0Tm9kZU5hbWUoKSwgbnVsbCwgZ2V0QnVmZmVyKCksIGdldFBhcmVudCgpLmdldEVtZk93bmVyKCkpOwotCQkJCQlhY3RpdmVUcmFuc2xhdG9yLnNldE1PRlZhbHVlKGdldFBhcmVudCgpLmdldEVtZk93bmVyKCksIHZhbHVlKTsKLQkJCQkJcHJvY2Vzc0F0dHJpYnV0ZXMoKTsKLQkJCQl9IGVsc2UgewotCi0JCQkJCWFjdGl2ZVRyYW5zbGF0b3Iuc2V0VGV4dFZhbHVlSWZOZWNlc3NhcnkoZ2V0QnVmZmVyKCksIGdldEVtZk93bmVyKCksIGdldFZlcnNpb25JRCgpKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWRpc2NhcmQoKTsKLQkJCXJlbGVhc2VGcm9tQ29udGFpbmluZ1Bvb2woKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc3RydWN0IHRoZSBDYWNoZUV2ZW50Tm9kZSB0byBkaXNjYXJkIGFsbCByZWZlcmVuY2VzIHRvIG1ha2UgZXZlcnl0aGluZyBlbGlnaWJsZSBmb3IgZ2FyYmFnZQotCSAqIGNvbGxlY3Rpb24uIFRoaXMgc2hvdWxkIE9OTFkgYmUgY2FsbGVkIGFmdGVyIGNvbW1pdCBoYXMgc3VjY2VlZGVkLiBJbiB0aGUgY2FzZSBvZiBFTUYKLQkgKiBmZWF0dXJlcyB0aGF0IHJlcXVpcmUgYSByZWFkQWhlYWROYW1lLCBwcm9jZXNzIG5vdCBiZSBjb21wbGV0ZWQgaW4gY29tbWl0KCksIGJ1dCByYXRoZXIgd2lsbAotCSAqIGJlIGRlZmVyZWQgdG8gdGhlIHVwZGF0ZUVNRigpIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2FzIG1hZGUgcHJpdmF0ZSBzcGVjaWZpY2FsbHkgYmVjYXVzZSBpdAotCSAqIGNvdWxkIGVyYXNlIGFsbCBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIENhY2hlRXZlbnROb2RlIGJlZm9yZSBpdCBoYXMgYmVlbiBwcm9jZXNzZWQuCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNjYXJkKCkgewotCQl0cmFuc2xhdG9yID0gbnVsbDsKLQkJZW1mT3duZXIgPSBudWxsOwotCQlidWZmZXIgPSBudWxsOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCWNoaWxkcmVuID0gbnVsbDsKLQkJYXR0cmlidXRlcyA9IG51bGw7Ci0JCXBhcmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbGVhc2VGcm9tQ29udGFpbmluZ1Bvb2woKSB7Ci0JCWlmIChjb250YWluaW5nUG9vbCAhPSBudWxsKQotCQkJY29udGFpbmluZ1Bvb2wucmVsZWFzZU5vZGUodGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoKSB7Ci0JCWlmIChpZ25vcmFibGUgPT0gbnVsbCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmICh0aGlzLnRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJCWlmICh0aGlzLnRyYW5zbGF0b3IuaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpKSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBkb21QYXRoID0gdGhpcy50cmFuc2xhdG9yLmdldERPTVBhdGgoKTsKLQkJCQkJcmVzdWx0ID0gKGRvbVBhdGggIT0gbnVsbCkgPyBkb21QYXRoLmluZGV4T2YodGhpcy5ub2RlTmFtZSkgPj0gMCA6IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlnbm9yYWJsZSA9IHJlc3VsdCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIGlnbm9yYWJsZS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gY2hpbGQgaGFzIGEgdHJhbnNsYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGROb2RlTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgWE1MIGNoaWxkIG5vZGUKLQkgKiBAcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY2hpbGROb2RlTmFtZSBjYW4gYmUgaWdub3JlZCAoZS5nLiBpdCBpcyBwYXJ0IG9mIHRoZSBET00gUGF0aCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkSWdub3JhYmxlKFN0cmluZyBjaGlsZE5vZGVOYW1lKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJVHJhbnNsYXRvciBjaGlsZFRyYW5zbGF0b3IgPSBudWxsOwotCQlpZiAodGhpcy5nZXRUcmFuc2xhdG9yKCkgIT0gbnVsbCkgewotCQkJY2hpbGRUcmFuc2xhdG9yID0gdGhpcy5nZXRUcmFuc2xhdG9yKCkuZmluZENoaWxkKGNoaWxkTm9kZU5hbWUsIHRoaXMuZ2V0RW1mT3duZXIoKSwgdGhpcy5nZXRWZXJzaW9uSUQoKSk7Ci0KLQkJCWlmIChjaGlsZFRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZFRyYW5zbGF0b3IuaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpKSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyB0ZW1wID0gbnVsbDsKLQkJCQkJcmVzdWx0ID0gKCh0ZW1wID0gY2hpbGRUcmFuc2xhdG9yLmdldERPTVBhdGgoKSkgIT0gbnVsbCkgPyB0ZW1wLmluZGV4T2YoY2hpbGROb2RlTmFtZSkgPj0gMCA6IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbkRPTVBhdGgoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKHRoaXMuZ2V0VHJhbnNsYXRvcigpICE9IG51bGwpIHsKLQotCQkJcmVzdWx0ID0gdGhpcy5nZXROb2RlTmFtZSgpLmVxdWFscyh0aGlzLmdldFRyYW5zbGF0b3IoKS5nZXRET01QYXRoKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigiQ2FjaGVFdmVudE5vZGVbIik7Ly8kTk9OLU5MUy0xJAotCQlvdXRwdXQuYXBwZW5kKCJub2RlTmFtZT0iKTsvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQobm9kZU5hbWUpOwotCQlvdXRwdXQuYXBwZW5kKCI7IHRyYW5zbGF0b3I9Iik7Ly8kTk9OLU5MUy0xJAotCQlvdXRwdXQuYXBwZW5kKHRyYW5zbGF0b3IpOwotCQlvdXRwdXQuYXBwZW5kKCI7IGVtZk93bmVyPSIpOy8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCW91dHB1dC5hcHBlbmQoZW1mT3duZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlvdXRwdXQuYXBwZW5kKCJDb3VsZCBub3QgcmVuZGVyIGFzIHN0cmluZyEiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJb3V0cHV0LmFwcGVuZCgiOyBidWZmZXI9Iik7Ly8kTk9OLU5MUy0xJAotCQlvdXRwdXQuYXBwZW5kKHRoaXMuYnVmZmVyKTsKLQkJb3V0cHV0LmFwcGVuZCgiOyBoYXNDaGlsZHJlbj0iKTsvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQoKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJb3V0cHV0LmFwcGVuZCgiXG5cdGNoaWxkcmVuKCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlvdXRwdXQuYXBwZW5kKGkpOwotCQkJCW91dHB1dC5hcHBlbmQoIik6ICIpOy8vJE5PTi1OTFMtMSQKLQkJCQlvdXRwdXQuYXBwZW5kKHRoaXMuY2hpbGRyZW4uZ2V0KGkpKTsKLQkJCX0KLQkJfQotCQlvdXRwdXQuYXBwZW5kKCJdIik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgRU1GIG1vZGVsIGJ5IGNyZWF0aW5nIEVNRiBGZWF0dXJlcyBhcyBuZWNlc3NhcnkgZnJvbSB0aGUgRE9NIFRyZWUgQ2FjaGUKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVFTUYoRU9iamVjdCBvd25lcikgewotCQl0aGlzLnNldEVtZk93bmVyKG93bmVyKTsKLQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMudHJhbnNsYXRvci5zZXRNT0ZWYWx1ZSgoRU9iamVjdCkgdGhpcy5wYXJlbnQuZ2V0RW1mT3duZXIoKSwgb3duZXIpOwotCQkJdGhpcy5wcm9jZXNzQXR0cmlidXRlcygpOwotCQl9Ci0KLQkJdGhpcy51cGRhdGVFTUYoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHJhbnNsYXRvciBhbmQgdGhlIG93bmVyIG9mIHRoZSBwYXJlbnQgQ0VOTyBwYXNzZWQgdG8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG5vbm51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVFTUYoKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ2FjaGVFdmVudE5vZGUgY2hpbGQgPSBudWxsOwotCQlUcmFuc2xhdG9yIGNoaWxkVHJhbnNsYXRvciA9IG51bGw7Ci0JCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCWlmICh0aGlzLmdldEVtZk93bmVyKCkgIT0gbnVsbCkgewotCQkJTm90aWZpZXIgcGFyZW50T3duZXIgPSB0aGlzLmdldEVtZk93bmVyKCk7Ci0JCQlUcmFuc2xhdG9yIHBhcmVudFRyYW5zbGF0b3IgPSB0aGlzLmdldFRyYW5zbGF0b3IoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5zaXplKCk7IGkrKykgewotCi0JCQkJY2hpbGQgPSAoQ2FjaGVFdmVudE5vZGUpIHRoaXMuY2hpbGRyZW4uZ2V0KGkpOyAvKiBDcmVhdGUgdGhlIEVNRiBmZWF0dXJlICovCi0JCQkJaWYgKHRoaXMuaXNDaGlsZElnbm9yYWJsZShjaGlsZC5nZXROb2RlTmFtZSgpKSkgewotCQkJCQl0aGlzLmFkZENoaWxkcmVuKGNoaWxkLmdldENoaWxkcmVuKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNoaWxkVHJhbnNsYXRvciA9IHBhcmVudFRyYW5zbGF0b3IuZmluZENoaWxkKGNoaWxkLmdldE5vZGVOYW1lKCksIHBhcmVudE93bmVyLCBjaGlsZC5nZXRWZXJzaW9uSUQoKSk7Ci0JCQkJCWNoaWxkLnNldFRyYW5zbGF0b3IoY2hpbGRUcmFuc2xhdG9yKTsKLQotCQkJCQl2YWx1ZSA9IGNoaWxkVHJhbnNsYXRvci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShjaGlsZC5nZXROb2RlTmFtZSgpLCBudWxsLCBjaGlsZC5nZXRCdWZmZXIoKSwgcGFyZW50T3duZXIpOwotCQkJCQljaGlsZFRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUocGFyZW50T3duZXIsIHZhbHVlKTsKLQotCQkJCQlpZiAoY2hpbGRUcmFuc2xhdG9yLmlzT2JqZWN0TWFwKCkpIHsKLQkJCQkJCWNoaWxkLnNldEVtZk93bmVyKChOb3RpZmllcikgdmFsdWUpOwotCQkJCQkJY2hpbGRUcmFuc2xhdG9yLnNldFRleHRWYWx1ZUlmTmVjZXNzYXJ5KGNoaWxkLmdldEJ1ZmZlcigpLCBjaGlsZC5nZXRFbWZPd25lcigpLCBnZXRWZXJzaW9uSUQoKSk7Ci0JCQkJCX0KLQotCQkJCQljaGlsZC5wcm9jZXNzQXR0cmlidXRlcygpOwotCQkJCQljaGlsZC51cGRhdGVFTUYoKTsgLyogdXBkYXRlIHRoZSBFTUYgb2YgdGhlIGNoaWxkICovCi0KLQkJCQl9Ci0JCQkJY2hpbGQuZGlzY2FyZCgpOwotCQkJCWNoaWxkLnJlbGVhc2VGcm9tQ29udGFpbmluZ1Bvb2woKTsKLQkJCX0KLQkJCXRoaXMuY2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoQ2FjaGVFdmVudE5vZGUgY2hpbGQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgdGhpcy5pc0lnbm9yYWJsZSgpKSB7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oTGlzdCBjaGlsZHJlbkFyZykgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXRoaXMuY2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuQXJnKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDaGlsZChDYWNoZUV2ZW50Tm9kZSBjaGlsZCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIFJlYWRBaGVhZEhlbHBlciBnZXRSZWFkQWhlYWRIZWxwZXIoKSB7Ci0JCWlmICh0aGlzLnRyYW5zbGF0b3IgIT0gbnVsbCAmJiB0aGlzLnRyYW5zbGF0b3IuaGFzUmVhZEFoZWFkTmFtZXMoKSkgewotCQkJcmV0dXJuIHRyYW5zbGF0b3IuZ2V0UmVhZEFoZWFkSGVscGVyKG5vZGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZXMgZmllbGQgZm9yIGluZm8gb24gaG93IGl0IGlzIHN0cnVjdHVyZWQgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cikgewotCi0JCS8qCi0JCSAqIFRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGZyb20gdGhlIHBhcnNlciBtYXkgYmUgc3RvcmVkIGJ5IHJlZmVyZW5jZSwgc28gd2UgbXVzdCBjb3B5IHRoZW0KLQkJICogb3ZlciB0byBhIGxvY2FsIGRhdGEgc3RvcmUKLQkJICovCi0JCWlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5nZXRMZW5ndGgoKSA+IDApIHsKLQotCQkJaWYgKHRoaXMuYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQkJdGhpcy5hdHRyaWJ1dGVzID0gbmV3IFN0cmluZ1thdHRyLmdldExlbmd0aCgpICogMl07Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHIuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCXRoaXMuYXR0cmlidXRlc1tpXSA9IGF0dHIuZ2V0UU5hbWUoaSk7Ci0JCQkJdGhpcy5hdHRyaWJ1dGVzW2kgKyBhdHRyLmdldExlbmd0aCgpXSA9IGF0dHIuZ2V0VmFsdWUoaSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIHByb2Nlc3NBdHRyaWJ1dGVzIG1heSBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzLiBJdCBpcyBjb25maWd1cmVkIHRvIG9ubHkgY2Fycnkgb3V0IHRoZQotCSAqIHByb2Nlc3Npbmcgb25lIHRpbWUuIEFmdGVyIGl0IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZXMgdGhlIGNvbnN0cnVjdGlvbiBvZiBUcmFuc2xhdG9ycyBhbmQKLQkgKiB2YWx1ZXMgaXQgd2lsbCBkaXNjYXJkIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlcyBmaWVsZCBieSBzZXR0aW5nIGl0IHRvIG51bGwuCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NBdHRyaWJ1dGVzKCkgewotCQkvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBhdHRyaWJ1dGVzIGZpZWxkIGZvciBpbmZvIG9uIGhvdyBpdCBpcyBzdHJ1Y3R1cmVkICovCi0JCWlmICh0aGlzLmF0dHJpYnV0ZXMgIT0gbnVsbCAmJiB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgewotCi0JCQlpZiAodGhpcy5lbWZPd25lciAhPSBudWxsICYmIHRoaXMudHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQkJVHJhbnNsYXRvciBhdHRyVHJhbnNsYXRvciA9IG51bGw7Ci0JCQkJZmluYWwgaW50IGxpbWl0ID0gdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aCAvIDI7Ci0JCQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbWl0OyBpKyspIHsKLQotCQkJCQkvKiBGaW5kIHRoZSBhdHRyaWJ1dGUgdHJhbnNsYXRvciBieSB1c2luZyB0aGUgYXR0cmlidXRlIG5hbWUgKGF0dHJpYnV0ZXNbaV0pICovCi0JCQkJCWF0dHJUcmFuc2xhdG9yID0gdGhpcy50cmFuc2xhdG9yLmZpbmRDaGlsZCh0aGlzLmF0dHJpYnV0ZXNbaV0sIHRoaXMuZW1mT3duZXIsIHRoaXMudmVyc2lvbklEKTsKLQotCQkJCQlpZiAoYXR0clRyYW5zbGF0b3IgIT0gbnVsbCkgewotCi0JCQkJCQkvKgotCQkJCQkJICogQ29udmVydCB0aGUgdmFsdWUgb2YgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgdmFsdWUgKGF0dHJpYnV0ZXNbaStsaW1pdF0pCi0JCQkJCQkgKiB0byBhIG1lYW5pbmdmdWwgdmFsdWUKLQkJCQkJCSAqLwotCQkJCQkJdmFsdWUgPSBhdHRyVHJhbnNsYXRvci5jb252ZXJ0U3RyaW5nVG9WYWx1ZSh0aGlzLmF0dHJpYnV0ZXNbaSArIGxpbWl0XSwgKEVPYmplY3QpIHRoaXMuZW1mT3duZXIpOwotCQkJCQkJYXR0clRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUoKEVPYmplY3QpIHRoaXMuZW1mT3duZXIsIHZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8qIEZvcmdldCB0aGUgYXR0cmlidXRlcyBzbyB3ZSBkbyBub3QgcHJvY2VzcyB0aGVtIGFnYWluICovCi0JCQkJdGhpcy5hdHRyaWJ1dGVzID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZHMgZGF0YSB0byB0aGUgYnVmZmVyIHN0b3JlZCBieSB0aGlzIENFTk8uIFRleHQgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgZGF0YSBhcnJheQotCSAqIGJlZ2luaW5nIGF0IHBvc2l0aW9uZyA8aT5zdGFydCA8L2k+IGFuZCBlbmRpbmcgYXQgcG9zaXRpb24gPGk+c3RhcnQrbGVuZ3RoIDwvaT4uCi0JICogCi0JICogQHBhcmFtIGRhdGEKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kVG9CdWZmZXIoY2hhcltdIGRhdGEsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCi0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiB0aGlzLmlzSWdub3JhYmxlKCkpIHsKLQkJCXBhcmVudC5hcHBlbmRUb0J1ZmZlcihkYXRhLCBzdGFydCwgbGVuZ3RoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBhY3RzIGFzIGEgbW9yZSBlZmZpY2llbnQgZm9ybSBvZiAiYXBwZW5kIi4gVXNpbmcgdGhpcyBtZXRob2QgYXZvaWRzIHRoZSBuZWVkIHRvIGNvcHkgdGhlCi0JCSAqIGRhdGEgaW50byBpdHMgb3duIGRhdGEgc3RydWN0dXJlIChlLmcuIFN0cmluZykgYmVmb3JlIGJlaW5nIGFkZGVkIHRvIHRoZSBidWZmZXIKLQkJICovCi0JCXRoaXMuYnVmZmVyLmluc2VydChidWZmZXIubGVuZ3RoKCksIGRhdGEsIHN0YXJ0LCBsZW5ndGgpOwotCi0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBnaXZlbiBDRU5PIGFzIGEgY2hpbGQgb2YgdGhpcyBDRU5PLgotCSAqIAotCSAqIEBwYXJhbSByZWNvcmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRUb0J1ZmZlcihDYWNoZUV2ZW50Tm9kZSByZWNvcmQpIHsKLQotCQl0aGlzLmFkZENoaWxkKHJlY29yZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCdWZmZXIoKSB7Ci0JCWlmICh0aGlzLmJ1ZmZlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5idWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgTm90aWZpZXIgZ2V0RW1mT3duZXIoKSB7Ci0JCXJldHVybiBlbWZPd25lcjsKLQl9Ci0KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQYXJlbnQoQ2FjaGVFdmVudE5vZGUgcmVjb3JkKSB7Ci0JCXRoaXMucGFyZW50ID0gcmVjb3JkOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zbGF0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW1mT3duZXIoTm90aWZpZXIgbm90aWZpZXIpIHsKLQotCQl0aGlzLmVtZk93bmVyID0gbm90aWZpZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHJhbnNsYXRvcihUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJdGhpcy50cmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbm9kZU5hbWU7Ci0JfQotCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7Ci0KLQkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoVHJhbnNsYXRvclJlc291cmNlKSB0aGlzLmdldEVtZk93bmVyKCkpLmdldFZlcnNpb25JRCgpOwotCi0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMudmVyc2lvbklEOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25JRChpbnQgaSkgewotCQl2ZXJzaW9uSUQgPSBpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFBvb2wuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnRQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Nzk5ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFBvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIFByb3ZpZGVzIGFuIGluc3RhbmNlIHBvb2wgb2YgcmV1c2FibGUgQ2FjaGVFdmVudE5vZGVzLiBUaGUgcG9vbCB3aWxsIGRlZmF1bHQgdG8gMTAgbGl2ZQotICogaW5zdGFuY2VzLiBXaGVuIGl0cyBhdmFpbGFibGUgaW5zdGFuY2VzIHJlYWNoIGZpdmUgdGltZXMgaXRzIGluaXRpYWwgY2FwYWNpdHksIGl0IHdpbGwgc2hyaW5rCi0gKiBpdHNlbGYgZG93biB0byB0aGUgaW5pdGlhbCBjYXBhY2l0eS4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZUV2ZW50UG9vbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NBUEFDSVRZID0gMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DQVBBQ0lUWV9JTkNSRU1FTlQgPSAyNTsKLQotCXByaXZhdGUgaW50IHBvb2xDYXBhY2l0eSA9IERFRkFVTFRfQ0FQQUNJVFk7Ci0JcHJpdmF0ZSBDYWNoZUV2ZW50U3RhY2sgYXZhaWxhYmxlUG9vbCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGludXNlUG9vbCA9IG51bGw7Ci0KLQlwdWJsaWMgQ2FjaGVFdmVudFBvb2woKSB7Ci0JCXRoaXMoREVGQVVMVF9DQVBBQ0lUWSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgQ2FjaGVFdmVudFBPb2wgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbCBjYXBhY2l0eQotCSAqIAotCSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGluc3RhbmNlcyB0byBjcmVhdGUuCi0JICovCi0JcHVibGljIENhY2hlRXZlbnRQb29sKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJcG9vbENhcGFjaXR5ID0gKGluaXRpYWxDYXBhY2l0eSA+IDApID8gaW5pdGlhbENhcGFjaXR5IDogREVGQVVMVF9DQVBBQ0lUWTsKLQkJYXZhaWxhYmxlUG9vbCA9IG5ldyBDYWNoZUV2ZW50U3RhY2soKTsKLQkJaW51c2VQb29sID0gbmV3IEFycmF5TGlzdChwb29sQ2FwYWNpdHkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIENhY2hlRXZlbnROb2RlIChDRU5PKSBpbml0aWFsaXplZCB0byB1c2UgdGhlIGdpdmVuIHJlc291cmNlIGFzIGl0cyBFTUYgT3duZXIuCi0JICogCi0JICogVEhJUyBNRVRIT0QgU0hPVUxEIE9OTFkgQkUgVVNFRCBUTyBDUkVBVEUgUk9PVCBOT0RFUy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSB0aGF0IHdpbGwgYmUgcG9wdWxhdGVkCi0JICogQHJldHVybiBhIENhY2hlRXZlbnROb2RlIHRvIHNlcnZlIGFzIHRoZSByb290LgotCSAqLwotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBjcmVhdGVDYWNoZUV2ZW50Tm9kZShUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJQ2FjaGVFdmVudE5vZGUgYWRhcHRlciA9IGZldGNoRnJlZU5vZGUoKTsKLQkJYWRhcHRlci5pbml0KHJlc291cmNlKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNoaWxkIENhY2hlRXZlbnROb2RlcyAoQ0VOT3MpIHRoYXQgd2lsbCBicmFuY2ggZnJvbSB0aGUgZ2l2ZW4gcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb250YWluaW5nIENFTk8KLQkgKiBAcGFyYW0gbm9kZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgWE1MIGVsZW1lbnQgbm9kZSBuYW1lCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBnaXZlbiBYTUwgZWxlbWVudAotCSAqIEByZXR1cm4gQSBDRU5PIHRoYXQgaGFzIGJlZW4gcHJvcGVybHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIENhY2hlRXZlbnROb2RlIGNyZWF0ZUNhY2hlRXZlbnROb2RlKENhY2hlRXZlbnROb2RlIHBhcmVudCwgU3RyaW5nIG5vZGVOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJQ2FjaGVFdmVudE5vZGUgYWRhcHRlciA9IGZldGNoRnJlZU5vZGUoKTsKLQkJYWRhcHRlci5pbml0KHBhcmVudCwgbm9kZU5hbWUsIGF0dHJpYnV0ZXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHRoZSBDYWNoZUV2ZW50Tm9kZSBDRU5PIGJhY2sgdG8gdGhlIHBvb2wgb2YgYXZhaWxhYmUgaW5zdGFuY2VzLiBUaGlzIG1ldGhvZCBzaG91bGQKLQkgKiBub3QgYmUgaW52b2tlZCBkaXJlY3RseS4gQ0VOT3Mgd2hpY2ggYXJlIGFjcXVpcmVkIGZyb20gYSBnaXZlbiBwb29sIHdpbGwgYXV0b21hdGljYWxseQotCSAqIHJlbGVhc2UgdGhlbXNlbHZlcyB3aGVuIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VOb2RlKENhY2hlRXZlbnROb2RlIGFkYXB0ZXIpIHsKLQkJZnJlZU5vZGUoYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogZnJlZXplUG9vbCgpIHNob3VsZCBiZSBpbnZva2VkIHRvIGZyZWUgYW55IHVudXNlZCByZXNvdXJjZXMuIEFmdGVyIGZyZWV6ZVBvb2wgaGFzIGJlZW4KLQkgKiBpbnZva2VkLCB3YXJtUG9vbCgpIHdpbGwgbmVlZCB0byBiZSBpbnZva2VkIGJlZm9yZSB0aGUgcG9vbCBjYW4gYmUgdXNlZCBhZ2Fpbi4KLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgZnJlZXplUG9vbCgpIHsKLQkJYXZhaWxhYmxlUG9vbC5jbGVhcigpOwotCQlhdmFpbGFibGVQb29sID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB3YXJtUG9vbCgpIG11c3QgYmUgaW52b2tlZCB0byBub3RpZnkgdGhlIHBvb2wgaXQgaXMgYWJvdXQgdG8gYmUgdXNlZC4gVGhpcyBzaG91bGQgb2NjdXIgb25seQotCSAqIG9uY2UgcGVyIGRvY3VtZW50IHJlbmRlcmluZy4gVW50aWwgdGhlIHBvb2wgaXMgaW4gdXNlLCBpdCBjb250YWlucyBubyBhdmFpbGFibGUKLQkgKiBDYWNoZUV2ZW50Tm9kZXMgKENFTk9zKSBpbiBvcmRlciB0byBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgaW4tbWVtb3J5IGZvb3RwcmludCBvZiB0aGUKLQkgKiBFTUYyU0FYV3JpdGVyLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCB3YXJtUG9vbCgpIHsKLQkJZW5zdXJlTWluaW11bUNhcGFjaXR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoZUV2ZW50Tm9kZSBmZXRjaEZyZWVOb2RlKCkgewotCQlDYWNoZUV2ZW50Tm9kZSByZXN1bHQgPSBudWxsOwotCi0JCWlmIChhdmFpbGFibGVQb29sID09IG51bGwgfHwgYXZhaWxhYmxlUG9vbC5pc0VtcHR5KCkpCi0JCQl3YXJtUG9vbCgpOwotCi0JCXJlc3VsdCA9IGF2YWlsYWJsZVBvb2wucG9wKCk7Ci0JCWludXNlUG9vbC5hZGQocmVzdWx0KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBmcmVlTm9kZShDYWNoZUV2ZW50Tm9kZSBhZGFwdGVyKSB7Ci0JCWlmIChpbnVzZVBvb2wucmVtb3ZlKGFkYXB0ZXIpKQotCQkJYXZhaWxhYmxlUG9vbC5wdXNoKGFkYXB0ZXIpOwotCQkvL2Vsc2UKLQkJLy8JdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQWRhcHRlciBub3QgY29udGFpbmVkIGluIHBvb2whIik7Ci0JCWlmIChhdmFpbGFibGVQb29sLnNpemUoKSA+ICg1ICogcG9vbENhcGFjaXR5KSkgewotCQkJYXZhaWxhYmxlUG9vbC5jbGVhcigpOwotCQkJZW5zdXJlTWluaW11bUNhcGFjaXR5KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5zdXJlTWluaW11bUNhcGFjaXR5KCkgewotCQlpZiAoYXZhaWxhYmxlUG9vbCA9PSBudWxsKSB7Ci0JCQlhdmFpbGFibGVQb29sID0gbmV3IENhY2hlRXZlbnRTdGFjaygpOwotCQl9Ci0JCWlmIChhdmFpbGFibGVQb29sLnNpemUoKSA8IHBvb2xDYXBhY2l0eSkgewotCQkJZmluYWwgaW50IG1pbmltdW1DYXBhY2l0eSA9IHBvb2xDYXBhY2l0eSAtIGF2YWlsYWJsZVBvb2wuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5pbXVtQ2FwYWNpdHk7IGkrKykKLQkJCQlhdmFpbGFibGVQb29sLnB1c2gobmV3IENhY2hlRXZlbnROb2RlKHRoaXMpKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnRTdGFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjQxOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyNCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLS8qKgotICogQW4gdW5zeW5jaHJvbml6ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBTdGFjayAoTElGTykgZGF0YSBzdHJ1Y3R1cmUuIE5vIGNhc3RpbmcgaXMgcmVxdWlyZWQgd2hlbgotICogdXNpbmcgdGhpcyBkYXRhIHN0cnVjdHVyZS4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZUV2ZW50U3RhY2sgZXh0ZW5kcyBBcnJheUxpc3QgewotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICovCi0JcHVibGljIENhY2hlRXZlbnROb2RlIHBlZWsoKSB7Ci0JCWlmIChzaXplKCkgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0KLQkJcmV0dXJuIChDYWNoZUV2ZW50Tm9kZSkgZ2V0KHNpemUoKSAtIDEpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHJlbW92aW5nIGl0Ci0JICovCi0JcHVibGljIENhY2hlRXZlbnROb2RlIHBvcCgpIHsKLQkJaWYgKHNpemUoKSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQotCQlyZXR1cm4gKENhY2hlRXZlbnROb2RlKSByZW1vdmUoc2l6ZSgpIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiAgICAgICAgICAgIEEgQ0VOTyB0byBwdXNoIG9udG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoKENhY2hlRXZlbnROb2RlIGFkYXB0ZXIpIHsKLQkJYWRkKGFkYXB0ZXIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTM2N2M4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWdpc3RlciBtYXBwaW5ncyBmb3IgYSBwYWNrYWdlIHByZWZpeCB0byBpdHMgY3VycmVudCBuYW1lc3BhY2UgVVJJLiBBbHNvLAotICogdGhpcyByZWdpc3RyeSBpcyB1c2VkIHRvIG1hcCB0aGUgcGFja2FnZQotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkgewotCXB1YmxpYyBzdGF0aWMgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkoKTsKLQlwcml2YXRlIE1hcCBwcmVmaXhUb1BhY2thZ2VVUklzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIE1hcCBwYWNrYWdlVVJJc1RvUHJlZml4ZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkgewotCQlyZXR1cm4gcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByZWZpeFRvUGFja2FnZVVSSXMoKSB7Ci0JCXJldHVybiBwcmVmaXhUb1BhY2thZ2VVUklzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUHJlZml4VG9QYWNrYWdlVVJJKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHVyaSAhPSBudWxsKSB7Ci0JCQlwcmVmaXhUb1BhY2thZ2VVUklzLnB1dChwcmVmaXgsIHVyaSk7Ci0JCQlwYWNrYWdlVVJJc1RvUHJlZml4ZXMucHV0KHVyaSwgcHJlZml4KTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyNGRlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5UmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5UmVzb3VyY2VGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBNYXAgcHJlZml4VG9QYWNrYWdlVVJJczsKLQotCXByb3RlY3RlZCBNYXAgcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCi0JcHVibGljIE1hcCBnZXRQcmVmaXhUb1BhY2thZ2VVUkkoKSB7Ci0JCXJldHVybiBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5JTlNUQU5DRS5nZXRQcmVmaXhUb1BhY2thZ2VVUklzKCk7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5JTlNUQU5DRS5nZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsI2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsKHVyaSk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5U0FYWE1JSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2ZmYzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5U0FYWE1JSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMzAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5TQVhYTUlIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5U0FYWE1JSGFuZGxlciBleHRlbmRzIFNBWFhNSUhhbmRsZXIgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTExfQVRUUklCID0gWE1MUmVzb3VyY2UuWFNJX05TICsgIjpudWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIHhtaVJlc291cmNlCi0JICogQHBhcmFtIGhlbHBlcgotCSAqIEBwYXJhbSBvcHRpb25zCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyKFhNTFJlc291cmNlIHhtaVJlc291cmNlLCBYTUxIZWxwZXIgaGVscGVyLCBNYXAgb3B0aW9ucykgewotCQlzdXBlcih4bWlSZXNvdXJjZSwgaGVscGVyLCBvcHRpb25zKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIYW5kbGVyI2lzTnVsbCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsKCkgewotCQlib29sZWFuIGlzbnVsbCA9IHN1cGVyLmlzTnVsbCgpOwotCQlpZiAoIWlzbnVsbCkKLQkJCWlzbnVsbCA9IGF0dHJpYnMuZ2V0VmFsdWUoTlVMTF9BVFRSSUIpICE9IG51bGw7Ci0JCXJldHVybiBpc251bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTEzNWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlciBleHRlbmRzIFVSSUNvbnZlcnRlciB7Ci0JVVJJIGRlTm9ybWFsaXplKFVSSSB1cmkpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JTG9hZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxN2E0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JTG9hZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuU0FYV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JTG9hZEltcGw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsIGV4dGVuZHMgWE1JTG9hZEltcGwgewotCi0JLyoqCi0JICogQHBhcmFtIGhlbHBlcgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5WE1JTG9hZEltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTExvYWRJbXBsI21ha2VEZWZhdWx0SGFuZGxlcigpCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRIYW5kbGVyIG1ha2VEZWZhdWx0SGFuZGxlcigpIHsKLQkJcmV0dXJuIG5ldyBTQVhXcmFwcGVyKG5ldyBDb21wYXRpYmlsaXR5U0FYWE1JSGFuZGxlcihyZXNvdXJjZSwgaGVscGVyLCBvcHRpb25zKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1NGY1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSBleHRlbmRzIFhNSVJlc291cmNlIHsKLQlpbnQgRk9STUFUX0VNRjEgPSAwOwotCS8qKgotCSAqIGZvcm1hdCBmb3IgTU9GNSBjb21wYXRpYmlsaXR5OyBub3RlIHRoYXQgdGhpcyBjYW4gTk9UIGJlIHVzZWQgd2l0aCByZXNvdXJjZXMgdXNpbmdzIHRoZQotCSAqICJwbGF0Zm9ybTovcGx1Z2luIiBwcm90b2NvbCIKLQkgKi8KLQlpbnQgRk9STUFUX01PRjUgPSAxOwotCi0Jdm9pZCBhZGRPcmlnaW5hbFBhY2thZ2VVUkkoU3RyaW5nIHBhY2thZ2VVcmksIFN0cmluZyBvcmlnaW5hbFVyaSk7Ci0KLQlpbnQgZ2V0Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlcmlhbGl6YXRpb24gZm9ybWF0LiBCeSBkZWZhdWx0IGl0IGlzIEZPUk1BVF9FTUYxLgotCSAqIAotCSAqIEBzZWUgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlI0ZPUk1BVF9FTUYxCi0JICogQHNlZSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UjRk9STUFUX01PRjUKLQkgKi8KLQl2b2lkIHNldEZvcm1hdChpbnQgZm9ybWF0KTsKLQotCWJvb2xlYW4gdXNlc0RlZmF1bHRGb3JtYXQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSByb290T2JqZWN0Ci0JICovCi0Jdm9pZCByZW1vdmVQcmVzZXJ2aW5nSWRzKEVPYmplY3Qgcm9vdE9iamVjdCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMzQ4MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTExvYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxTYXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLklEVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1JUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VOQ09ESU5HID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBpbnQgZm9ybWF0ID0gRk9STUFUX0VNRjE7Ci0JcHJvdGVjdGVkIE1hcCBvcmlnaW5hbFBhY2thZ2VVUklzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGJvb2xlYW4gcHJlc2VydmVJRHMgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9QUk9UT0NPTCA9ICJwbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUExVR0lOID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYXBwYWJsZVhNSVJlc291cmNlSW1wbC4KLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdERlZmF1bHRTYXZlT3B0aW9ucygpOwotCX0KLQotCXB1YmxpYyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQkJaW5pdERlZmF1bHRTYXZlT3B0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbCNjcmVhdGVYTUxIZWxwZXIoKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgewotCQlNYXBwZWRYTUlIZWxwZXIgaGVscGVyID0gZG9DcmVhdGVYTUxIZWxwZXIoKTsKLQkJaGVscGVyLnNldFBhY2thZ2VVUklzVG9QcmVmaXhlcyhnZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKSk7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcHBlZFhNSUhlbHBlciBkb0NyZWF0ZVhNTEhlbHBlcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBwZWRYTUlIZWxwZXIodGhpcywgZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBub3QgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAc2VlIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5I2dldFByZWZpeFRvUGFja2FnZVVSSXMoKQotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpIHsKLQkJcmV0dXJuIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFLmdldFByZWZpeFRvUGFja2FnZVVSSXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBub3QgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAc2VlIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5I2dldFByZWZpeFRvUGFja2FnZVVSSXMoKQotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkgewotCQlyZXR1cm4gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkT3JpZ2luYWxQYWNrYWdlVVJJKFN0cmluZyBwYWNrYWdlVXJpLCBTdHJpbmcgb3JpZ2luYWxVcmkpIHsKLQkJb3JpZ2luYWxQYWNrYWdlVVJJcy5wdXQocGFja2FnZVVyaSwgb3JpZ2luYWxVcmkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0KCkgewotCQlyZXR1cm4gZm9ybWF0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdChpbnQgZm9ybWF0KSB7Ci0JCWlmICghaXNQbGF0Zm9ybVBsdWdpblJlc291cmNlVVJJKCkpCi0JCQl0aGlzLmZvcm1hdCA9IGZvcm1hdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQbGF0Zm9ybVBsdWdpblJlc291cmNlVVJJKCkgewotCQlVUkkgYVVSSSA9IGdldFVSSSgpOwotCi0JCXJldHVybiBhVVJJICE9IG51bGwgJiYgUExBVEZPUk1fUFJPVE9DT0wuZXF1YWxzKHVyaS5zY2hlbWUoKSkgJiYgUExBVEZPUk1fUExVR0lOLmVxdWFscyh1cmkuc2VnbWVudCgwKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UjZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSUZyYWdtZW50KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAodXNlc0RlZmF1bHRGb3JtYXQoKSkKLQkJCXJldHVybiBzdXBlci5nZXRVUklGcmFnbWVudChlT2JqZWN0KTsKLQkJcmV0dXJuIElEVXRpbC5nZXRPckFzc2lnbklEKGVPYmplY3QsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNEZWZhdWx0Rm9ybWF0KCkgewotCQlyZXR1cm4gZm9ybWF0ID09IENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfRU1GMTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGwjY3JlYXRlWE1MU2F2ZSgpCi0JICovCi0JcHJvdGVjdGVkIFhNTFNhdmUgY3JlYXRlWE1MU2F2ZSgpIHsKLQkJaWYgKHVzZXNEZWZhdWx0Rm9ybWF0KCkpCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlWE1MU2F2ZSgpOwotCQlyZXR1cm4gbmV3IENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2RvU2F2ZShPdXRwdXRTdHJlYW0sIE1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvU2F2ZShvdXRwdXRTdHJlYW0sIG9wdGlvbnMpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBpbml0RGVmYXVsdE9wdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlZmF1bHRTYXZlT3B0aW9ucygpIHsKLQkJaWYgKGRlZmF1bHRTYXZlT3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsI2dldEVPYmplY3RCeUlEKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFT2JqZWN0QnlJRChTdHJpbmcgaWQpIHsKLQkJaWYgKGlkVG9FT2JqZWN0TWFwICE9IG51bGwpIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpZFRvRU9iamVjdE1hcC5nZXQoaWQpOwotCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBlT2JqZWN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgdW5sb2FkZWQuIFRoaXMgaW1wbGVtZW50YXRpb24KLQkgKiB7QGxpbmsgSW50ZXJuYWxFT2JqZWN0I2VTZXRQcm94eVVSSSBzZXRzfXRoZSBvYmplY3QgdG8gYmUgYSBwcm94eSBhbmQgY2xlYXJzIHRoZQotCSAqIHtAbGluayAjZUFkYXB0ZXJzIGFkYXB0ZXJzfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmxvYWRlZChJbnRlcm5hbEVPYmplY3QgaW50ZXJuYWxFT2JqZWN0KSB7Ci0JCS8vb3ZlcnJpZGRlbiBmcm9tIHRoZSBzdXBlciBjbGFzczsgY2FsbCBzdXBlci5nZXRVUklGcmFnbWVudCBpbnN0ZWFkIG9mIHRoZSBpbXBsZW1lbnRhdGlvbgotCQkvL2F0IHRoaXMgbGV2ZWwsIHRvIGF2b2lkIElEIGdlbmVyYXRpb24gZHVyaW5nIHVubG9hZAotCQkvL2ludGVybmFsRU9iamVjdC5lU2V0UHJveHlVUkkodXJpLmFwcGVuZEZyYWdtZW50KGdldFVSSUZyYWdtZW50KGludGVybmFsRU9iamVjdCkpKTsKLQkJaW50ZXJuYWxFT2JqZWN0LmVTZXRQcm94eVVSSSh1cmkuYXBwZW5kRnJhZ21lbnQoc3VwZXIuZ2V0VVJJRnJhZ21lbnQoaW50ZXJuYWxFT2JqZWN0KSkpOwotCQlpbnRlcm5hbEVPYmplY3QuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZG9Mb2FkKGphdmEuaW8uSW5wdXRTdHJlYW0sCi0JICogICAgICBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJhc2ljRG9Mb2FkKGlucHV0U3RyZWFtLCBvcHRpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNkb0xvYWQoSW5wdXRTdHJlYW0sIE1hcCl9IGluc3RlYWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNEb0xvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5kb0xvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCXNldEVuY29kaW5nKERFRkFVTFRfRU5DT0RJTkcpOwotCX0KLQotCXByb3RlY3RlZCBYTUxMb2FkIGNyZWF0ZVhNTExvYWQoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSNyZW1vdmVQcmVzZXJ2aW5nSWRzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByZXNlcnZpbmdJZHMoRU9iamVjdCByb290T2JqZWN0KSB7Ci0JCXNldFByZXNlcnZlSURzKHRydWUpOwotCQlnZXRDb250ZW50cygpLnJlbW92ZShyb290T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByZXNlcnZlSURzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJlc2VydmVJRHMoKSB7Ci0JCXJldHVybiBwcmVzZXJ2ZUlEczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJlc2VydmVJRHMKLQkgKiAgICAgICAgICAgIFRoZSBwcmVzZXJ2ZUlEcyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VydmVJRHMoYm9vbGVhbiBwcmVzZXJ2ZUlEcykgewotCQl0aGlzLnByZXNlcnZlSURzID0gcHJlc2VydmVJRHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2RldGFjaGVkSGVscGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRldGFjaGVkSGVscGVyKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAobW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyICE9IG51bGwpIHsKLQkJCWVPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCX0KLQotCQlpZiAodXNlVVVJRHMoKSkgewotCQkJREVUQUNIRURfRU9CSkVDVF9UT19JRF9NQVAucHV0KGVPYmplY3QsIGdldElEKGVPYmplY3QpKTsKLQkJfQotCi0JCWlmICghaXNQcmVzZXJ2ZUlEcygpICYmIGlkVG9FT2JqZWN0TWFwICE9IG51bGwgJiYgZU9iamVjdFRvSURNYXAgIT0gbnVsbCkgewotCQkJaWRUb0VPYmplY3RNYXAucmVtb3ZlKGVPYmplY3RUb0lETWFwLnJlbW92ZShlT2JqZWN0KSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZChNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgICAgIGlmIChpc0xvYWRlZCkgewotICAgICAgICAgICAgYWRhcHRlciA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcih0aGlzKTsKLSAgICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIAotICAgICAgICAgICAgICAgIGFkYXB0ZXIud2FpdEZvclJlc291cmNlVG9Mb2FkKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOwotICAgICAgICAgICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCAmJiAhaXNMb2FkZWQpIAotICAgICAgICAgICAgICAgIGFkZFN5bmNocm9uaXphdGlvbkxvYWRpbmdBZGFwdGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgYWRhcHRlci53YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN1cGVyLmxvYWQob3B0aW9ucyk7Ci0gICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICAgICAgfSBjYXRjaChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgICAgIH0gY2F0Y2goRXJyb3IgZSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQkKLQkgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFN5bmNocm9uaXphdGlvbkxvYWRpbmdBZGFwdGVyKCkgewotICAgICAgICBpZiAoUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpID09IG51bGwpCi0gICAgICAgICAgICBlQWRhcHRlcnMoKS5hZGQoUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBhZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOwotICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGFwdGVyLmZvcmNlUmVsZWFzZSgpOwotICAgICAgICAgICAgZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FzZSAxOiBMT0FEIFJFU09VUkNFIEZST00gRElTSyB0aGlzLmlzTG9hZGVkID09IGZhbHNlIEFORCBpc0xvYWRlZCA9PQotICAgICAqIHRydWUgKHdoaWNoIG1lYW5zIHdlIGVudGVyZWQgdGhlIGxvYWQoKSBtZXRob2QsIGJ1dCBoYXZlIG5vdCBjb21wbGV0ZWQKLSAgICAgKiB0aGUgbG9hZCksIGFuZCB3ZSdyZSBsb2FkaW5nIGZyb20gYSByZXNvdXJjZSBvbiBkaXNrLCB0aGVuIHdlIGFkZCB0aGUKLSAgICAgKiBhZGFwdGVyIENhc2UgMjogUkVTT1VSQ0UgQ1JFQVRJT04gKE5PVCBBIExPQUQpIENhc2UgNDogUkVTT1VSQ0UgQ1JFQVRJT04sCi0gICAgICogVU5MT0FERUQsIE5FVyBDT05URU5UUyAoTk9UIEEgTE9BRCkgUmVzb3VyY2UgaXMgY3JlYXRlZCBidXQgbm90IGZyb20gYQotICAgICAqIHJlc291cmNlIG9uIGRpc2ssIHNvIGNvbnRlbnRzIGlzIG51bGwgQU5EIG5vdCBlbXB0eSwgc28gbm8gYWRhcHRlcjogVEhJUwotICAgICAqIElTIE5PVCBBIExPQUQgQ2FzZSAzOiBSRVNPVVJDRSBIQVMgQkVFTiBVTkxPQURFRCwgQkVJTkcgUkVMT0FERUQgRlJPTQotICAgICAqIERJU0sgQ29udGVudHMgaXMgTk9UIG51bGwsIGJ1dCBpdCBpcyBFbXB0eSBhbmQgdGhlIHJlc291cmNlIGlzIGJlaW5nCi0gICAgICogbG9hZGVkIGZyb20gZGlzay4gV2UgbXVzdCBhZGQgdGhlIGFkYXB0ZXIuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXNvdXJjZUJlaW5nTG9hZGVkKGJvb2xlYW4gaXNMb2FkZWQpIHsKLSAgICAgICAgcmV0dXJuICghdGhpcy5pc0xvYWRlZCAmJiBpc0xvYWRlZCkgJiYgKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMuaXNFbXB0eSgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSNnZXRDb250ZW50cygpCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0IGdldENvbnRlbnRzKCkgewotICAgICAgICB3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNpc0xvYWRlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2FkZWQoKSB7Ci0gICAgICAgIHdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5pc0xvYWRlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCkgewotICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgbG9hZGluZ0FkYXB0ZXIgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcyk7Ci0gICAgICAgIGlmIChsb2FkaW5nQWRhcHRlciAhPSBudWxsKSBsb2FkaW5nQWRhcHRlci53YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKTsKLSAgICB9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlTYXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE3YmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlTYXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbDsKLQotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbCBleHRlbmRzIFhNSVNhdmVJbXBsIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuCi0JICogCi0JICogQHBhcmFtIGhlbHBlcgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbChNYXAgb3B0aW9ucywgWE1MSGVscGVyIGhlbHBlciwgU3RyaW5nIGVuY29kaW5nKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIGhlbHBlciwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVNhdmVJbXBsI2luaXQoWE1MUmVzb3VyY2UsIE1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0aW9ucykgewotCQlzdXBlci5pbml0KHJlc291cmNlLCBvcHRpb25zKTsKLQkJeG1pVHlwZSA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGwjYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKSB7Ci0JCWRvYy5hZGRBdHRyaWJ1dGUoWE1JX1ZFUl9OUywgWE1JUmVzb3VyY2UuVkVSU0lPTl9WQUxVRSk7Ci0JCWRvYy5hZGRBdHRyaWJ1dGUoWE1JX1hNTE5TLCBYTUlSZXNvdXJjZS5YTUlfVVJJKTsKLQkJRVBhY2thZ2VbXSBwYWNrYWdlcyA9IGhlbHBlci5wYWNrYWdlcygpOwotCQlTdHJpbmdCdWZmZXIgeHNpU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCQlpZiAoZGVjbGFyZVNjaGVtYUxvY2F0aW9uKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBwYWNrYWdlc1tpXTsKLQotCQkJCUVPYmplY3Qgcm9vdCA9IEVjb3JlVXRpbC5nZXRSb290Q29udGFpbmVyKGVQYWNrYWdlKTsKLQkJCQlpZiAocm9vdCBpbnN0YW5jZW9mIEVQYWNrYWdlKSB7Ci0JCQkJCUVQYWNrYWdlIHJvb3RFUGFja2FnZSA9IChFUGFja2FnZSkgcm9vdDsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290RVBhY2thZ2UuZVJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQkJCQlTdHJpbmcgcm9vdE5zVVJJID0gcm9vdEVQYWNrYWdlLmdldE5zVVJJKCk7Ci0JCQkJCQlpZiAodXJpID09IG51bGwgPyByb290TnNVUkkgIT0gbnVsbCA6ICF1cmkudG9TdHJpbmcoKS5lcXVhbHMocm9vdE5zVVJJKSkgewotCQkJCQkJCWRlY2xhcmVYU0kgPSB0cnVlOwotCQkJCQkJCWlmICh4c2lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uLmFwcGVuZCgnICcpOwotCQkJCQkJCX0KLQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQocm9vdE5zVVJJKTsKLQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQoJyAnKTsKLQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQoaGVscGVyLmdldEhSRUYocm9vdEVQYWNrYWdlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVjbGFyZVhTSSkgewotCQkJZG9jLmFkZEF0dHJpYnV0ZShYU0lfWE1MTlMsIFhNTFJlc291cmNlLlhTSV9VUkkpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5sZW5ndGg7IGkrKykgewotCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBwYWNrYWdlc1tpXTsKLQkJCS8vTW9kaWZpZWQgZnJvbSBzdXBlcmNsYXNzIC0gZGlzcGF0Y2ggYmFjayB0byBoZWxwZXIgZm9yIGNvbXBhdGliaWxpdHkKLQkJCS8vU3RyaW5nIG5zVVJJID0gZVBhY2thZ2UuZ2V0TnNVUkkoKTsKLQkJCS8vU3RyaW5nIG5zUHJlZml4ID0gZVBhY2thZ2UuZ2V0TnNQcmVmaXgoKTsKLQkJCVN0cmluZ1tdIG5zSW5mbyA9ICgoTWFwcGVkWE1JSGVscGVyKSBoZWxwZXIpLmdldE5TSW5mbyhlUGFja2FnZSk7Ci0JCQlkb2MuYWRkQXR0cmlidXRlTlMoWE1MUmVzb3VyY2UuWE1MX05TLCBuc0luZm9bMF0sIG5zSW5mb1sxXSk7Ci0JCX0KLQotCQlpZiAoeHNpU2NoZW1hTG9jYXRpb24gIT0gbnVsbCkgewotCQkJZG9jLmFkZEF0dHJpYnV0ZShYU0lfU0NIRU1BX0xPQ0FUSU9OLCB4c2lTY2hlbWFMb2NhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVIcmVmKEVPYmplY3QgcmVtb3RlLCBFU3RydWN0dXJhbEZlYXR1cmUgZikgewotCQlTdHJpbmcgbmFtZSA9IGhlbHBlci5nZXRRTmFtZShmKTsKLQkJU3RyaW5nIGhyZWYgPSBoZWxwZXIuZ2V0SFJFRihyZW1vdGUpOwotCQlpZiAoaHJlZiAhPSBudWxsKSB7Ci0JCQlkb2Muc3RhcnRFbGVtZW50KG5hbWUpOwotCQkJRUNsYXNzIGVDbGFzcyA9IHJlbW90ZS5lQ2xhc3MoKTsKLQotCQkJRUNsYXNzIGV4cGVjdGVkVHlwZSA9IChFQ2xhc3MpIGYuZ2V0RVR5cGUoKTsKLQkJCS8vQ2hhbmdlZCBuZXh0IGxpbmUgdG8gYWx3YXlzIHdyaXRlIHR5cGUgaWYgZXhwZWN0ZWRUeXBlCi0JCQkvL2lzIGRpZmZlcmVudCBmcm9tIGVDbGFzcwotCQkJaWYgKGVDbGFzcyAhPSBleHBlY3RlZFR5cGUpIHsKLQkJCQlzYXZlVHlwZUF0dHJpYnV0ZShlQ2xhc3MpOwotCQkJfQotCi0JCQlkb2MuYWRkQXR0cmlidXRlKFhNTFJlc291cmNlLkhSRUYsIGhyZWYpOwotCQkJZG9jLmVuZEVtcHR5RWxlbWVudCgpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2ZjEwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE1LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIG51bGwsIERPTV9BVFRSSUJVVEUpOwotCQl0aGlzLmF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWJjZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlQWRhcHRlcjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnM6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5IElOU1RBTkNFID0gbmV3IERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSgpOwotCi0JcHVibGljIERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2FjY2VwdHMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKFN0cmluZyBkb21OYW1lKSB7Ci0JCXJldHVybiBkb21OYW1lICE9IG51bGwgJiYgZG9tTmFtZS5zdGFydHNXaXRoKFhNTE5TKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2FjY2VwdHMob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdHMoTm90aWZpY2F0aW9uIG5vdGlmKSB7Ci0JCXJldHVybiBub3RpZi5nZXRGZWF0dXJlKCkgPT0gTmFtZXNwYWNlQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkjY3JlYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlKFN0cmluZyBkb21OYW1lKSB7Ci0JCXJldHVybiBuZXcgTmFtZXNwYWNlVHJhbnNsYXRvcihkb21OYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2NyZWF0ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBjcmVhdGUoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIEVPYmplY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgbmFtZXNwYWNlcyA9IE5hbWVzcGFjZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlcygoRU9iamVjdCkgdGFyZ2V0KTsKLQkJaWYgKG5hbWVzcGFjZXMgPT0gbnVsbCB8fCBuYW1lc3BhY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QobmFtZXNwYWNlcy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlc3VsdC5hZGQoY3JlYXRlKChOYW1lc3BhY2UpIG5hbWVzcGFjZXMuZ2V0KGkpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2NyZWF0ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlKE5vdGlmaWNhdGlvbiBub3RpZikgewotCQlOYW1lc3BhY2UgbnMgPSAoTmFtZXNwYWNlKSBub3RpZi5nZXROZXdWYWx1ZSgpOwotCQlyZXR1cm4gY3JlYXRlKG5zKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlKE5hbWVzcGFjZSBucykgewotCQlyZXR1cm4gbmV3IE5hbWVzcGFjZVRyYW5zbGF0b3IoWE1MTlMgKyBucy5nZXRQcmVmaXgoKSk7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVwZW5kZW5jeVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlcGVuZGVuY3lUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDFjNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVwZW5kZW5jeVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRGVwZW5kZW50RmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCQlkZXBlbmRlbmN5RmVhdHVyZSA9IGFEZXBlbmRlbnRGZWF0dXJlOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldENoaWxkKEVPYmplY3QgcGFyZW50KSB7Ci0JCUVPYmplY3QgY2hpbGQgPSBiYXNpY0dldERlcGVuZGVuY3lPYmplY3QocGFyZW50KTsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gY3JlYXRlQ2hpbGQocGFyZW50KTsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCi0JcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlQ2hpbGQoRU9iamVjdCBwYXJlbnQpIHsKLQkJRU9iamVjdCBjaGlsZCA9IGNyZWF0ZUVNRk9iamVjdChkZXBlbmRlbmN5RmVhdHVyZSk7Ci0JCXBhcmVudC5lU2V0KGRlcGVuZGVuY3lGZWF0dXJlLCBjaGlsZCk7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewotCQkvL3JldHVybiBzdXBlci5nZXRNT0ZDaGlsZHJlbihnZXRDaGlsZChtb2ZPYmplY3QpKTsKLQkJcmV0dXJuIHN1cGVyLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TU9GVmFsdWUoZ2V0Q2hpbGQobW9mT2JqZWN0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQkvL3N1cGVyLnNldE1PRlZhbHVlKGdldENoaWxkKGVtZk9iamVjdCksIHZhbHVlKTsKLQkJc3VwZXIuc2V0TU9GVmFsdWUoZ2V0Q2hpbGQoZW1mT2JqZWN0KSwgdmFsdWUsIC0xKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKLQkJc3VwZXIuc2V0TU9GVmFsdWUoZ2V0Q2hpbGQoKEVPYmplY3QpIG93bmVyKSwgdmFsdWUsIG5ld0luZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCXN1cGVyLnJlbW92ZU1PRlZhbHVlKGdldENoaWxkKChFT2JqZWN0KSBvd25lciksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5pc1NldE1PRlZhbHVlKGdldENoaWxkKGVtZk9iamVjdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJc3VwZXIudW5TZXRNT0ZWYWx1ZShnZXRDaGlsZChlbWZPYmplY3QpKTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVwZW5kZW5jeUNoaWxkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmZWF0dXJlRXhpc3RzKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5mZWF0dXJlRXhpc3RzKGdldENoaWxkKGVtZk9iamVjdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyTGlzdChFT2JqZWN0IG1vZk9iamVjdCkgewotCQlzdXBlci5jbGVhckxpc3QoZ2V0Q2hpbGQobW9mT2JqZWN0KSk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4MmVhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIEVNRjJET01BZGFwdGVyIGV4dGVuZHMgQWRhcHRlciB7Ci0KLQotCUNsYXNzIEFEQVBURVJfQ0xBU1MgPSBFTUYyRE9NQWRhcHRlci5jbGFzczsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRE9NIG5vZGUgdGhhdCB0aGUgdGFyZ2V0IG9mIHRoaXMgYWRhcHRlciBtYXBzIHRvLiBJZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgbWFwcyB0bwotCSAqIG1vcmUgdGhhbiBvbmUgRE9NIG5vZGUsIHRoaXMgbm9kZSBpcyB0aGUgdG9wLW1vc3Qgbm9kZS4KLQkgKi8KLQlOb2RlIGdldE5vZGUoKTsKLQotCXZvaWQgc2V0Tm9kZShOb2RlIGFOb2RlKTsKLQotCS8qKgotCSAqIFNldCB0byBmYWxzZSBhbmQgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBvYmplY3Qgd2lsbCBiZQotCSAqIGlnbm9yZWQuCi0JICovCi0JYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQotCS8qKgotCSAqIFNldCB0byBmYWxzZSBhbmQgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBvYmplY3Qgd2lsbCBiZQotCSAqIGlnbm9yZWQuCi0JICovCi0Jdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIERPTSB0cmVlIGZvciB0aGlzIGFkYXB0ZXIgZnJvbSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIE1PRiBPYmplY3QuIFRoaXMgbWV0aG9kCi0JICogdXBkYXRlcyBBTEwgdGhlIERPTSBub2RlcyBmcm9tIGFsbCB0aGUgTU9GIGF0dHJpYnV0ZXMuCi0JICovCi0Jdm9pZCB1cGRhdGVET00oKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIE1PRiBPYmplY3QgZnJvbSB0aGUgRE9NIHRyZWUuIEFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIERPTSB0cmVlIGFyZSB1cGRhdGVkIGludG8KLQkgKiB0aGUgTU9GIG9iamVjdC4KLQkgKi8KLQl2b2lkIHVwZGF0ZU1PRigpOwotCi0JcHVibGljIHZvaWQgdXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCk7Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0ZGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KTsKLQotCUVPYmplY3QgZ2V0RU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgTU9GIG9iamVjdCBpcyBhIHByb3h5LgotCSAqLwotCWJvb2xlYW4gaXNNT0ZQcm94eSgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBET00gYWRhcHRlcnMgZnJvbSB0aGUgbm9kZSBBTkQgYWxsIGl0cyBjaGlsZCBub2RlcywgcmVjdXJzaXZlbHkuCi0JICovCi0Jdm9pZCByZW1vdmVBZGFwdGVycyhOb2RlIG5vZGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01BZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNmE3YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXZpc2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5TdHJpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5UcmFuc2xhdG9yU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBFTUYyRE9NQWRhcHRlckltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEVNRjJET01BZGFwdGVyIHsKLQotCWZpbmFsIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBmRGVidWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGZOb3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBOb2RlIGZOb2RlOwotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgZlRyYW5zbGF0b3I7Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTVJlbmRlcmVyIGZSZW5kZXJlcjsKLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY2hpbGRUcmFuc2xhdG9yczsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzUm9vdCA9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STSA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTUlVOTklORyA9ICJpc1J1bm5pbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGNsYXNzIERlcGVuZGVuY3lBZGFwdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCB7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSAiRU1GMkRPTURlcGVuZGVuY3lBZGFwdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJRU1GMkRPTUFkYXB0ZXJJbXBsLnRoaXMubm90aWZ5Q2hhbmdlZChtc2cpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBLRVkuZXF1YWxzKHR5cGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHJvb3QgYWRhcHRlcnMuCi0JICovCi0JcHVibGljIEVNRjJET01BZGFwdGVySW1wbChUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UsIERvY3VtZW50IGRvY3VtZW50LCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQl0aGlzKChOb3RpZmllcikgcmVzb3VyY2UsIChOb2RlKSBkb2N1bWVudCwgcmVuZGVyZXIsIHRyYW5zbGF0b3IpOwotCQlpc1Jvb3QgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBBZGFwdGVyIGdpdmVuIGFuIEVPYmplY3QgYW5kIGEgbm9kZQotCSAqLwotCXB1YmxpYyBFTUYyRE9NQWRhcHRlckltcGwoTm90aWZpZXIgb2JqZWN0LCBOb2RlIG5vZGUsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRhcmdldChvYmplY3QpOwotCQlmTm9kZSA9IG5vZGU7Ci0JCWZSZW5kZXJlciA9IHJlbmRlcmVyOwotCQlmVHJhbnNsYXRvciA9IHRyYW5zbGF0b3I7Ci0JCWluaXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCWFkZEVNRkFkYXB0ZXIoKTsKLQkJYWRkRE9NQWRhcHRlcigpOwotCQlhZGREZXBlbmRlbmN5QWRhcHRlcklmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZnJvbSBhIERPTSBOb2RlLiBUaGUgRU9iamVjdCB3aWxsIGJlIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXJJbXBsKE5vZGUgbm9kZSwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJZk5vZGUgPSBub2RlOwotCQlmUmVuZGVyZXIgPSByZW5kZXJlcjsKLQkJZlRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOwotCQlzZXRUYXJnZXRGcm9tTm9kZSgpOwotCQlpbml0Q2hpbGRUcmFuc2xhdG9ycygpOwotCQlhZGRFTUZBZGFwdGVyKCk7Ci0JCWFkZERPTUFkYXB0ZXIoKTsKLQkJYWRkRGVwZW5kZW5jeUFkYXB0ZXJJZk5lY2Vzc2FyeSgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVwZW5kZW5jeUFkYXB0ZXJJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKCFmVHJhbnNsYXRvci5pc0RlcGVuZGVuY3lQYXJlbnQoKSkKLQkJCXJldHVybjsKLQkJRU9iamVjdCBjaGlsZCA9IGZUcmFuc2xhdG9yLmJhc2ljR2V0RGVwZW5kZW5jeU9iamVjdChnZXRFT2JqZWN0KCkpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCWFkZERlcGVuZGVuY3lBZGFwdGVyKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2hpbGRUcmFuc2xhdG9ycygpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYm9vbGVhbiBpc1J1bm5pbmcgPSBmYWxzZTsgLy9pcyB0aGUgT1NHSSBwbGF0Zm9ybSBydW5uaW5nID8KLQkJdHJ5IHsKLQkJCS8vIElmIHRoZSBQbGF0Zm9ybSBjbGFzcyBjYW4gYmUgZm91bmQsIHRoZW4gY29udGludWUgdG8gY2hlY2sgaWYgdGhlIE9TR0kgcGxhdGZvcm0gaXMgcnVubmluZwotCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKFBMQVRGT1JNKTsKLQkJCU1ldGhvZCBtID0gY2xhenouZ2V0TWV0aG9kKElTUlVOTklORywgbnVsbCk7Ci0JCQlpc1J1bm5pbmcgPSAoKEJvb2xlYW4pbS5pbnZva2UoY2xhenosIG51bGwpKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCSAgICAgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJIC8vIElnbm9yZSBiZWNhdXNlIHRoaXMgbXVzdCBiZSBpbiBhIG5vbl9PU0dJIGVudmlyb25tZW50Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9CQotCQkvL0NoZWNrIGZvciBleHRlbmRlZCBjaGlsZCB0cmFuc2xhdG9ycyBiZWNhdXNlIHdlIGFyZSBpbiBPU0dJIG1vZGUKLQkJaWYgKGlzUnVubmluZykgewotCQkJVHJhbnNsYXRvcltdIGV4dGVuZGVkQ2hpbGRyZW4gPSBUcmFuc2xhdG9yU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFRyYW5zbGF0b3JzKCk7Ci0JICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkgICAgICAgIAlpZiAoZXh0ZW5kZWRDaGlsZHJlbltpXSAhPSBudWxsKQotCSAgICAgICAgICAgIAljaGlsZHJlbi5hZGQoZXh0ZW5kZWRDaGlsZHJlbltpXSk7Ci0JICAgICAgICB9Ci0JCX0KLQkJCi0JCQotCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChmVHJhbnNsYXRvci5nZXRDaGlsZHJlbihnZXRUYXJnZXQoKSwgZlJlbmRlcmVyLmdldFZlcnNpb25JRCgpKSkpOwotCi0JCVZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZmFjdG9yeSA9IGZUcmFuc2xhdG9yLmdldFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkoKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGRvbU5hbWUgPSBudWxsOwotCQkJTmFtZWROb2RlTWFwIG1hcCA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJaW50IGxlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCU5vZGUgYXR0ck5vZGUgPSBtYXAuaXRlbShpKTsKLQkJCQkJZG9tTmFtZSA9IGF0dHJOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCS8vSGFuZGxlIHZhcmlhYmxlIHRyYW5zbGF0b3JzCi0JCQkJCVRyYW5zbGF0b3IgdCA9IGZUcmFuc2xhdG9yLmZpbmRDaGlsZChkb21OYW1lLCBnZXRUYXJnZXQoKSwgZlJlbmRlcmVyLmdldFZlcnNpb25JRCgpKTsKLQkJCQkJaWYgKHQgIT0gbnVsbCAmJiAhY2hpbGRyZW4uY29udGFpbnModCkpCi0JCQkJCQljaGlsZHJlbi5hZGQodCk7Ci0JCQkJfQotCQkJfQotCQkJTGlzdCBjaGlsZHJlbkZyb21FTUYgPSBmYWN0b3J5LmNyZWF0ZShnZXRUYXJnZXQoKSk7Ci0JCQlpZiAoY2hpbGRyZW5Gcm9tRU1GICE9IG51bGwpCi0JCQkJY2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuRnJvbUVNRik7Ci0JCX0KLQotCQljaGlsZFRyYW5zbGF0b3JzID0gKFRyYW5zbGF0b3JbXSkgY2hpbGRyZW4udG9BcnJheShuZXcgVHJhbnNsYXRvcltjaGlsZHJlbi5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdG8gZmFsc2UgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0Ygb2JqZWN0IHdpbGwgYmUKLQkgKiBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZOb3RpZmljYXRpb25FbmFibGVkOwotCX0KLQotCS8qKgotCSAqIFNldCB0byBmYWxzZSBhbmQgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBvYmplY3Qgd2lsbCBiZQotCSAqIGlnbm9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotCQlmTm90aWZpY2F0aW9uRW5hYmxlZCA9IGlzRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTID09IHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRU1GQWRhcHRlcigpIHsKLQkJdGFyZ2V0LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZChzaG9ydENsYXNzTmFtZSh0aGlzKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlzYi5hcHBlbmQoZ2V0Tm9kZSgpLmdldE5vZGVOYW1lKCkpOwotCQlzYi5hcHBlbmQoJywnKTsKLQkJc2IuYXBwZW5kKHNob3J0Q2xhc3NOYW1lKGdldFRhcmdldCgpKSk7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNob3J0Q2xhc3NOYW1lKE9iamVjdCBvKSB7Ci0JCWlmIChvICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbiA9IG8uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQlpbnQgaSA9IGNuLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlyZXR1cm4gY24uc3Vic3RyaW5nKGkgKyAxLCBjbi5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBQcmludHMgb3V0IGEgTU9GIG5vdGlmaWNhdGlvbiBmb3IgZGVidWdnaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVidWdNT0ZOb3RpZnkoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlTdHJpbmcgbm90aWZUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQkJbm90aWZUeXBlID0gIkFERCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCQkJbm90aWZUeXBlID0gIlJFTU9WRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotCQkJCQlub3RpZlR5cGUgPSAiQUREX01BTlkiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLQkJCQkJbm90aWZUeXBlID0gIlJFTU9WRV9NQU5ZIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQgOiB7Ci0JCQkJCWlmIChtc2cuZ2V0UG9zaXRpb24oKSA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpCi0JCQkJCQlub3RpZlR5cGUgPSAiUkVQTEFDRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxzZQotCQkJCQkJbm90aWZUeXBlID0gIlNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLQkJCQkJbm90aWZUeXBlID0gIlVOU0VUIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiTU9GIENoYW5nZTogIiArIG5vdGlmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bm90aWZpZXIgICAgICA6ICIgKyBtc2cuZ2V0Tm90aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0Y2hhbmdlZEZlYXR1cmU6ICIgKyBtc2cuZ2V0RmVhdHVyZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRvbGRWYWx1ZSAgICAgIDogIiArIG1zZy5nZXRPbGRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRuZXdWYWx1ZSAgICAgIDogIiArIG1zZy5nZXROZXdWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgdGhlIGZlYXR1cmUgbWFwcyBmb3IgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDaGlsZFRyYW5zbGF0b3JzKCkgewotCQlyZXR1cm4gY2hpbGRUcmFuc2xhdG9yczsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBmaW5kVHJhbnNsYXRvcihOb3RpZmljYXRpb24gbm90KSB7Ci0JCWlmIChub3QuZ2V0RmVhdHVyZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hcHNbaV0uaXNNYXBGb3Iobm90LmdldEZlYXR1cmUoKSwgbm90LmdldE9sZFZhbHVlKCksIG5vdC5nZXROZXdWYWx1ZSgpKSkKLQkJCQlyZXR1cm4gbWFwc1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvciBEZXNjcmliZXMgdGhlIG1hcHBpbmcgZnJvbSB0aGUgTU9GCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NIG5vZGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgTGlzdCBtb2ZDaGlsZHJlbiwgTGlzdCBkb21DaGlsZHJlbiwgTm90aWZpZXIgb3duZXIpIHsKLQotCQkvL1VzZWQgZm9yIGluc2VydGluZyBwcmltaXRpdmVzCi0JCUxpc3QgaW5vcmRlckRPTUNoaWxkcmVuID0gbnVsbDsKLQkJaWYgKCFtYXAuaXNPYmplY3RNYXAoKSB8fCBtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCQkJaW5vcmRlckRPTUNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW5vcmRlckRPTUNoaWxkcmVuLmFkZEFsbChkb21DaGlsZHJlbik7Ci0JCX0KLQkJTm9kZSBwYXJlbnQgPSBmaW5kRE9NUGF0aChub2RlLCBtYXAsIGZhbHNlKTsKLQotCQkvLyBHbyB0aG91Z2ggdGhlIE1PRiBjaGlsZHJlbiBjaGVja2luZyB0byBzZWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLQkJLy8gTU9GIEFkYXB0ZXIgY2hpbGRyZW4gZXhpc3RzLiBJZiBub3QsIGNyZWF0ZSB0aGUgYWRhcHRlci4KLQkJLy8gQWxzbyBoYW5kbGVzIHJlb3JkZXJpbmcgY2hpbGRyZW4gdGhhdCBoYXZlIG1vdmVkLgotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBpIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBjaGlsZCA9IG1vZkNoaWxkcmVuLmdldChpKTsKLQkJCUVPYmplY3QgbW9mQ2hpbGQgPSBudWxsOwotCi0JCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQotCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBjaGlsZCBpcyBhIE1PRiBPYmplY3QuCi0JCQlpZiAoIW1hcC5pc01hbmFnZWRCeVBhcmVudCgpICYmIGNoaWxkIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCW1vZkNoaWxkID0gKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChpKTsKLQkJCQlhZGFwdGVyID0gZ2V0RXhpc3RpbmdBZGFwdGVyKG1vZkNoaWxkKTsKLQkJCX0KLQotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBpIDwgZG9tQ2hpbGRyZW4uc2l6ZSgpICYmIGRvbUNoaWxkcmVuLmdldChpKSA9PSBhZGFwdGVyLmdldE5vZGUoKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlpZiAoZG9tQ2hpbGRyZW4uaXNFbXB0eSgpKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBBIG5vZGUgaGFzIGJlZW4gcmVvcmRlcmVkIGluIHRoZSBsaXN0Ci0JCQkJTm9kZSByZW9yZGVyTm9kZSA9IGFkYXB0ZXIuZ2V0Tm9kZSgpOwotCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IHJlb3JkZXJOb2RlOwotCQkJCWlmIChpIDwgZG9tQ2hpbGRyZW4uc2l6ZSgpICYmIGRvbUNoaWxkcmVuLmdldChpKSAhPSByZW9yZGVyTm9kZSkgewotCQkJCQlpbnNlcnRCZWZvcmVOb2RlID0gKE5vZGUpIGRvbUNoaWxkcmVuLmdldChpKTsKLQkJCQl9Ci0JCQkJZG9tQ2hpbGRyZW4ucmVtb3ZlKHJlb3JkZXJOb2RlKTsKLQkJCQlkb21DaGlsZHJlbi5hZGQoaSwgcmVvcmRlck5vZGUpOwotCQkJCWlmIChyZW9yZGVyTm9kZSAhPSBpbnNlcnRCZWZvcmVOb2RlKSB7Ci0JCQkJCXJlb3JkZXJET01DaGlsZChwYXJlbnQsIHJlb3JkZXJOb2RlLCBpbnNlcnRCZWZvcmVOb2RlLCBtYXApOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQSBuZXcgbm9kZSBoYXMgYmVlbiBhZGRlZCwgY3JlYXRlIGl0Ci0JCQkJcGFyZW50ID0gY3JlYXRlRE9NUGF0aChub2RlLCBtYXApOwotCQkJCWlmIChtb2ZDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKG1vZkNoaWxkLCBtYXApOwotCQkJCQlOb2RlIG5ld05vZGUgPSBhZGFwdGVyLmdldE5vZGUoKTsKLQkJCQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gZmluZEluc2VydEJlZm9yZU5vZGUocGFyZW50LCBtYXAsIG1vZkNoaWxkcmVuLCBpLCBkb21DaGlsZHJlbik7Ci0JCQkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQsIG5ld05vZGUsIGluc2VydEJlZm9yZU5vZGUpOwotCQkJCQlkb21DaGlsZHJlbi5hZGQoaSwgbmV3Tm9kZSk7Ci0JCQkJCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGFkYXB0ZXIuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbmRlbnQobmV3Tm9kZSwgbWFwKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJCQkJfQotCQkJCQlhZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFRoZSBtb2YgZmVhdHVyZSBpcyBhIGNvbGxlY3Rpb24gb2YgcHJpbWl0aXZlcy4KLQkJCQkJLy8gY3JlYXRlIGEgbmV3IGRvbSBub2RlIGFuZCBsaXN0ZW4gdG8gaXQuCi0JCQkJCUVsZW1lbnQgbmV3Tm9kZSA9IGNyZWF0ZU5ld05vZGUobnVsbCwgbWFwKTsKLQkJCQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gZmluZEluc2VydEJlZm9yZU5vZGUocGFyZW50LCBtYXAsIG1vZkNoaWxkcmVuLCBpLCBpbm9yZGVyRE9NQ2hpbGRyZW4pOwotCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBuZXdOb2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJCQkJaW5kZW50KG5ld05vZGUsIG1hcCk7Ci0JCQkJCWFkZERPTUFkYXB0ZXIobmV3Tm9kZSk7IC8vIEhvb2sgdXAgbGlzdGVuZXJzCi0JCQkJCWRvbUNoaWxkcmVuLmFkZChpLCBuZXdOb2RlKTsKLQkJCQkJaW5vcmRlckRPTUNoaWxkcmVuLmFkZChuZXdOb2RlKTsKLQkJCQkJVGV4dCBuZXdUZXh0ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShtYXAuY29udmVydFZhbHVlVG9TdHJpbmcoY2hpbGQsIChFT2JqZWN0KSBvd25lcikpOwotCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZShuZXdOb2RlLCBuZXdUZXh0LCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBhZGFwdGVycy4KLQkJZm9yICg7IGkgPCBkb21DaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJcmVtb3ZlRE9NQ2hpbGQocGFyZW50LCAoRWxlbWVudCkgZG9tQ2hpbGRyZW4uZ2V0KGkpKTsKLQkJfQotCi0JCS8vIElmIHRoZXJlIGFyZSBubyBNT0YgY2hpbGRyZW4sIHJlbW92ZSBhbnkgdW5uZWNlc3NhcnkgRE9NIG5vZGUgcGF0aHMKLQkJaWYgKG1vZkNoaWxkcmVuLnNpemUoKSA9PSAwICYmIG1hcC5oYXNET01QYXRoKCkpIHsKLQkJCWlmIChtYXAuc2hvdWxkUmVuZGVyRW1wdHlET01QYXRoKChFT2JqZWN0KSBvd25lcikpCi0JCQkJY3JlYXRlRE9NUGF0aChub2RlLCBtYXApOwotCQkJZWxzZQotCQkJCXJlbW92ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIExpc3QgbW9mQ2hpbGRyZW4sIExpc3QgZG9tQ2hpbHJlbikgewotCi0JCUhhc2h0YWJsZSBub2RlVG9BZGFwdGVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBnZXRFeGlzdGluZ0FkYXB0ZXIoKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChpKSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCW5vZGVUb0FkYXB0ZXIucHV0KGFkYXB0ZXIuZ2V0Tm9kZSgpLCBhZGFwdGVyKTsKLQkJfQotCi0JCS8vIEdvIHRob3VnaCB0aGUgRE9NIGNoaWxkcmVuIGNoZWNraW5nIHRvIHNlZSBpZiB0aGUgY29ycmVzcG9uZGluZwotCQkvLyBNT0YgQWRhcHRlciBjaGlsZHJlbiBleGlzdHMuIElmIG5vdCwgY3JlYXRlIHRoZSBhZGFwdGVyLgotCQkvLyBBbHNvIGhhbmRsZXMgcmVvcmRlcmluZyBjaGlsZHJlbiB0aGF0IGhhdmUgbW92ZWQuCi0JCWludCBpID0gMDsKLQkJaW50IG1vZkluZGV4ID0gMDsKLQkJTGlzdCBhZGFwdGVyc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKDsgaSA8IGRvbUNoaWxyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUVsZW1lbnQgY2hpbGROb2RlID0gKEVsZW1lbnQpIGRvbUNoaWxyZW4uZ2V0KGkpOwotCQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGkgPCBtb2ZDaGlsZHJlbi5zaXplKCkgPyBnZXRFeGlzdGluZ0FkYXB0ZXIoKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChpKSkgOiBudWxsOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiAhYWRhcHRlci5pc01PRlByb3h5KCkgJiYgYWRhcHRlci5nZXROb2RlKCkgPT0gY2hpbGROb2RlKSB7Ci0JCQkJLy8gQmVjYXVzZSB0aGUgYWRhcHRlciBpcyBwcm9jZXNzaW5nIFNUUlVDVFVSRV9DSEFOR0VEIGZyb20gdGhlCi0JCQkJLy8gRE9NLCB3ZQotCQkJCS8vIG11c3QgdXBkYXRlIGFsbCB0aGUgd2F5IGRvd24gdGhlIHRyZWUgc2luY2UgYW55dGhpbmcgdW5kZXIKLQkJCQkvLyB0aGUgbm90aWZ5aW5nCi0JCQkJLy8gRE9NIG5vZGUgY291bGQgaGF2ZSBjaGFuZ2VkLgotCQkJCWFkYXB0ZXIudXBkYXRlTU9GKCk7Ci0JCQkJbW9mSW5kZXgrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgbm9kZVRvQWRhcHRlci5nZXQoY2hpbGROb2RlKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZW9yZGVySWZOZWNlc3NhcnkoKEVMaXN0KSBtb2ZDaGlsZHJlbiwgYWRhcHRlci5nZXRFT2JqZWN0KCksIG1vZkluZGV4KTsKLQkJCQltb2ZJbmRleCsrOwotCQkJfSBlbHNlIHsKLQkJCQlhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihjaGlsZE5vZGUsIG1hcCk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJLy9XZSBkb24ndCB3YW50IHRvIHB1c2ggYW55dGhpbmcgYmFjayB0byB0aGUgY2hpbGQgZG9tCi0JCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCQkJbWFwLnNldE1PRlZhbHVlKGdldFRhcmdldCgpLCBhZGFwdGVyLmdldFRhcmdldCgpLCBtb2ZJbmRleCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCQlhZGFwdGVyc1RvVXBkYXRlLmFkZChhZGFwdGVyKTsKLQkJCQkJbW9mSW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBhZGFwdGVycy4KLQkJLy9tYWtlIGEgY29weSBzbyB3ZSByZW1vdmUgYWxsIGl0ZW1zIC0gYnVnIDE5MjQ2OCAKLQkJCQlPYmplY3RbXSBjaGlsZHJlbkFycmF5ID0gbW9mQ2hpbGRyZW4udG9BcnJheSgpOwotCQkJCWZvciAoOyBpIDwgY2hpbGRyZW5BcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQlyZW1vdmVNT0ZWYWx1ZSgoRU9iamVjdCkgY2hpbGRyZW5BcnJheVtpXSwgbWFwKTsKLQkJIAkJfQotCi0JCS8vIFRoZSBhZGFwdGVycyBjYW5ub3QgYmUgdXBkYXRlZCBhcyB0aGV5IGNyZWF0ZWQuIFdlIG11c3Qgd2FpdCB1bnRpbAotCQkvLyBhbGwgb2YgdGhlIGFkYXB0ZXJzIGFyZSBjcmVhdGVkIGFuZCByZW1vdmVkIGJlZm9yZSB1cGRhdGluZywKLQkJLy8gb3RoZXJ3aXNlCi0JCS8vIHdlIGNhbiBnZXQgaW4gYSBzdGF0ZSB3aGVyZSB0aGVyZSBhcmUgYWRhcHRlcnMgZmlnaHRpbmcgd2l0aAotCQkvLyBlYWNob3RoZXIKLQkJLy8gKG9uZSBmb3IgdGhlIG9sZCBub2RlIGFuZCBvbmUgZm9yIHRoZSBuZXcgbm9kZSkuCi0JCWZvciAoaW50IGogPSAwOyBqIDwgYWRhcHRlcnNUb1VwZGF0ZS5zaXplKCk7IGorKykgewotCQkJKChFTUYyRE9NQWRhcHRlcikgYWRhcHRlcnNUb1VwZGF0ZS5nZXQoaikpLnVwZGF0ZU1PRigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGZlYXR1cmUncyB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRBZGFwdGVyCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkVNRjJET01BZGFwdGVyIFRoZSBjaGlsZCB0byByZW1vdmUKLQkgKiBAcGFyYW0gbW9mQXR0cmlidXRlTmFtZQotCSAqICAgICAgICAgICAgU3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBtb2ZBdHRyaWJ1dGUgdG8gcmVtb3ZlIHRoZSBjaGlsZCBmcm9tLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1PRlZhbHVlKEVPYmplY3QgdmFsdWUsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCi0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIodmFsdWUsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkvLyBSZW1vdmUgdGhlIGFkYXB0ZXIgZnJvbSBCT1RIIHRoZSBNT0YgT2JqZWN0IGFuZCB0aGUgRE9NIE5vZGVzCi0JCQl2YWx1ZS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQlyZW1vdmVBZGFwdGVycyhhZGFwdGVyLmdldE5vZGUoKSk7Ci0JCX0KLQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHRyYW5zbGF0b3IuZ2V0RmVhdHVyZSgpOwotCQlib29sZWFuIGRvVW5sb2FkID0gZmVhdHVyZSA9PSBudWxsIHx8ICh0cmFuc2xhdG9yLmlzT2JqZWN0TWFwKCkgJiYgKChFUmVmZXJlbmNlKSBmZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpOwotCi0JCS8vIHRyYW5zbGF0b3IucmVtb3ZlTU9GVmFsdWUoKSB3YXMgaGVyZSBvcmlnaW5hbGx5Ci0KLQkJLy8gVW5sb2FkIHRoZSBvYmplY3RzLgotCQlpZiAoZG9VbmxvYWQpCi0JCQlFeHRlbmRlZEVjb3JlVXRpbC51bmxvYWQodmFsdWUpOwotCi0JCS8vIFJlbW92ZSB0aGUgTU9GIHZhbHVlCi0JCXRyYW5zbGF0b3IucmVtb3ZlTU9GVmFsdWUoZ2V0VGFyZ2V0KCksIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW9yZGVySWZOZWNlc3NhcnkoRUxpc3QgZW1mQ2hpbGRyZW4sIEVPYmplY3QgZU9iaiwgaW50IGVtZkluZGV4KSB7Ci0JCWludCBjdXJySW5kZXggPSBlbWZDaGlsZHJlbi5pbmRleE9mKGVPYmopOwotCQlpZiAoY3VyckluZGV4ID4gLTEgJiYgY3VyckluZGV4ICE9IGVtZkluZGV4KQotCQkJZW1mQ2hpbGRyZW4ubW92ZShlbWZJbmRleCwgZU9iaik7Ci0JfQotCi0JLyoqCi0JICogZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluZGVudChOb2RlIG5ld05vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kSW5zZXJ0QmVmb3JlTm9kZShOb2RlIHBhcmVudE5vZGUsIFRyYW5zbGF0b3IgbWFwLCBMaXN0IG1vZkxpc3QsIGludCBtb2ZJbngsIExpc3QgZG9tTGlzdCkgewotCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSBudWxsOwotCi0JCS8vIElmIHRoZXJlIGFyZSBubyBjdXJyZW50IGRvbSBjaGlsZHJlbiBmb3IgdGhpcyBtYXAsIGZpbmQgdGhlIGluaXRpYWwKLQkJLy8gaW5zZXJ0IHBvcy4KLQkJaWYgKGRvbUxpc3Quc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gZmluZEluaXRpYWxJbnNlcnRCZWZvcmVOb2RlKHBhcmVudE5vZGUsIG1hcCk7Ci0KLQkJLy8gSWYgc29tZSBkb20gbm9kZXMgdGhlbiBmaW5kIHRoZSBjb3JyZWN0IG9uZSB0byBpbnNlcnQgYmVmb3JlLgotCQlpbnQgaSA9IG1vZklueCArIDE7Ci0JCXdoaWxlIChpIDwgbW9mTGlzdC5zaXplKCkgJiYgaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBTdGFydCBhdCB0aGUgbW9mSW54IHBhc3NlZCBpbiBhbmQgbG9vayBmb3J3YXJkIGZvciB0aGUgZmlyc3QKLQkJCS8vIGFkYXB0ZWQKLQkJCS8vIE1PRiBvYmplY3QuIFVzZSB0aGF0IG5vZGUgYXMgdGhlIGluc2VydCBiZWZvcmUgbm9kZS4KLQkJCU9iamVjdCBvID0gbW9mTGlzdC5nZXQoaSk7Ci0JCQlpZiAoIW1hcC5pc09iamVjdE1hcCgpIHx8IG1hcC5pc01hbmFnZWRCeVBhcmVudCgpKQotCQkJCWJyZWFrOwotCQkJRU9iamVjdCB0TU9GT2JqZWN0ID0gKEVPYmplY3QpIG87Ci0JCQlFTUYyRE9NQWRhcHRlciB0QWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcih0TU9GT2JqZWN0LCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJCWlmICh0QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IHRBZGFwdGVyLmdldE5vZGUoKTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCi0JCS8vIEhhbmRsZSBpbnNlcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotCQlpZiAoaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IERPTVV0aWxpdGllcy5nZXROZXh0Tm9kZVNpYmxpbmcoKE5vZGUpIGRvbUxpc3QuZ2V0KGRvbUxpc3Quc2l6ZSgpIC0gMSkpOwotCQlpZiAoaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlTm9kZSA9ICgoTm9kZSkgZG9tTGlzdC5nZXQoZG9tTGlzdC5zaXplKCkgLSAxKSkuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kSW5pdGlhbEluc2VydEJlZm9yZU5vZGUoTm9kZSBwYXJlbnROb2RlLCBUcmFuc2xhdG9yIG1hcE5vZGUpIHsKLQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0KLQkJLy8gRmlyc3QsIHNraXAgcGFzdCBhbGwgdGhlIG1hcHMgaW4gdGhlIG9yZGVyZWQgY29sbGVjdGlvbgotCQkvLyBvZiBtYXBzLiBXZSB3YW50IHRvIGJlZ2luIHRoZSBzZWFyY2ggd2l0aCB0aGlzIG5vZGUuCi0JCWludCBpID0gMDsKLQkJZm9yICg7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWFwc1tpXSA9PSBtYXBOb2RlKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gTm93IHNlYXJjaCBnbyB0aHJvdWdoIGVhY2ggbWFwIG5vZGUgdW50aWwgYSBjaGlsZCBub2RlIG1hdGNoaW5nCi0JCS8vIGl0cyBET00gbmFtZSBpcyBmb3VuZC4KLQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gbnVsbDsKLQkJZm9yIChpbnQgaiA9IGk7IGogPCBtYXBzLmxlbmd0aCAmJiBpbnNlcnRCZWZvcmVOb2RlID09IG51bGw7IGorKykgewotCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJVHJhbnNsYXRvciBub2RlVG9GaW5kTWFwID0gbWFwc1tqXTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaysrKSB7Ci0JCQkJTm9kZSBub2RlID0gY2hpbGROb2Rlcy5pdGVtKGspOwotCQkJCWlmIChub2RlVG9GaW5kTWFwLmlzTWFwRm9yKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IG5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlTm9kZTsKLQl9Ci0KLQkvKgotCSAqIFRyYXZlcnNlcyB0aGUgcGF0aCB0aGF0IDxtYXA+IHNwZWNpZmllcy4gUmV0dXJucyB0aGUgbGFzdCBub2RlIG9mIHRoZSBwYXRoIHRoYXQgd2FzIGFibGUgdG8KLQkgKiBiZSB0cmF2ZXJzZWQgb3IgbnVsbCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUgdHJhdmVyc2VkLiBUaGUgPGFkZEFkYXB0ZXJzPiBib29sZWFuIGlzIHVzZWQgdG8KLQkgKiBkZXRlcm1pbmUgaWYgdGhlIHJlY2VpdmVyIGlzIGFkZGVkIGFzIGFuIGFkYXB0ZXIgdG8gZXZlcnkgbm9kZSBmb3VuZCBvbiB0aGUgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kRE9NUGF0aChOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXAsIGJvb2xlYW4gYWRkQWRhcHRlcnMpIHsKLQotCQlTdHJpbmcgcGF0aCA9IG1hcC5nZXRET01QYXRoKCk7Ci0JCU5vZGUgY3VyTm9kZSA9IHBhcmVudDsKLQkJSXRlcmF0b3IgaXRlciA9IERPTVV0aWxpdGllcy5jcmVhdGVQYXRoSXRlcmF0b3IocGF0aCk7Ci0KLQkJd2hpbGUgKGN1ck5vZGUgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIG5vZGVOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQljdXJOb2RlID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChjdXJOb2RlLCBub2RlTmFtZSk7Ci0JCQlpZiAoYWRkQWRhcHRlcnMgJiYgY3VyTm9kZSAhPSBudWxsKSB7Ci0JCQkJYWRkRE9NQWRhcHRlcihjdXJOb2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3VyTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgRE9NIG5vZGUgY2hpbGRyZW4gdGhhdCBjdXJyZW50bHkgZXhpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZ25hbWUuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RE9NQ2hpbGRyZW4oTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlOb2RlIHBhcmVudCA9IGZpbmRET01QYXRoKG5vZGUsIG1hcCwgdHJ1ZSk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkcmVuKHBhcmVudCwgbWFwLmdldERPTU5hbWVzKCkpOwotCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyZWZPYmplY3QsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNNT0ZQcm94eSgpKSB7Ci0JCQlyZWZPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJcmVtb3ZlRE9NQWRhcHRlcihhZGFwdGVyLmdldE5vZGUoKSwgYWRhcHRlcik7Ci0JCQlhZGFwdGVyID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltQWRkRE9NQWRhcHRlcihOb2RlIGFOb2RlLCBFTUYyRE9NQWRhcHRlciBhbkFkYXB0ZXIpIHsKLQkJZlJlbmRlcmVyLnJlZ2lzdGVyRE9NQWRhcHRlcihhTm9kZSwgYW5BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlKSB7Ci0JCXJldHVybiBmUmVuZGVyZXIuZ2V0RXhpc3RpbmdET01BZGFwdGVyKGFOb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQlmUmVuZGVyZXIucmVtb3ZlRE9NQWRhcHRlcihhTm9kZSwgYW5BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRET01BZGFwdGVyKE5vZGUgY2hpbGROb2RlKSB7Ci0KLQkJLy8gT25seSBhZGQgdGhlIGFkYXB0ZXIgaWYgdGhpcyBpcyBhbiBjaGlsZCBub2RlIHRoYXQgd2lsbCBub3QgYmUKLQkJLy8gYWRhcHRlZC4gRm9yIGluc3RhbmNlIGEgc3VidHJlZSB0aGF0IG1hcHMgdG8gYSBNT0YgYXR0cmlidXRlCi0JCS8vIHNldHRpbmcuCi0JCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRU1GMkRPTUFkYXB0ZXIgYXR0ckFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKGNoaWxkTm9kZSk7Ci0KLQkJCWlmIChhdHRyQWRhcHRlciA9PSBudWxsIHx8IGF0dHJBZGFwdGVyLmdldE5vZGUoKSAhPSBnZXROb2RlKCkpIHsKLQkJCQkvLyBJZiB0aGUgbm9kZSBpcyBhZGFwdGVkLCBidXQgbm90IGJ5IHRoaXMgYWRhcHRlciB0aGVuIHJlbW92ZQotCQkJCS8vIGl0LiBUaGlzIGhhcHBlbnMgdG8gbm9uLW9iamVjdCBjaGlsZHJlbiB3aGVuIHRoZSBwYXJlbnQgdGFnCi0JCQkJLy8gbmFtZSBpcyBjaGFuZ2VkLgotCQkJCXJlbW92ZURPTUFkYXB0ZXIoY2hpbGROb2RlLCBhdHRyQWRhcHRlcik7Ci0KLQkJCQlpZiAoZkRlYnVnKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0Q0hJTEQ6IEFkZGluZyBET00gYWRhcHRlcjogIiArIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0XHR0bzogIiArIGNoaWxkTm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcHJpbUFkZERPTUFkYXB0ZXIoY2hpbGROb2RlLCB0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlb3JkZXIgYSBjaGlsZCBiZWZvcmUgYSBnaXZlbiBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVvcmRlckRPTUNoaWxkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZE5vZGUsIE5vZGUgaW5zZXJ0QmVmb3JlTm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJdHJ5IHsKLQkJCXJlbW92ZURPTUNoaWxkKHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgZmFsc2UpOwotCQkJcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld2xpbmVTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBET01VdGlsaXRpZXMuTkVXTElORV9TVFJJTkc7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmltR2V0SW5kZW50U3RyaW5nKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gRE9NVXRpbGl0aWVzLmdldEluZGVudFN0cmluZyhub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBjaGlsZCBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkTm9kZSkgewotCQlyZW1vdmVET01DaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGNoaWxkIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01DaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGROb2RlLCBib29sZWFuIHJlbW92ZUFkYXB0ZXIpIHsKLQkJdHJ5IHsKLQkJCWlmIChjaGlsZE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkvLyBMb29rIGZvciBhbnkgd2hpdGVzcGFjZSBwcmVjZWVkaW5nIHRoZSBub2RlIGJlaW5nCi0JCQkvLyByZW1vdmVkIGFuZCByZW1vdmUgaXQgYXMgd2VsbC4KLQkJCVRleHQgcHJldlRleHQgPSBET01VdGlsaXRpZXMuZ2V0UHJldmlvdXNUZXh0U2libGluZyhjaGlsZE5vZGUpOwotCQkJaWYgKHByZXZUZXh0ICE9IG51bGwgJiYgRE9NVXRpbGl0aWVzLmlzV2hpdGVzcGFjZShwcmV2VGV4dCkpIHsKLQkJCQlwYXJlbnROb2RlLnJlbW92ZUNoaWxkKHByZXZUZXh0KTsKLQkJCX0KLQkJCS8vIFJlbW92ZSB0aGUgbm9kZS4KLQkJCWlmIChyZW1vdmVBZGFwdGVyKQotCQkJCXJlbW92ZUFkYXB0ZXJzKGNoaWxkTm9kZSk7Ci0JCQlwYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkTm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgRE9NIGFkYXB0ZXJzIGZyb20gdGhlIG5vZGUgQU5EIGFsbCBpdHMgY2hpbGQgbm9kZXMsIHJlY3Vyc2l2ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFkYXB0ZXJzKE5vZGUgbm9kZSkgewotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlcihub2RlKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJLy8gUmVtb3ZlIHRoZSBhZGFwdGVyIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0YgT2JqZWN0LgotCQkJcmVtb3ZlRE9NQWRhcHRlcihub2RlLCBhZGFwdGVyKTsKLQkJCWlmIChhZGFwdGVyLmdldE5vZGUoKSA9PSBub2RlKSB7Ci0JCQkJTm90aWZpZXIgbG9jYWxUYXJnZXQgPSBhZGFwdGVyLmdldFRhcmdldCgpOwotCQkJCWlmIChsb2NhbFRhcmdldCAhPSBudWxsKQotCQkJCQlsb2NhbFRhcmdldC5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQotCQlOb2RlTGlzdCBubCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IG5sLml0ZW0oaSk7Ci0JCQlyZW1vdmVBZGFwdGVycyhuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IDxtYXA+dW5kZXIgPG5vZGU+LiBPbmx5IHRoZSBwb3J0aW9uIG9mIHRoZSBwYXRoIHRoYXQgZG9lcyBub3QKLQkgKiBleGlzdCAoaWYgYW55KSBpcyBjcmVhdGVkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLlRyYW5zbGF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBjcmVhdGVET01QYXRoKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJSXRlcmF0b3IgaSA9IERPTVV0aWxpdGllcy5jcmVhdGVQYXRoSXRlcmF0b3IobWFwLmdldERPTVBhdGgoKSk7Ci0JCU5vZGUgY3VyTm9kZSA9IG5vZGU7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJU3RyaW5nIG5vZGVOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQljdXJOb2RlID0gZmluZE9yQ3JlYXRlTm9kZShub2RlLCBtYXAsIG5vZGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gY3VyTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBmaW5kT3JDcmVhdGVOb2RlKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCwgU3RyaW5nIHNlZ21lbnQpIHsKLQkJTm9kZSBub2RlID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChwYXJlbnQsIHNlZ21lbnQpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBUaGUgbm9kZSBkaWQgbm90IGFscmVhZHkgZXhpc3QsIGNyZWF0ZSBpdC4KLQkJCURvY3VtZW50IGRvYyA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlub2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoc2VnbWVudCk7Ci0JCQlpZiAobWFwLmlzRW1wdHlUYWcoKSkKLQkJCQlzZXRFbXB0eVRhZygoRWxlbWVudCkgbm9kZSk7Ci0KLQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbml0aWFsSW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG1hcCk7Ci0JCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBub2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJCWluZGVudChub2RlLCBtYXApOwotCQkJYWRkRE9NQWRhcHRlcihub2RlKTsgLy8gSG9vayB1cCBsaXN0ZW5lcnMKLQkJfQotCQlyZXR1cm4gKEVsZW1lbnQpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBub2RlIHBhc3NlZCBpbiBpZiBpdCBoYXMgb25seSB3aGl0ZXNwYWNlIG5vZGVzIGFzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJZkVtcHR5KE5vZGUgbm9kZSkgewotCQlOb2RlTGlzdCBubCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCi0JCS8vIFJ1biB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgY2hpbGRyZW4uIElmIGEgbm9uLXdoaXRlc3BhY2Ugbm9kZQotCQkvLyBwaXMgZm91bmQsIGJhaWwuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBubC5pdGVtKGkpOwotCQkJaWYgKCFET01VdGlsaXRpZXMuaXNXaGl0ZXNwYWNlKGNoaWxkTm9kZSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gV2Ugb25seSBnZXQgaGVyZSBpZiB0aGVyZSBhcmUgbm8gbm9uLXdoaXRlc3BhY2UgY2hhcnMsIHNvCi0JCS8vIHNpbXBseSByZW1vdmUgdGhlIG5vZGUuCi0JCXJlbW92ZURPTUNoaWxkKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIERPTSBwYXRoIHNwZWNpZmllZCBieSA8bWFwPmZyb20gPG5vZGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NUGF0aChOb2RlIG5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCU5vZGUgY2hpbGROb2RlID0gZmluZERPTVBhdGgobm9kZSwgbWFwLCBmYWxzZSk7Ci0JCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCAmJiBjaGlsZE5vZGUgIT0gbm9kZSkgewotCQkJcmVtb3ZlSWZFbXB0eShjaGlsZE5vZGUpOwotCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhZGFwdGVyIGZvciBhIGNoaWxkIERPTSBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIGZvci4KLQkgKi8KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQkvLwlBc3NlcnQuaXNOb3ROdWxsKGNoaWxkTWFwLmdldENoaWxkQWRhcHRlckNsYXNzKCkpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG1vZk9iamVjdCk7Ci0KLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIobW9mT2JqZWN0LmVBZGFwdGVycygpLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNNT0ZQcm94eSgpKSB7Ci0JCQltb2ZPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJcmVtb3ZlQWRhcHRlcnMoYWRhcHRlci5nZXROb2RlKCkpOwotCQkJYWRhcHRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCWFkYXB0ZXIgPSBwcmltQ3JlYXRlQWRhcHRlcihtb2ZPYmplY3QsIGNoaWxkTWFwKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCi0JCUVsZW1lbnQgbmV3Tm9kZSA9IGNyZWF0ZU5ld05vZGUobW9mT2JqZWN0LCBjaGlsZE1hcCk7Ci0JCXJldHVybiBuZXcgRU1GMkRPTUFkYXB0ZXJJbXBsKG1vZk9iamVjdCwgbmV3Tm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihOb2RlIG5vZGUsIFRyYW5zbGF0b3IgY2hpbGRNYXApIHsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NQWRhcHRlckltcGwobm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCi0JCS8vQXNzZXJ0LmlzTm90TnVsbChjaGlsZE1hcC5nZXRDaGlsZEFkYXB0ZXJDbGFzcygpKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlcihub2RlKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc01PRlByb3h5KCkgfHwgYWRhcHRlci5nZXRUYXJnZXQoKSA9PSBudWxsKSB7Ci0JCQkJcmVtb3ZlRE9NQWRhcHRlcihub2RlLCBhZGFwdGVyKTsKLQkJCQlpZiAoYWRhcHRlci5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJCX0KLQkJCQlhZGFwdGVyID0gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXIgPSBwcmltQ3JlYXRlQWRhcHRlcihub2RlLCBjaGlsZE1hcCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlTmV3Tm9kZShFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQlOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCURvY3VtZW50IGRvYyA9IChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0KLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoY2hpbGRNYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpKTsKLQkJaWYgKGNoaWxkTWFwLmlzRW1wdHlUYWcoKSkKLQkJCXNldEVtcHR5VGFnKGVsZW1lbnQpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVtcHR5VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlSZXZpc2l0LnRvRG8oKTsKLQkJLy9OZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaXMgd2l0aCBwdXJlIERPTSBhcGlzLCBpZiBpdCBpcwotCQkvLyBwb3NzaWJsZQotCX0KLQotCS8qCi0JICogUmV0dXJuIHRydWUgaWYgTU9GIG9iamVjdCBpcyBhIHByb3h5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTU9GUHJveHkoKSB7Ci0JCWlmIChpc1Jvb3QgfHwgdGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEludGVybmFsRU9iamVjdCkgdGFyZ2V0KS5lSXNQcm94eSgpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoKSB7Ci0JCWlmIChpc1Jvb3QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBET00gbm9kZSB0aGF0IHRoZSB0YXJnZXQgb2YgdGhpcyBhZGFwdGVyIG1hcHMgdG8uIElmIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBtYXBzIHRvCi0JICogbW9yZSB0aGFuIG9uZSBET00gbm9kZSwgdGhpcyBub2RlIGlzIHRoZSB0b3AtbW9zdCBub2RlLgotCSAqLwotCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBmTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgYU5vZGUpIHsKLQkJZk5vZGUgPSBhTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVET00oKSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCXByaW1VcGRhdGVET00oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0YoKSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCXByaW1VcGRhdGVNT0YoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NKCkgewotCQlpZiAoaXNSb290KQotCQkJdXBkYXRlRE9NUm9vdEZlYXR1cmUoKTsKLQkJZWxzZSB7Ci0JCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkVHJhbnNsYXRvcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJCXVwZGF0ZURPTUZlYXR1cmUobWFwc1tpXSwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbVVwZGF0ZU1PRigpIHsKLQkJaWYgKGlzUm9vdCkKLQkJCXVwZGF0ZU1PRlJvb3RGZWF0dXJlKCk7Ci0JCWVsc2UgewotCQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyBpKyspIHsKLQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcHNbaV0sIGdldE5vZGUoKSwgZ2V0RU9iamVjdCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTVJvb3RGZWF0dXJlKCkgewotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShmVHJhbnNsYXRvciwgZk5vZGUsIGdldFJlc291cmNlQ29udGVudHMoKSwgZ2V0RE9NQ2hpbGRyZW4oZk5vZGUsIGZUcmFuc2xhdG9yKSwgbnVsbCk7Ci0JCQl1cGRhdGVET01Eb2N1bWVudFR5cGUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZSb290RmVhdHVyZSgpIHsKLQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXVwZGF0ZU1PRkRvY3VtZW50VHlwZSgpOwotCQkJcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShmVHJhbnNsYXRvciwgZk5vZGUsIGdldFJlc291cmNlQ29udGVudHMoKSwgZ2V0RE9NQ2hpbGRyZW4oZk5vZGUsIGZUcmFuc2xhdG9yKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKSB7Ci0JCXJldHVybiAoKERvY3VtZW50KSBmTm9kZSkuZ2V0RG9jdHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoVHJhbnNsYXRvclJlc291cmNlKSBnZXRUYXJnZXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRUxpc3QgZ2V0UmVzb3VyY2VDb250ZW50cygpIHsKLQkJaWYgKCFpc1Jvb3QpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCXJldHVybiAoKFJlc291cmNlKSBnZXRUYXJnZXQoKSkuZ2V0Q29udGVudHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01Eb2N1bWVudFR5cGUoKSB7Ci0KLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbCwgc3lzdGVtSWQgPSBudWxsLCBvbGRQdWJsaWNJZCwgb2xkU3lzdGVtSWQ7Ci0JCW9sZFB1YmxpY0lkID0gZG9jVHlwZSA9PSBudWxsID8gbnVsbCA6IGRvY1R5cGUuZ2V0UHVibGljSWQoKTsKLQkJb2xkU3lzdGVtSWQgPSBkb2NUeXBlID09IG51bGwgPyBudWxsIDogZG9jVHlwZS5nZXRTeXN0ZW1JZCgpOwotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcHVibGljSWQgPSByZXNvdXJjZS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSByZXNvdXJjZS5nZXRTeXN0ZW1JZCgpOwotCQl9Ci0JCWlmICghKFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHB1YmxpY0lkLCBvbGRQdWJsaWNJZCkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoc3lzdGVtSWQsIG9sZFN5c3RlbUlkKSkpCi0JCQlmUmVuZGVyZXIucmVwbGFjZURvY3VtZW50VHlwZShyZXNvdXJjZS5nZXREb2N0eXBlKCksIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NRG9jdW1lbnRUeXBlKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gVHJhbnNsYXRvclJlc291cmNlLkRPQ19UWVBFX0ZFQVRVUkUpCi0JCQl1cGRhdGVET01Eb2N1bWVudFR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZEb2N1bWVudFR5cGUoKSB7Ci0KLQkJVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbCwgc3lzdGVtSWQgPSBudWxsOwotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCi0JCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCXB1YmxpY0lkID0gZG9jVHlwZS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSBkb2NUeXBlLmdldFN5c3RlbUlkKCk7Ci0JCX0KLQkJaWYgKCghKFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHB1YmxpY0lkLCByZXNvdXJjZS5nZXRQdWJsaWNJZCgpKSAmJiBTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChzeXN0ZW1JZCwgcmVzb3VyY2UuZ2V0U3lzdGVtSWQoKSkpKSB8fCAKLQkJCQkoKHJlc291cmNlLmdldFB1YmxpY0lkKCkgPT0gbnVsbCkgfHwgcmVzb3VyY2UuZ2V0U3lzdGVtSWQoKSA9PSBudWxsKSkKLQkJCXJlc291cmNlLnNldERvY3R5cGVWYWx1ZXMocHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQotCQlpZiAoaXNSb290KSB7Ci0JCQlub3RpZnlDaGFuZ2VkRm9yUm9vdChtc2cpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChpc0RlcGVuZGVuY3lGZWF0dXJlKG1zZykpCi0JCQloYW5kbGVEZXBlbmRlbmN5RmVhdHVyZShtc2cpOwotCi0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJZGVidWdNT0ZOb3RpZnkobXNnKTsKLQotCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uVU5TRVQgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRSA6Ci0JCQkJVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gZmluZFRyYW5zbGF0b3IobXNnKTsKLQkJCQlpZiAodHJhbnNsYXRvciA9PSBudWxsKQotCQkJCQl0cmFuc2xhdG9yID0gYWRkVmFyaWFibGVUcmFuc2xhdG9ySWZOZWNlc3NhcnkobXNnKTsKLQkJCQlpZiAodHJhbnNsYXRvciAhPSBudWxsKQotCQkJCQl1cGRhdGVET01GZWF0dXJlKHRyYW5zbGF0b3IsIGdldE5vZGUoKSwgZ2V0RU9iamVjdCgpKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUNoYW5nZWRGb3JSb290KE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQotCQlkZWJ1Z01PRk5vdGlmeShtc2cpOwotCi0JCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLQkJCQlwcmltVXBkYXRlRE9NKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQgOgotCQkJCXVwZGF0ZURPTURvY3VtZW50VHlwZShtc2cpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFdG9vbHNDb3B5U2Vzc2lvbi5SRVNPVVJDRV9DT1BJRUQgOgotCQkJCXVwZGF0ZURPTSgpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVwZW5kZW5jeUFkYXB0ZXIoRU9iamVjdCBjaGlsZCkgewotCQlBZGFwdGVyIGV4aXN0aW5nID0gRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihjaGlsZCwgRGVwZW5kZW5jeUFkYXB0ZXIuS0VZKTsKLQkJaWYgKGV4aXN0aW5nICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCURlcGVuZGVuY3lBZGFwdGVyIGZvcndhcmRlciA9IG5ldyBEZXBlbmRlbmN5QWRhcHRlcigpOwotCQljaGlsZC5lQWRhcHRlcnMoKS5hZGQoZm9yd2FyZGVyKTsKLQkJZm9yd2FyZGVyLnNldFRhcmdldChjaGlsZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRE9NQWRhcHRlcigpIHsKLQotCQlwcmltQWRkRE9NQWRhcHRlcihmTm9kZSwgdGhpcyk7Ci0JCWlmIChmRGVidWcpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkFkZGluZyBET00gYWRhcHRlcjogIiArIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdHRvOiAiICsgZk5vZGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBHbyB0aHJvdWdoIHRoZSBtYXBzLiBBbGwgb2YgdGhlIERPTSBub2RlcyB0aGF0IGFyZSBub3QgbGlzdGVuZWQKLQkJLy8gdG8gYnkgYW5vdGhlciBET00gTm9kZSBhZGFwdGVyLCBtdXN0IGJlIGxpc3RlbmVkIHRvIGJ5IHRoaXMgYWRhcHRlci4KLQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IGZOb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gY2hpbGROb2Rlcy5pdGVtKGopOwotCQkJaW50IG5vZGVUeXBlID0gY2hpbGROb2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAoIURPTVV0aWxpdGllcy5pc1RleHROb2RlKGNoaWxkTm9kZSkgJiYgbm9kZVR5cGUgIT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQlUcmFuc2xhdG9yIG1hcCA9IGZpbmRUcmFuc2xhdG9yKGNoaWxkTm9kZS5nZXROb2RlTmFtZSgpLCBmYWxzZSk7Ci0JCQkJaWYgKG1hcCAhPSBudWxsICYmIG1hcC5pc01hbmFnZWRCeVBhcmVudCgpKQotCQkJCQlhZGRET01BZGFwdGVyKGNoaWxkTm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBhZGRWYXJpYWJsZVRyYW5zbGF0b3JJZk5lY2Vzc2FyeShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZmFjdCA9IGZUcmFuc2xhdG9yLmdldFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkoKTsKLQkJVHJhbnNsYXRvciB0cmFucyA9IG51bGw7Ci0JCWlmIChmYWN0ICE9IG51bGwgJiYgZmFjdC5hY2NlcHRzKG1zZykpIHsKLQkJCXRyYW5zID0gZmFjdC5jcmVhdGUobXNnKTsKLQkJCWlmICh0cmFucyAhPSBudWxsKQotCQkJCWNoaWxkVHJhbnNsYXRvcnMgPSAoVHJhbnNsYXRvcltdKSBUcmFuc2xhdG9yLmNvbmNhdChjaGlsZFRyYW5zbGF0b3JzLCB0cmFucyk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHROb2RlKERvY3VtZW50IGRvYywgVHJhbnNsYXRvciBtYXAsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBub25udWxsdGV4dCA9ICh0ZXh0ICE9IG51bGwpID8gdGV4dCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBtYXAuaXNDREFUQUNvbnRlbnQoKSA/IGRvYy5jcmVhdGVDREFUQVNlY3Rpb24obm9ubnVsbHRleHQpIDogZG9jLmNyZWF0ZVRleHROb2RlKG5vbm51bGx0ZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RSZWFkQWhlYWROYW1lKCkgewotCQlpZiAoIWZUcmFuc2xhdG9yLmhhc1JlYWRBaGVhZE5hbWVzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlYWRBaGVhZE5hbWUgPSBudWxsOwotCi0JCVJlYWRBaGVhZEhlbHBlciBoZWxwZXIgPSBmVHJhbnNsYXRvci5nZXRSZWFkQWhlYWRIZWxwZXIoZk5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCWlmIChoZWxwZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgY2hpbGQgPSBudWxsOwotCQlTdHJpbmdbXSBuYW1lcyA9IGhlbHBlci5nZXRWYWx1ZXMoKTsKLQkJaWYgKGhlbHBlci5nZXRDaGlsZERPTU5hbWUoKSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY2hpbGQgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKGZOb2RlLCBuYW1lc1tpXSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJcmVhZEFoZWFkTmFtZSA9IG5hbWVzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZCA9IERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGQoZk5vZGUsIGhlbHBlci5nZXRDaGlsZERPTU5hbWUoKSk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQlyZWFkQWhlYWROYW1lID0gRE9NVXRpbGl0aWVzLmdldENoaWxkVGV4dChjaGlsZCk7Ci0JCX0KLQkJaWYgKHJlYWRBaGVhZE5hbWUgPT0gbnVsbCkKLQkJCXJlYWRBaGVhZE5hbWUgPSBuYW1lc1swXTsKLQkJcmV0dXJuIHJlYWRBaGVhZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIHRleHQgZnJvbSA8bm9kZT5hbmQgY29udmVydHMgaXQgdG8gYW4gb2JqZWN0IHN1aXRhYmxlIGZvciBzZXR0aW5nIGludG8gPGZlYXR1cmU+Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBleHRyYWN0VmFsdWUoTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCwgRU9iamVjdCBlbWZPYmplY3QpIHsKLQotCQkvLyBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSB0ZXh0IGNoaWxkCi0JCU5vZGUgdGV4dE5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Q2hpbGRUZXh0Tm9kZShub2RlKTsKLQkJU3RyaW5nIHRyaW1tZWRWYWx1ZSA9IG51bGw7Ci0JCWlmICh0ZXh0Tm9kZSAhPSBudWxsKQotCQkJdHJpbW1lZFZhbHVlID0gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWFwLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHRyaW1tZWRWYWx1ZSwgZW1mT2JqZWN0KTsKLQkJfSBjYXRjaCAoRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleCkgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQloYW5kbGVGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCXRocm93IGV4OwotCi0JfQotCi0JLyoKLQkgKiBGaW5kcyB0aGUgY2hpbGQgbm9kZSB0aGF0IDxtYXA+IHNwZWNpZmllcy4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjaGlsZCB0aGF0IHNhdGlzZmllcwotCSAqIDxtYXA+IHRoZW4gdGhlIGZpcnN0IG9uZSBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCB0cmF2ZXJzZXMgcGFzdCB0aGUgZG9tUGF0aCBpZiBvbmUgaXMgc3BlY2lmaWVkIGluIHRoZSA8bWFwPi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kRE9NTm9kZShOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXApIHsKLQkJcmV0dXJuIGZpbmRET01Ob2RlKHBhcmVudCwgbWFwLCBmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiBGaW5kcyB0aGUgY2hpbGQgbm9kZSB0aGF0IDxtYXA+IHNwZWNpZmllcy4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjaGlsZCB0aGF0IHNhdGlzZmllcwotCSAqIDxtYXA+IHRoZW4gdGhlIGZpcnN0IG9uZSBpcyByZXR1cm5lZC4gVGhlIDxhZGRBZGFwdGVycz4gYm9vbGVhbiBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUKLQkgKiByZWNlaXZlciBpcyBhZGRlZCBhcyBhbiBhZGFwdGVyIHRvIGV2ZXJ5IG5vZGUgZm91bmQgb24gdGhlIHBhdGguCi0JICogCi0JICogVGhpcyBtZXRob2QgdHJhdmVyc2VzIHBhc3QgdGhlIGRvbVBhdGggaWYgb25lIGlzIHNwZWNpZmllZCBpbiB0aGUgPG1hcD4uCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZmluZERPTU5vZGUoTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwLCBib29sZWFuIGFkZEFkYXB0ZXJzKSB7Ci0KLQkJLy8gRmlyc3QsIHRyYWNlIGRvd24gdGhlIHBhdGgKLQkJTm9kZSBjdXJOb2RlID0gZmluZERPTVBhdGgocGFyZW50LCBtYXAsIGFkZEFkYXB0ZXJzKTsKLQkJaWYgKG1hcC5pc0RPTVRleHRWYWx1ZSgpIHx8IG1hcC5pc0RPTUF0dHJpYnV0ZSgpIHx8IGN1ck5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBjdXJOb2RlOwotCi0JCS8vIE5vdyBsb29rIGZvciB0aGUgZmlyc3QgRE9NIG5hbWUgd2UgY2FuIGZpbmQKLQkJU3RyaW5nW10gZG9tTmFtZXMgPSBtYXAuZ2V0RE9NTmFtZXMoKTsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkb21OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5vZGVOYW1lID0gZG9tTmFtZXNbaV07Ci0JCQlMaXN0IG5vZGVzID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZHJlbihjdXJOb2RlLCBub2RlTmFtZSk7Ci0JCQlpZiAobm9kZXMgIT0gbnVsbCAmJiAhbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKG5vZGVzLnNpemUoKSA+IDEpCi0JCQkJCWhhbmRsZUludmFsaWRNdWx0aU5vZGVzKG5vZGVOYW1lKTsKLQkJCQlub2RlID0gKE5vZGUpIG5vZGVzLmdldCgwKTsKLQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChhZGRBZGFwdGVycyAmJiAobWFwICE9IG51bGwgfHwgbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpKQotCQkJCQkJYWRkRE9NQWRhcHRlcihjdXJOb2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUludmFsaWRNdWx0aU5vZGVzKFN0cmluZyBub2RlTmFtZSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5FTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMCwgbmV3IE9iamVjdFtde25vZGVOYW1lfSkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IDxtYXA+dW5kZXIgPG5vZGU+LiBPbmx5IHRoZSBwb3J0aW9uIG9mIHRoZSBwYXRoIHRoYXQgZG9lcyBub3QKLQkgKiBleGlzdCAoaWYgYW55KSBpcyBjcmVhdGVkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLlRyYW5zbGF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dCBmaW5kT3JDcmVhdGVUZXh0Tm9kZShOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXAsIFN0cmluZyB0ZXh0KSB7Ci0JCVRleHQgdGV4dE5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Q2hpbGRUZXh0Tm9kZShwYXJlbnQpOwotCQlpZiAodGV4dE5vZGUgIT0gbnVsbCkgewotCQkJdGV4dE5vZGUuc2V0RGF0YSh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCWlmICghaXNFbXB0eVRhZygoRWxlbWVudCkgcGFyZW50KSkgewotCQkJCVRleHQgbmV3Tm9kZSA9IGNyZWF0ZVRleHROb2RlKHBhcmVudC5nZXRPd25lckRvY3VtZW50KCksIG1hcCwgdGV4dCk7Ci0JCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGUocGFyZW50LCBuZXdOb2RlLCBudWxsKTsKLQkJCQlyZXR1cm4gbmV3Tm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dE5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgZmluZFRyYW5zbGF0b3IoU3RyaW5nIHRhZ05hbWUsIGJvb2xlYW4gYXR0cmlidXRlTWFwKSB7Ci0JCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyBpKyspIHsKLQkJCVRyYW5zbGF0b3IgbWFwID0gbWFwc1tpXTsKLQkJCWlmIChtYXAuaXNNYXBGb3IodGFnTmFtZSkgJiYgYXR0cmlidXRlTWFwID09IG1hcC5pc0RPTUF0dHJpYnV0ZSgpKQotCQkJCXJldHVybiBtYXBzW2ldOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlKSB7Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKGFOb2RlKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzTU9GUHJveHkoKSkgewotCQkJcmVtb3ZlRE9NQWRhcHRlcihhTm9kZSwgYWRhcHRlcik7Ci0JCQlhZGFwdGVyLmdldFRhcmdldCgpLmVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKLQkJCWFkYXB0ZXIgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURlcGVuZGVuY3lGZWF0dXJlKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXRPbGRWYWx1ZSgpICE9IG51bGwpCi0JCQlyZW1vdmVEZXBlbmRlbmN5QWRhcHRlcigoRU9iamVjdCkgbXNnLmdldE9sZFZhbHVlKCkpOwotCQlpZiAobXNnLmdldE5ld1ZhbHVlKCkgIT0gbnVsbCkKLQkJCWFkZERlcGVuZGVuY3lBZGFwdGVyKChFT2JqZWN0KSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZXBlbmRlbmN5RmVhdHVyZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQgOgotCQkJCXJldHVybiBmVHJhbnNsYXRvci5pc0RlcGVuZGVuY3lQYXJlbnQoKSAmJiBmVHJhbnNsYXRvci5nZXREZXBlbmRlbmN5RmVhdHVyZSgpID09IG1zZy5nZXRGZWF0dXJlKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VtcHR5VGFnKEVsZW1lbnQgcGFyZW50KSB7Ci0JCVJldmlzaXQudG9EbygpOwotCQkvL0RldGVybWluZSBob3cgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCBwdXJlIERPTSBhcGlzLCBpZiBwb3NzaWJsZS4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvc3RVcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlVXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBET00gb2JqZWN0IGZyb20gd2l0aCB0aGUgdmFsdWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIE1PRgotCSAqIG9iamVjdC4gVGhlCi0JICogCi0JICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJT2JqZWN0IGF0dHJWYWx1ZSA9IG51bGw7Ci0JCWJvb2xlYW4gaXNTZXQgPSBmYWxzZTsKLQkJaWYgKG1hcC5pc0lETWFwKCkpIHsKLQkJCXRyeSB7Ci0JCQkJYXR0clZhbHVlID0gbWFwLmdldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCQl9IGNhdGNoIChJRFRyYW5zbGF0b3IuTm9SZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vSWYgdGhlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHJlc291cmNlLAotCQkJCS8vTm8gbmVlZCB0byB1cGRhdGUKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpc1NldCA9IGF0dHJWYWx1ZSAhPSBudWxsOwotCQl9IGVsc2UgewotCQkJYXR0clZhbHVlID0gbWFwLmdldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCQlpc1NldCA9IG1hcC5pc1NldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCX0KLQotCQlpZiAobWFwLmlzRE9NQXR0cmlidXRlKCkpIHsKLQkJCS8vIEFuIGF0dHJpYnV0ZSBvZiB0aGUgTU9GIG9iamVjdCBtYXBzIHRvIGFuIGF0dHJpYnV0ZSBvZiB0aGUKLQkJCS8vIERPTSBub2RlLiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBNT0YgYXR0cmlidXRlIGFuZCBzZXQgaXQKLQkJCS8vIGludG8gRE9NIG5vZGUuCi0JCQlFbGVtZW50IGUgPSAoRWxlbWVudCkgY3JlYXRlRE9NUGF0aChub2RlLCBtYXApOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmIGlzU2V0KQotCQkJCWUuc2V0QXR0cmlidXRlKG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCksIG1hcC5jb252ZXJ0VmFsdWVUb1N0cmluZyhhdHRyVmFsdWUsIG1vZk9iamVjdCkpOwotCQkJZWxzZQotCQkJCWUucmVtb3ZlQXR0cmlidXRlKG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkpOwotCQl9IGVsc2UgewotCQkJdXBkYXRlRE9NU3VidHJlZShtYXAsIG5vZGUsIG1vZk9iamVjdCwgYXR0clZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBET00gb2JqZWN0IGZyb20gd2l0aCB0aGUgdmFsdWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIE1PRgotCSAqIG9iamVjdC4gVGhlCi0JICogCi0JICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTUxpbmtGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCUxpbmtVcGRhdGVyVGFyZ2V0LklOU1RBTkNFLnVwZGF0ZURPTShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQotCQlMaXN0IG1vZkNoaWxkcmVuID0gbWFwLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0JCUxpc3QgZG9tQ2hpbGRyZW4gPSBnZXRET01DaGlsZHJlbihub2RlLCBtYXApOwotCi0JCXByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZDaGlsZHJlbiwgZG9tQ2hpbGRyZW4sIG1vZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgZnJvbSB0aGUgRE9NIG5vZGUgc3VidHJlZS4gVGhlCi0JICogCi0JICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbVVwZGF0ZU1PRkZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKCFtYXAuZmVhdHVyZUV4aXN0cyhtb2ZPYmplY3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlPYmplY3QgZG9tVmFsdWUgPSBudWxsOwotCQlib29sZWFuIHVwZGF0ZU1PRkF0dEFkYXB0ZXIgPSBmYWxzZTsKLQkJYm9vbGVhbiBpc1Vuc2V0ID0gZmFsc2U7Ci0JCUVNRjJET01BZGFwdGVyIGF0dHJBZGFwdGVyID0gbnVsbDsKLQotCQlOb2RlIGNoaWxkID0gZmluZERPTU5vZGUobm9kZSwgbWFwLCB0cnVlKTsKLQotCQlpZiAobWFwLmlzRE9NQXR0cmlidXRlKCkgJiYgY2hpbGQgIT0gbnVsbCkgewotCQkJLy8gQW4gYXR0cmlidXRlIG9mIHRoZSBNT0Ygb2JqZWN0IG1hcHMgdG8gYW4gYXR0cmlidXRlIG9mIHRoZQotCQkJLy8gRE9NIG5vZGUuIEdldCB0aGUgdmFsdWUgb2YgdGhlIERPTSBhdHRyaWJ1dGUgYW5kIHNldCBpdAotCQkJLy8gaW50byB0aGUgTU9GIG9iamVjdC4KLQotCQkJQXR0ciBkb21BdHRyID0gKEF0dHIpIGNoaWxkLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0obWFwLmdldERPTU5hbWUobW9mT2JqZWN0KSk7Ci0JCQlpZiAoZG9tQXR0ciAhPSBudWxsKSB7Ci0JCQkJZG9tVmFsdWUgPSBkb21BdHRyLmdldFZhbHVlKCk7Ci0JCQkJZG9tVmFsdWUgPSBtYXAuY29udmVydFN0cmluZ1RvVmFsdWUoKFN0cmluZykgZG9tVmFsdWUsIG1vZk9iamVjdCk7Ci0JCQl9IGVsc2UKLQkJCQlpc1Vuc2V0ID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCS8vIEFuIGF0dHJpYnV0ZSBvZiB0aGUgTU9GIG9iamVjdCBpcyBhY3R1YWxseSBhIHN1Yi1lbGVtZW50Ci0JCQkvLyBvZiB0aGUgRE9NIG5vZGUuIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHN1Yi1lbGVtZW50IHdpdGgKLQkJCS8vIHRoZSBjb3JyZWN0IG5hbWUgdG8gdXNlIGFzIGFuIGF0dHJpYnV0ZS4KLQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBzaW5nbGUgdmFsdWVkIGF0dHJpYnV0ZSB0aGF0IGhhcwotCQkJCS8vIGEgTU9GIG9iamVjdCBhcyBpdHMgdmFsdWUKLQkJCQlpZiAoIW1hcC5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJCWF0dHJBZGFwdGVyID0gY3JlYXRlQWRhcHRlcihjaGlsZCwgbWFwKTsKLQkJCQkJdXBkYXRlTU9GQXR0QWRhcHRlciA9IHRydWU7Ci0JCQkJCWRvbVZhbHVlID0gYXR0ckFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjaGlsZCBpcyBhZGFwdGVkLiBJZiBub3QsIGFkYXB0Ci0JCQkJCS8vIGl0LgotCQkJCQlhZGRET01BZGFwdGVyKGNoaWxkKTsKLQotCQkJCQkvLyBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSB0ZXh0IGNoaWxkCi0JCQkJCWRvbVZhbHVlID0gZXh0cmFjdFZhbHVlKGNoaWxkLCBtYXAsIG1vZk9iamVjdCk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJaXNVbnNldCA9IHRydWU7Ci0JCX0KLQotCQkvLyBTZXQgdGhlIGF0dHJpYnV0ZSBleHRyYWN0ZWQgZnJvbSB0aGUgRE9NIHRvIHRoZSBNT0Ygb2JqZWN0LgotCQlib29sZWFuIGhhc0NoYW5nZWQgPSB0cnVlOwotCQl0cnkgewotCQkJaWYgKG1hcC5pc0lETWFwKCkpCi0JCQkJbWFwLnNldE1PRlZhbHVlKG1vZk9iamVjdCwgZG9tVmFsdWUpOwotCQkJZWxzZSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gbnVsbDsKLQkJCQlvbGRWYWx1ZSA9IG1hcC5nZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQkJCWJvb2xlYW4gaXNTZXQgPSBtYXAuaXNTZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQkJCS8vSW4gdGhlIGNhc2Ugb2YgZW51bXMgd2l0aCBkZWZhdWx0IHZhbHVlcywgd2UgbmVlZCB0byB0cmlwCi0JCQkJLy8gdGhlIGF0dHJpYnV0ZSBmcm9tCi0JCQkJLy9kZWZhdWx0IHRvIGEgc2V0IHZhbHVlCi0JCQkJaWYgKG9sZFZhbHVlID09IGRvbVZhbHVlKSB7Ci0JCQkJCWlmIChvbGRWYWx1ZSA9PSBudWxsIHx8IGlzU2V0KQotCQkJCQkJaGFzQ2hhbmdlZCA9IGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoZG9tVmFsdWUgPT0gbnVsbCAmJiAhaXNTZXQpCi0JCQkJCS8vSWYgdGhlIGRvbVZhbHVlIGlzIG51bGwgYW5kIHRoZSBmZWF0dXJlIGlzIG5vdCBzZXQsIHRoZW4KLQkJCQkJLy8gd2UgZG9uJ3QgbmVlZAotCQkJCQkvL3RvIGRvIGFueXRoaW5nCi0JCQkJCWhhc0NoYW5nZWQgPSBmYWxzZTsKLQkJCQllbHNlIGlmIChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmVxdWFscyhkb21WYWx1ZSkgJiYgaXNTZXQpCi0JCQkJCWhhc0NoYW5nZWQgPSBmYWxzZTsKLQkJCQlpZiAob2xkVmFsdWUgPT0gbnVsbCAmJiBkb21WYWx1ZSA9PSBudWxsICYmIG1hcC5pc1NldE1PRlZhbHVlKG1vZk9iamVjdCkgPT0gaXNVbnNldCkKLQkJCQkJaGFzQ2hhbmdlZCA9IHRydWU7Ci0JCQkJaWYgKGhhc0NoYW5nZWQpIHsKLQkJCQkJaWYgKCEobWFwLmlzRGF0YVR5cGUoKSkgJiYgIW1hcC5pc1NoYXJlZCgpKQotCQkJCQkJcmVtb3ZlTU9GVmFsdWUoKEVPYmplY3QpIG9sZFZhbHVlLCBtYXApOwotCQkJCQlpZiAoZG9tVmFsdWUgPT0gbnVsbCkKLQkJCQkJCW1hcC51blNldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCQkJCWVsc2UKLQkJCQkJCW1hcC5zZXRNT0ZWYWx1ZShtb2ZPYmplY3QsIGRvbVZhbHVlKTsKLQotCQkJCQlpZiAoKGRvbVZhbHVlID09IG51bGwgJiYgIShtYXAuaXNFbnVtRmVhdHVyZSgpKSkgfHwgaXNVbnNldCkKLQkJCQkJCW1hcC51blNldE1PRlZhbHVlKG1vZk9iamVjdCk7IC8vdW5zZXQKLQkJCQkJLy8gbnVsbAotCQkJCQkvLyBmb3IKLQkJCQkJLy8gbm9uCi0JCQkJCS8vIGVudW0KLQkJCQkJLy8gZmVhdHVyZXMKLQotCQkJCQlpZiAodXBkYXRlTU9GQXR0QWRhcHRlcikKLQkJCQkJCWF0dHJBZGFwdGVyLnVwZGF0ZU1PRigpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleCkgewotCQkJaGFuZGxlRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihleCk7Ci0JCQltYXAudW5TZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQl9Ci0JCXJldHVybiBoYXNDaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGZyb20gdGhlIERPTSBub2RlIHN1YnRyZWUuIFRoaXMgbWV0aG9kIGlzIG9ubHkKLQkgKiBjYWxsZWQgaWYgdGhlIERPTSBub2RlIGNoYW5nZXMgYW5kIHRoZSBtYXAgaXMgYW4gb2JqZWN0IGxpbmsgbWFwLiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IKLQkgKiBAcmV0dXJuIFJldHVybiB0cnVlIGlmIHRoZSBNT0YgZmVhdHVyZSB3YXMgdXBkYXRlZCwgZmFsc2UgaWYgbm8gdXBkYXRlIHdhcyBkb25lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVNT0ZMaW5rRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlMaW5rVXBkYXRlclRhcmdldC5JTlNUQU5DRS51cGRhdGVNT0YobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yIERlc2NyaWJlcyB0aGUgbWFwcGluZyBmcm9tIHRoZSBNT0YKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00gbm9kZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQkvLyBJZiB0aGUgZmVhdHVyZSBpcyBhIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncyBvciBpbnRzLCBjYWxsIGEgc3BlY2lhbAotCQkvLyBtZXRob2QKLQkJLy8gdGhhdCBoYW5kbGVzIHRoaXMuCi0JCWlmIChtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCQkJdXBkYXRlTU9GTXVsdGlQcmltaXRpdmVGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3Qgbm9kZUNoaWxkcmVuID0gZ2V0RE9NQ2hpbGRyZW4obm9kZSwgbWFwKTsKLQkJTGlzdCBtb2ZDaGlsZHJlbiA9IG1hcC5nZXRNT0ZDaGlsZHJlbihtb2ZPYmplY3QpOwotCi0JCXByaW1VcGRhdGVNT0ZNdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZDaGlsZHJlbiwgbm9kZUNoaWxkcmVuKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVEZXBlbmRlbmN5QWRhcHRlcihFT2JqZWN0IG9iaikgewotCQlBZGFwdGVyIGV4aXN0aW5nID0gRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihvYmosIERlcGVuZGVuY3lBZGFwdGVyLktFWSk7Ci0JCWlmIChleGlzdGluZyAhPSBudWxsKQotCQkJb2JqLmVBZGFwdGVycygpLnJlbW92ZShleGlzdGluZyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgdGhlIERPTSBjaGlsZHJlbiBmcm9tIDxwYXJlbnQ+dGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgPG1hcD4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQ2hpbGRyZW4oTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCVN0cmluZ1tdIGRvbU5hbWVzID0gbWFwLmdldERPTU5hbWVzKCk7Ci0JCUhhc2hTZXQgZG9tTmFtZXNTZXQgPSBuZXcgSGFzaFNldChkb21OYW1lcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRvbU5hbWVzLmxlbmd0aDsgaSsrKQotCQkJZG9tTmFtZXNTZXQuYWRkKGRvbU5hbWVzW2ldKTsKLQotCQkvLyBXYWxrIHRocm91Z2ggYWxsIHRoZSBjaGlsZHJlbiBhbmQgZmluZCBhbnkgdGhhdCBtYXRjaCB0aGUgbWFwLgotCQlOb2RlTGlzdCBubCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCUxpc3QgdG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBubC5pdGVtKGkpOwotCQkJaWYgKGRvbU5hbWVzU2V0LmNvbnRhaW5zKGNoaWxkTm9kZS5nZXROb2RlTmFtZSgpKSkKLQkJCQl0b1JlbW92ZS5hZGQoY2hpbGROb2RlKTsKLQkJfQotCi0JCS8vIFJlbW92ZSBhbnkgY2hpbGRyZW4gdGhhdCB3ZXJlIGZvdW5kLgotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvUmVtb3ZlLnNpemUoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IChOb2RlKSB0b1JlbW92ZS5nZXQoaSk7Ci0JCQlyZW1vdmVET01DaGlsZChwYXJlbnQsIGNoaWxkTm9kZSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXRGcm9tTm9kZSgpIHsKLQkJc2V0VGFyZ2V0KGZUcmFuc2xhdG9yLmNyZWF0ZUVNRk9iamVjdChmTm9kZS5nZXROb2RlTmFtZSgpLCBleHRyYWN0UmVhZEFoZWFkTmFtZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IERPTSBvYmplY3QgZnJvbSB3aXRoIHRoZSB2YWx1ZXMgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgTU9GCi0JICogb2JqZWN0LiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IKLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB1cGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlwcmVVcGRhdGVET01GZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCWlmIChtYXAuaXNNdWx0aVZhbHVlZCgpKSB7Ci0JCQkJdXBkYXRlRE9NTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChmRGVidWcpIHsKLQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJVcGRhdGluZyBET00gTm9kZTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRmcm9tOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJdHJ5IHsKLQkJCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCQlwcmltVXBkYXRlRE9NRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCQl9Ci0KLQkJCWlmIChtYXAuaXNUYXJnZXRMaW5rTWFwKCkpIHsKLQkJCQl1cGRhdGVET01MaW5rRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwb3N0VXBkYXRlRE9NRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgRE9NIG9iamVjdCBmcm9tIHRoZSB2YWx1ZXMgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgTU9GCi0JICogb2JqZWN0LiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01MaW5rRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJVcGRhdGluZyBET00gTm9kZSAobGluayk6ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRmcm9tOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaW1VcGRhdGVET01MaW5rRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01NdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiVXBkYXRpbmcgRE9NIE5vZGUgKG11bHRpKTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhIERPTSBzdWJ0cmVlIHRvIHJlZmxlY3QgdGhlIG1vZk9iamVjdCBhbmQgbWFwIHBhc3NlZCBpbi4gVGhlIHN1YnRyZWUgaXMgb2YgPG5vZGU+aXMKLQkgKiB1cGRhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTVN1YnRyZWUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QsIE9iamVjdCBhdHRyVmFsdWUpIHsKLQotCQlpZiAobWFwLmZlYXR1cmVFeGlzdHMobW9mT2JqZWN0KSkgewotCQkJaWYgKChtYXAuaXNFbnVtRmVhdHVyZSgpIHx8IG1hcC5pc0Jvb2xlYW5GZWF0dXJlKCkpICYmIChtYXAuaXNVbnNldHRhYmxlKCkgJiYgIW1hcC5pc1NldE1PRlZhbHVlKG1vZk9iamVjdCkpKQotCQkJCWF0dHJWYWx1ZSA9IG51bGw7Ci0JCX0gZWxzZQotCQkJYXR0clZhbHVlID0gbWFwLmV4dHJhY3RTdHJpbmdWYWx1ZShtb2ZPYmplY3QpOwotCi0JCS8vIENyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSBET00gc3VidHJlZQotCQlpZiAoYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCU5vZGUgcGFyZW50ID0gY3JlYXRlRE9NUGF0aChub2RlLCBtYXApOwotCQkJaWYgKG1hcC5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBtb2YgdmFsdWUgaXMgbm90IGFub3RoZXIKLQkJCQkvLyBtb2Ygb2JqZWN0IChwcmltaXRpdmUpCi0JCQkJaWYgKG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkgIT0gbnVsbCAmJiBtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm47Ci0KLQkJCQlFbGVtZW50IGNoaWxkID0gbWFwLmlzRE9NVGV4dFZhbHVlKCkgPyAoRWxlbWVudCkgcGFyZW50IDogZmluZE9yQ3JlYXRlTm9kZShwYXJlbnQsIG1hcCwgbWFwLmdldERPTU5hbWUobW9mT2JqZWN0KSk7Ci0KLQkJCQlmaW5kT3JDcmVhdGVUZXh0Tm9kZShjaGlsZCwgbWFwLCBtYXAuY29udmVydFZhbHVlVG9TdHJpbmcoYXR0clZhbHVlLCBtb2ZPYmplY3QpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdlcmUgdGhlIG1vZiB2YWx1ZSBpcyBhIG1vZiBvYmplY3QuCi0JCQkJRU9iamVjdCBtb2ZWYWx1ZSA9IChFT2JqZWN0KSBhdHRyVmFsdWU7Ci0JCQkJRU1GMkRPTUFkYXB0ZXIgdmFsdWVBZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKG1vZlZhbHVlLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJCQlpZiAodmFsdWVBZGFwdGVyICE9IG51bGwpCi0JCQkJCXZhbHVlQWRhcHRlci51cGRhdGVET00oKTsKLQkJCQllbHNlIHsKLQkJCQkJcmVtb3ZlRE9NQ2hpbGRyZW4ocGFyZW50LCBtYXApOwotCQkJCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihtb2ZWYWx1ZSwgbWFwKTsKLQkJCQkJTGlzdCBtb2ZDaGlsZHJlbiA9IG1hcC5nZXRNT0ZDaGlsZHJlbihtb2ZPYmplY3QpOwotCQkJCQlMaXN0IGRvbUNoaWxkcmVuID0gZ2V0RE9NQ2hpbGRyZW4ocGFyZW50LCBtYXApOwotCi0JCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwLCBtb2ZDaGlsZHJlbiwgMCwgZG9tQ2hpbGRyZW4pOwotCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBhZGFwdGVyLmdldE5vZGUoKSwgaW5zZXJ0QmVmb3JlTm9kZSk7Ci0JCQkJCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGFkYXB0ZXIuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbmRlbnQoYWRhcHRlci5nZXROb2RlKCksIG1hcCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCQkJCX0KLQkJCQkJYWRhcHRlci51cGRhdGVET00oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGUgYXR0cmlidXRlIHZhbHVlIHdhcyBzZXQgdG8gbnVsbCBvciB1bnNldC4gUmVtb3ZlIGFueQotCQkJLy8gZXhpc3RpbmcgRE9NIG5vZGVzLgotCQkJTm9kZSBjaGlsZCA9IGZpbmRET01Ob2RlKG5vZGUsIG1hcCk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQlyZW1vdmVET01DaGlsZChjaGlsZC5nZXRQYXJlbnROb2RlKCksIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhIGZlYXR1cmUgdGhhdCBpcyBzZXQgYnkgbGlua2luZyB0byBhbm90aGVyIGV4aXN0aW5nIG9iamVjdC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkCi0JICogd2hlbiB0aGUgTU9GIG9iamVjdCBpcyB1cGRhdGVkIGluIG9yZGVyIHRvIHVwZGF0ZSBET00gbm9kZXMuCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTU9GTGlua0ZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiVXBkYXRpbmcgTU9GT2JqZWN0IChsaW5rKTogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0ZnJvbTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXByaW1VcGRhdGVNT0ZMaW5rRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZNdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiVXBkYXRpbmcgTU9GT2JqZWN0IChtdWx0aSk6ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQl0cnkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLiBUaGUgcmVsYXRpb25zaGlwIE1VU1QgQkUgYSBjb2xsZWN0aW9uIG9mIHN0cmluZyBmb3IgdGhpcyBtZXRob2QgdG8gd29yay4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZNdWx0aVByaW1pdGl2ZUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJTGlzdCBub2RlQ2hpbGRyZW4gPSBnZXRET01DaGlsZHJlbihub2RlLCBtYXApOwotCi0JCW1hcC5jbGVhckxpc3QobW9mT2JqZWN0KTsKLQotCQkvLyBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIG5vZGVzIGFuZCB1cGRhdGUgdGhlIE1PRiBjb2xsZWN0aW9uCi0JCWludCBhZGRJbmRleCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gKE5vZGUpIG5vZGVDaGlsZHJlbi5nZXQoaSk7Ci0JCQlPYmplY3QgYXR0cmlidXRlVmFsdWUgPSBleHRyYWN0VmFsdWUoY2hpbGQsIG1hcCwgbW9mT2JqZWN0KTsKLQkJCWJvb2xlYW4gYWR2YW5jZUFkZEluZGV4ID0gdHJ1ZTsKLQkJCWlmIChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsKXsKLQkJCQlpZihtYXAuZ2V0RmVhdHVyZSgpICE9IG51bGwgJiYgbWFwLmdldEZlYXR1cmUoKS5pc1VuaXF1ZSgpICYmIG1vZk9iamVjdC5lR2V0KG1hcC5nZXRGZWF0dXJlKCkpICE9IG51bGwgJiYgbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSkgaW5zdGFuY2VvZiBMaXN0ICYmICgoTGlzdCkgbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSkpLmNvbnRhaW5zKGF0dHJpYnV0ZVZhbHVlKSl7Ci0JCQkJCWFkdmFuY2VBZGRJbmRleCA9IGZhbHNlOwotCQkJCQlTdHJpbmcgZG9tTmFtZSA9IG1hcC5kb21OYW1lQW5kUGF0aCAhPSBudWxsID8gbWFwLmRvbU5hbWVBbmRQYXRoIDogImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgJ25vIGR1cGxpY2F0ZXMnIGNvbnN0cmFpbnQgaXMgdmlvbGF0ZWQgYnkgIitkb21OYW1lKyIgPSAiK2F0dHJpYnV0ZVZhbHVlKSk7Ci0JCQkJCWhhbmRsZUludmFsaWRNdWx0aU5vZGVzKGNoaWxkLmdldE5vZGVOYW1lKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1hcC5zZXRNT0ZWYWx1ZShtb2ZPYmplY3QsIGF0dHJpYnV0ZVZhbHVlLCBhZGRJbmRleCk7Ci0JCQkJfQotCQkJCWlmKGFkdmFuY2VBZGRJbmRleCl7Ci0JCQkJCWFkZEluZGV4ICsrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gQWRhcHQgdGhlIG5vZGUgc28gdXBkYXRlIHdpbGwgb2NjdXIuCi0JCQlhZGRET01BZGFwdGVyKGNoaWxkKTsKLQkJfQotCQlpZiAobWFwLmhhc0RPTVBhdGgoKSAmJiBub2RlQ2hpbGRyZW4uaXNFbXB0eSgpICYmIGZpbmRET01QYXRoKG5vZGUsIG1hcCwgZmFsc2UpICE9IG51bGwpCi0JCQltYXAuc2V0TU9GVmFsdWVGcm9tRW1wdHlET01QYXRoKG1vZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgZnJvbSB0aGUgRE9NIG5vZGUgc3VidHJlZS4gVGhlCi0JICogCi0JICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTU9GRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCQlpZiAobWFwLmlzTXVsdGlWYWx1ZWQoKSkgewotCQkJdXBkYXRlTU9GTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIGlmIChtYXAuaXNDb21tZW50KCkpIHsKLQkJCXVwZGF0ZU1PRkNvbW1lbnRGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRPRE8gTURFIEFkZCBhIG1hcC5pc0NvbW1lbnQoKSBhbmQgdXBkYXRlTU9GQ29tbWVudEZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCi0JCWlmIChmRGVidWcpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlVwZGF0aW5nIE1PRk9iamVjdDogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0ZnJvbTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCWJvb2xlYW4gaGFzQ2hhbmdlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQloYXNDaGFuZ2VkID0gcHJpbVVwZGF0ZU1PRkZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJfQotCi0JCWlmIChtYXAuaXNUYXJnZXRMaW5rTWFwKCkgJiYgaGFzQ2hhbmdlZCkKLQkJCXVwZGF0ZU1PRkxpbmtGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWFwCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbW9mT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTU9GQ29tbWVudEZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJTm9kZSBjb21tZW50Tm9kZSA9IG5vZGU7Ci0JCS8qIHNjYW4gdXAgdGhlIGRvbSB0byBmaW5kIHRoZSBmaXJzdCBjb21tZW50IG5vZGUgYmVmb3JlIHRoaXMgbm9kZSAqLwotCQl3aGlsZSAoKGNvbW1lbnROb2RlID0gY29tbWVudE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpICE9IG51bGwgJiYgY29tbWVudE5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkNPTU1FTlRfTk9ERSkgewotCQkJLyogbm8gY29tbWVudCBhdmFpbGFibGUgKi8KLQkJCWlmIChjb21tZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybjsKLQkJfQotCQlpZiAoY29tbWVudE5vZGUgIT0gbnVsbCkKLQkJCW1hcC5zZXRNT0ZWYWx1ZShtb2ZPYmplY3QsIGNvbW1lbnROb2RlLmdldE5vZGVWYWx1ZSgpKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNmYmRjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTUxvYWRPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJldmlzaXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgRU1GMkRPTVJlbmRlcmVyIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckltcGwgaW1wbGVtZW50cyBSZW5kZXJlciB7Ci0KLQlwcm90ZWN0ZWQgTWFwIGRvbUFkYXB0ZXJSZWdpc3RyeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc1RvQ3JlYXRlRE9NID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRE9NUmVuZGVyZXJJbXBsLgotCSAqLwotCXB1YmxpYyBFTUYyRE9NUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChtYW5hZ2VzRE9NQWRhcHRlcnMoKSkKLQkJCWluaXRET01BZGFwdGVyUmVnaXN0cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZG9Mb2FkKElucHV0U3RyZWFtLCBNYXApCi0JICovCi0JcHVibGljIHZvaWQgZG9Mb2FkKElucHV0U3RyZWFtIGluLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKChpbiAhPSBudWxsKSB8fCAhdXNlU3RyZWFtc0ZvcklPKCkpIHsKLQkJCWxvYWREb2N1bWVudChpbiwgb3B0aW9ucyk7Ci0JCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlUm9vdERPTUFkYXB0ZXIoKTsKLQkJCWFkYXB0ZXIudXBkYXRlTU9GKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJRE9NTG9hZE9wdGlvbnMgZG9tT3B0cyA9IG5ldyBET01Mb2FkT3B0aW9ucygpOwotCQkJZG9tT3B0cy5zZXRBbGxvd0phdmFFbmNvZGluZ3ModHJ1ZSk7Ci0JCQlkb21PcHRzLnNldEV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcyh0cnVlKTsKLQkJCWRvbU9wdHMuc2V0VmFsaWRhdGUoaXNWYWxpZGF0aW5nKCkpOwotCQkJZG9jdW1lbnQgPSBET01VdGlsaXRpZXMubG9hZERvY3VtZW50KGluLCBkb21PcHRzLCBnZXRSZXNvdXJjZSgpLmdldEVudGl0eVJlc29sdmVyKCkpOwotCQkJbmVlZHNUb0NyZWF0ZURPTSA9IGZhbHNlOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHRfcmV4KSB7Ci0JCQl0aHJvdyB0X3JleDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBpb3g7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZG9TYXZlKE91dHB1dFN0cmVhbSwgTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY3JlYXRlRE9NVHJlZUlmTmVjZXNzYXJ5KCk7Ci0JCXNlcmlhbGl6ZURvY3VtZW50KG91dHB1dFN0cmVhbSk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaWYgYWRhcHRlcnMgYXJlIG5vdCBjYWNoZWQgd2l0aGluIHRoaXMgcmVuZGVyZXIsIGUuZy4sIHRoZXkgYXJlCi0JICogc3RvcmVkIGluIG5vdGlmeWluZyBOb2RlcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hbmFnZXNET01BZGFwdGVycygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERPTUFkYXB0ZXJSZWdpc3RyeSgpIHsKLQkJaWYgKGRvbUFkYXB0ZXJSZWdpc3RyeSA9PSBudWxsKQotCQkJZG9tQWRhcHRlclJlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpc3RlckRPTUFkYXB0ZXIoTm9kZSBub2RlLCBFTUYyRE9NQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWRvbUFkYXB0ZXJSZWdpc3RyeS5wdXQobm9kZSwgYWRhcHRlcik7Ci0JfQotCi0JcHVibGljIEVNRjJET01BZGFwdGVyIGdldEV4aXN0aW5nRE9NQWRhcHRlcihOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChFTUYyRE9NQWRhcHRlcikgZG9tQWRhcHRlclJlZ2lzdHJ5LmdldChub2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQlkb21BZGFwdGVyUmVnaXN0cnkucmVtb3ZlKGFOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcHJlcGFyZVRvQWRkQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZXBhcmVUb0FkZENvbnRlbnRzKCkgewotCQkvLyBjcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBjcmVhdGVET01UcmVlKCkgewotCQljcmVhdGVEb2N1bWVudCgpOwotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlUm9vdERPTUFkYXB0ZXIoKTsKLQkJYWRhcHRlci51cGRhdGVET00oKTsKLQkJbmVlZHNUb0NyZWF0ZURPTSA9IGZhbHNlOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgY3JlYXRlUm9vdERPTUFkYXB0ZXIoKSB7Ci0JCUVNRjJET01BZGFwdGVyIHJvb3QgPSBuZXcgRU1GMkRPTUFkYXB0ZXJJbXBsKGdldFJlc291cmNlKCksIGRvY3VtZW50LCB0aGlzLCBnZXRSZXNvdXJjZSgpLmdldFJvb3RUcmFuc2xhdG9yKCkpOwotCQlyZWdpc3RlckRPTUFkYXB0ZXIoZG9jdW1lbnQsIHJvb3QpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURPTVRyZWVJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKG5lZWRzVG9DcmVhdGVET00pCi0JCQljcmVhdGVET01UcmVlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IERvY3VtZW50IGdpdmVuCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudCgpIHsKLQkJVHJhbnNsYXRvclJlc291cmNlIHJlcyA9IGdldFJlc291cmNlKCk7Ci0JCXJlcy5zZXREZWZhdWx0cygpOwotCQl0cnkgewotCQkJZG9jdW1lbnQgPSBET01VdGlsaXRpZXMuY3JlYXRlTmV3RG9jdW1lbnQocmVzLmdldERvY3R5cGUoKSwgcmVzLmdldFB1YmxpY0lkKCksIHJlcy5nZXRTeXN0ZW1JZCgpKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlcmlhbGl6ZURvY3VtZW50KE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIE91dHB1dEZvcm1hdCBmb3JtYXQgPSBjcmVhdGVPdXRwdXRGb3JtYXQoKTsgU2VyaWFsaXplciBzZXJpYWxpemVyID0KLQkJICogU2VyaWFsaXplckZhY3RvcnkuZ2V0U2VyaWFsaXplckZhY3RvcnkoTWV0aG9kLlhNTCkubWFrZVNlcmlhbGl6ZXIob3V0LCBmb3JtYXQpOwotCQkgKiBzZXJpYWxpemVyLmFzRE9NU2VyaWFsaXplcigpLnNlcmlhbGl6ZShkb2N1bWVudCk7Ci0JCSAqLwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCS8qCi0JCQkgKiB0cnkgeyBmYWN0b3J5LnNldEF0dHJpYnV0ZShKQVhQX1NDSEVNQV9MQU5HVUFHRSwgVzNDX1hNTF9TQ0hFTUEpOyB9IGNhdGNoCi0JCQkgKiAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHgpIHsgfQotCQkJICovCi0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLQotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuVkVSU0lPTiwgZ2V0UmVzb3VyY2UoKS5nZXRYTUxWZXJzaW9uKCkpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgIm5vIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChnZXRSZXNvdXJjZSgpLmdldFB1YmxpY0lkKCkgIT0gbnVsbCkKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfUFVCTElDLCBnZXRSZXNvdXJjZSgpLmdldFB1YmxpY0lkKCkpOwotCQkJaWYgKGdldFJlc291cmNlKCkuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKQotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9TWVNURU0sIGdldFJlc291cmNlKCkuZ2V0U3lzdGVtSWQoKSk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkICAgICAgICAgICAgCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiNCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCURPTVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkJCS8qIHNvdXJjZS5zZXRTeXN0ZW1JZChnZXRSZXNvdXJjZSgpLmdldFN5c3RlbUlkKCkpOyAqLwotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChvdXQpKTsKLQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiBwcm90ZWN0ZWQgT3V0cHV0Rm9ybWF0IGNyZWF0ZU91dHB1dEZvcm1hdCgpIHsgT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPdXRwdXRGb3JtYXQoKTsKLQkgKiBmb3JtYXQuc2V0SW5kZW50aW5nKHRydWUpOyBmb3JtYXQuc2V0TGluZVNlcGFyYXRvcihET01VdGlsaXRpZXMuTkVXTElORV9TVFJJTkcpOwotCSAqIC8vJE5PTi1OTFMtMSQgZm9ybWF0LnNldEVuY29kaW5nKGdldFJlc291cmNlKCkuZ2V0RW5jb2RpbmcoKSk7Ci0JICogZm9ybWF0LnNldFZlcnNpb24oZ2V0UmVzb3VyY2UoKS5nZXRYTUxWZXJzaW9uKCkpOyByZXR1cm4gZm9ybWF0OyB9Ci0JICovCi0KLQlwdWJsaWMgdm9pZCByZXBsYWNlRG9jdW1lbnRUeXBlKFN0cmluZyBkb2NUeXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJUmV2aXNpdC5yZXZpc2l0KCk7Ci0JCURvY3VtZW50IG5ld0RvYyA9IG51bGw7Ci0JCS8vIE5lZWQgYmUgYWJsZSB0byB1cGRhdGUgdGhlIGRvY3R5cGUgZGlyZWN0bHkgb24gdGhlIGV4aXN0aW5nIGRvY3VtZW50OyByaWdodCBub3cgY2FuJ3QKLQkJLy8gYmVjYXVzZQotCQkvLyBvZiBsaW1pdGF0aW9ucyBvbiBwYXJzZXIgbmV1dHJhbCBhcGlzCi0KLQkJdHJ5IHsKLQkJCW5ld0RvYyA9IERPTVV0aWxpdGllcy5jcmVhdGVOZXdEb2N1bWVudChkb2NUeXBlTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJfQotCi0KLQkJcmVwbGFjZU5vZGUoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCksIG5ld0RvYywgbmV3RG9jKTsKLQkJcmVhZGFwdChkb2N1bWVudCwgbmV3RG9jKTsKLQkJZG9jdW1lbnQgPSBuZXdEb2M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZU5vZGUoTm9kZSBvbGRDaGlsZCwgTm9kZSBuZXdQYXJlbnQsIERvY3VtZW50IG5ld0RvYykgewotCQlOb2RlIG5ld0NoaWxkID0gbmV3RG9jLmltcG9ydE5vZGUob2xkQ2hpbGQsIGZhbHNlKTsKLQkJbmV3UGFyZW50LmFwcGVuZENoaWxkKG5ld0NoaWxkKTsKLQkJcmVhZGFwdChvbGRDaGlsZCwgbmV3Q2hpbGQpOwotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG9sZENoaWxkLmdldENoaWxkTm9kZXMoKTsKLQkJaW50IGxlbmd0aCA9IGNoaWxkcmVuLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlyZXBsYWNlTm9kZShjaGlsZHJlbi5pdGVtKGkpLCBuZXdDaGlsZCwgbmV3RG9jKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByZVVubG9hZCgpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIocmVzb3VyY2UuZUFkYXB0ZXJzKCksIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyLnJlbW92ZUFkYXB0ZXJzKGFkYXB0ZXIuZ2V0Tm9kZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlYWRhcHQoTm9kZSBvbGRDaGlsZCwgTm9kZSBuZXdDaGlsZCkgewotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gZ2V0RXhpc3RpbmdET01BZGFwdGVyKG9sZENoaWxkKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmVnaXN0ZXJET01BZGFwdGVyKG5ld0NoaWxkLCBhZGFwdGVyKTsKLQkJCS8vIFNvbWUgbm9kZXMgYXJlIG1hbmFnZWQgYnkgdGhlIHBhcmVudCBhbmQgdGh1cyB0aGUKLQkJCS8vIG5vZGUgc2hvdWxkIG5vdCBiZSBzZXQgb24gdGhlIHBhcmVudCBhZGFwdGVyCi0JCQlpZiAoYWRhcHRlci5nZXROb2RlKCkgPT0gb2xkQ2hpbGQpCi0JCQkJYWRhcHRlci5zZXROb2RlKG5ld0NoaWxkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKS5nZXRWZXJzaW9uSUQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlNTYwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLXB1YmxpYyBjbGFzcyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5IGV4dGVuZHMgUmVuZGVyZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXJGYWN0b3J5I2NyZWF0ZVJlbmRlcmVyKCkKLQkgKi8KLQlwdWJsaWMgUmVuZGVyZXIgY3JlYXRlUmVuZGVyZXIoKSB7Ci0JCUVNRjJET01SZW5kZXJlciByZW5kZXJlciA9IG5ldyBFTUYyRE9NUmVuZGVyZXIoKTsKLQkJcmVuZGVyZXIuc2V0VmFsaWRhdGluZyhpc1ZhbGlkYXRpbmcoKSk7Ci0JCXJldHVybiByZW5kZXJlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjU3YTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgSU5TVEFOQ0UgPSBuZXcgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIjZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIFJlbmRlcmVyRmFjdG9yeSBnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYRG9jdW1lbnRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYRG9jdW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNWJiNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWERvY3VtZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFRoZSBFTUYyU0FYRG9jdW1lbnRIYW5kbGVyIGlzIHV0aWxpemVkIGJ5IHRoZSBTQVggcGFyc2VyIHRvIGFubm91bmNlIFhNTCBFdmVudHMsIHN1Y2ggYXMKLSAqIGJlZ2lubmluZyBhbmQgZW5kIG9mIFhNTCBlbGVtZW50cyBhbmQgdGhlIGNvbnRlbnRzIG9mIHRob3NlIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBDYWNoZUV2ZW50U3RhY2sgZXZlbnRTdGFjayA9IG5ldyBDYWNoZUV2ZW50U3RhY2soKTsKLQlwcml2YXRlIENhY2hlRXZlbnRQb29sIGF2YWlsYWJsZUV2ZW50UG9vbCA9IG5ldyBDYWNoZUV2ZW50UG9vbCgpOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIgdG8gcG9wdWxhdGUgdGhlIGdpdmVuIHJlc291cmNlLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRU1GMlNBWERvY3VtZW50SGFuZGxlcihUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNyZXNvbHZlRW50aXR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlJbnB1dFNvdXJjZSByZXN1bHQgPSBudWxsOwotCQl0aGlzLnJlc291cmNlLnNldERvY3R5cGVWYWx1ZXMocHVibGljSWQsIHN5c3RlbUlkKTsKLQotCQl0cnkgewotCQkJRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSB0aGlzLnJlc291cmNlLmdldEVudGl0eVJlc29sdmVyKCk7Ci0KLQkJCWlmIChlbnRpdHlSZXNvbHZlciAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGVudGl0eVJlc29sdmVyLnJlc29sdmVFbnRpdHkocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBzdXBlci5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihpb2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogVGhlIGVuZERvY3VtZW50KCkgbWV0aG9kIHNob3VsZCBoYXZlIGZyb3plbiB0aGUgcG9vbCwgb3IgaXQgbWF5IG5vdCBiZSB3YXJtZWQgeWV0LiBJbgotCQkgKiBlaXRoZXIgY2FzZSwgdGhpcyBtZXRob2QgY2FsbCB3aWxsIGRvIGFzIGxpdHRsZSB3b3JrIGFzIG5lY2Vzc2FyeQotCQkgKi8KLQkJYXZhaWxhYmxlRXZlbnRQb29sLndhcm1Qb29sKCk7Ci0KLQkJLyogVGhpcyBsaW5lIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LCBidXQgaXMgbGVmdCBmb3Igc2FmdHkgKi8KLQkJZXZlbnRTdGFjay5jbGVhcigpOwotCQl0aGlzLmNyZWF0ZVJvb3QodGhpcy5yZXNvdXJjZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlhZGRUb1N0YWNrKHFOYW1lLCBhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2NoYXJhY3RlcnMoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBkYXRhLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCUNhY2hlRXZlbnROb2RlIGN1cnJlbnRSZWNvcmQgPSBnZXRDdXJyZW50UmVjb3JkKCk7Ci0JCWlmIChjdXJyZW50UmVjb3JkICE9IG51bGwpIHsKLQkJCWN1cnJlbnRSZWNvcmQuYXBwZW5kVG9CdWZmZXIoZGF0YSwgc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCUNhY2hlRXZlbnROb2RlIGN1cnJlbnRSZWNvcmQgPSBudWxsOwotCi0JCS8qCi0JCSAqIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBET01QYXRoIHdhcyBpZ25vcmVkIHNvIHRoZSBzdGFjayBkb2VzIG5vdAotCQkgKiBxdWl0ZSBtYXRjaCB3aXRoIHRoZSBYTUwgZGF0YSBzdHJ1Y3R1cmUuIEluIHRoaXMgY2FzZSB3ZSBkbyBub3RoaW5nCi0JCSAqLwotCQlpZiAocU5hbWUuZXF1YWxzKHRoaXMuZ2V0Q3VycmVudFJlY29yZCgpLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQljdXJyZW50UmVjb3JkID0gdGhpcy5yZW1vdmVDdXJyZW50UmVjb3JkKCk7Ci0JCQlpZiAoY3VycmVudFJlY29yZCAhPSBudWxsKSB7Ci0JCQkJY3VycmVudFJlY29yZC5jb21taXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjZW5kRG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCUNhY2hlRXZlbnROb2RlIGxhc3RSZWNvcmQgPSB0aGlzLnJlbW92ZUN1cnJlbnRSZWNvcmQoKTsKLQkJbGFzdFJlY29yZC5jb21taXQoKTsKLQkJYXZhaWxhYmxlRXZlbnRQb29sLmZyZWV6ZVBvb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXRocm93IGV4OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXRocm93IGV4OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJvb3QoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlQXJnKSB7Ci0JCXRoaXMuZXZlbnRTdGFjay5wdXNoKGF2YWlsYWJsZUV2ZW50UG9vbC5jcmVhdGVDYWNoZUV2ZW50Tm9kZShyZXNvdXJjZUFyZykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvU3RhY2soU3RyaW5nIG5vZGVOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJQ2FjaGVFdmVudE5vZGUgcGFyZW50ID0gdGhpcy5nZXRDdXJyZW50UmVjb3JkKCk7Ci0JCWlmICghcGFyZW50LmlzQ2hpbGRJZ25vcmFibGUobm9kZU5hbWUpKSB7Ci0JCQl0aGlzLmV2ZW50U3RhY2sucHVzaChhdmFpbGFibGVFdmVudFBvb2wuY3JlYXRlQ2FjaGVFdmVudE5vZGUocGFyZW50LCBub2RlTmFtZSwgYXR0cmlidXRlcykpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IENFTk8gd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBldmVudCBzdGFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IENFTk8gd2l0aG91dCByZW1vdmluZyBpdAotCSAqLwotCXByb3RlY3RlZCBDYWNoZUV2ZW50Tm9kZSBnZXRDdXJyZW50UmVjb3JkKCkgewotCQlDYWNoZUV2ZW50Tm9kZSByZXN1bHQgPSBudWxsOwotCQlpZiAoIXRoaXMuZXZlbnRTdGFjay5pc0VtcHR5KCkpIHsKLQkJCXJlc3VsdCA9IHRoaXMuZXZlbnRTdGFjay5wZWVrKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgQ0VOTyBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGV2ZW50IHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgQ0VOTyBhbmQgcmVtb3ZlIGl0Ci0JICovCi0JcHJvdGVjdGVkIENhY2hlRXZlbnROb2RlIHJlbW92ZUN1cnJlbnRSZWNvcmQoKSB7Ci0JCUNhY2hlRXZlbnROb2RlIHJlc3VsdCA9IG51bGw7Ci0JCWlmICghdGhpcy5ldmVudFN0YWNrLmlzRW1wdHkoKSkgewotCQkJcmVzdWx0ID0gdGhpcy5ldmVudFN0YWNrLnBvcCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8JcHJpdmF0ZSBmaW5hbCB2b2lkIHByaW50U3RhY2soKSB7Ci0JLy8JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbnRpbmcgc3RhY2sgLi4uIik7Ci0JLy8JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5ldmVudFN0YWNrLnNpemUoKTsgaSsrKSB7Ci0JLy8JCS8vIGRlYnVnKCJzdGFja1siICsgaSArICJdOiAiICsgZXZlbnRTdGFjay5nZXQoaSkpOwotCS8vCQkvLyB9Ci0JLy8JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLi4uIFByaW50ZWQgc3RhY2siKTsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGRlYnVnKE9iamVjdCBvYmopIHsKLQkvLwkJLy8gU3lzdGVtLm91dC5wcmludGxuKG9iaik7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCB3YXJuKE9iamVjdCBvYmopIHsKLQkvLwkJLy9TeXN0ZW0uZXJyLnByaW50bG4ob2JqKTsKLQkvLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjcyMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UcmFuc2Zvcm1lckhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyU0FYUmVuZGVyZXIgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW1wbCB7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVNRjJTQVhSZW5kZXJlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZG9Mb2FkKGphdmEuaW8uSW5wdXRTdHJlYW0sIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgZG9Mb2FkKElucHV0U3RyZWFtIGluLCBNYXAgb3B0aW9ucykgewotCQl0cnkgewotCQkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGlzVmFsaWRhdGluZygpKTsKLQkJCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQkvKgotCQkJICogQ2F1c2VzIGVycm9ycyBpbiBJQk0gSkRLIHRyeSB7IGZhY3Rvcnkuc2V0QXR0cmlidXRlKEpBWFBfU0NIRU1BX0xBTkdVQUdFLAotCQkJICogVzNDX1hNTF9TQ0hFTUEpOyB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geCkgeyB9Ci0JCQkgKi8KLQkJCVNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQkJWE1MUmVhZGVyIHJlYWRlciA9IHBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQkJCUVNRjJTQVhEb2N1bWVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBFTUYyU0FYRG9jdW1lbnRIYW5kbGVyKHRoaXMuZ2V0UmVzb3VyY2UoKSk7Ci0JCQl0cnkgewotCQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIsIGlzVmFsaWRhdGluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBzbnJlKSB7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gc25yZSkgewotCQkJfQotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIiwgaXNWYWxpZGF0aW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKLQkJCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKCJXYXJuaW5nOiBQYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCBcImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYVwiLiBWYWxpZGF0aW9uIHdpbGwgYmUgZGlzYWJsZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9hbGxvdy1qYXZhLWVuY29kaW5ncyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKCJXYXJuaW5nOiBQYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCBcImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9hbGxvdy1qYXZhLWVuY29kaW5nc1wiLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvKgotCQkJICogdHJ5IHsgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBoYW5kbGVyKTsgfQotCQkJICogY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgeyB9Ci0JCQkgKi8KLQkJCXJlYWRlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKLQkJCXJlYWRlci5zZXRFcnJvckhhbmRsZXIoaGFuZGxlcik7Ci0JCQkvL3JlYWRlci5zZXREVERIYW5kbGVyKGhhbmRsZXIpOwotCQkJcmVhZGVyLnNldEVudGl0eVJlc29sdmVyKGhhbmRsZXIpOwotCQkJSW5wdXRTb3VyY2UgdGVzdHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbik7Ci0JCQlyZWFkZXIucGFyc2UodGVzdHNvdXJjZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gdF9yZXgpIHsKLQkJCXRocm93IHRfcmV4OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNkb1NhdmUoamF2YS5pby5PdXRwdXRTdHJlYW0sIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCS8qCi0JCSAqIHRyeSB7IFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9Ci0JCSAqIFNlcmlhbGl6ZXJGYWN0b3J5LmdldFNlcmlhbGl6ZXJGYWN0b3J5KE1ldGhvZC5YTUwpLm1ha2VTZXJpYWxpemVyKG91dHB1dFN0cmVhbSwKLQkJICogY3JlYXRlT3V0cHV0Rm9ybWF0KCkpOyBzZXJpYWxpemVyLnNldE91dHB1dEJ5dGVTdHJlYW0ob3V0cHV0U3RyZWFtKTsgQ29udGVudEhhbmRsZXIKLQkJICogaGFuZGxlciA9IHNlcmlhbGl6ZXIuYXNDb250ZW50SGFuZGxlcigpOwotCQkgKi8KLQotCQlUcmFuc2Zvcm1lckhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCVNBWFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gKFNBWFRyYW5zZm9ybWVyRmFjdG9yeSkgVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQkJaGFuZGxlciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXJIYW5kbGVyKCk7Ci0KLQkJCQloYW5kbGVyLnNldFJlc3VsdChuZXcgU3RyZWFtUmVzdWx0KG91dHB1dFN0cmVhbSkpOwotCQkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gaGFuZGxlci5nZXRUcmFuc2Zvcm1lcigpOwotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBnZXRSZXNvdXJjZSgpLmdldEVuY29kaW5nKCkpOwotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuVkVSU0lPTiwgZ2V0UmVzb3VyY2UoKS5nZXRYTUxWZXJzaW9uKCkpOwotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAibm8iKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAgICAgICAKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiNCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCWlmIChnZXRSZXNvdXJjZSgpLmdldFB1YmxpY0lkKCkgIT0gbnVsbCkKLQkJCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1BVQkxJQywgZ2V0UmVzb3VyY2UoKS5nZXRQdWJsaWNJZCgpKTsKLQkJCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRTeXN0ZW1JZCgpICE9IG51bGwpCi0JCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9TWVNURU0sIGdldFJlc291cmNlKCkuZ2V0U3lzdGVtSWQoKSk7Ci0KLQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigiU0FYIFdyaXRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlFTUYyU0FYV3JpdGVyIHdyaXRlciA9IG5ldyBFTUYyU0FYV3JpdGVyKCk7Ci0JCQl3cml0ZXIuc2VyaWFsaXplKHRoaXMucmVzb3VyY2UsIGhhbmRsZXIpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gc2F4ZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oc2F4ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHByb3RlY3RlZCBPdXRwdXRGb3JtYXQgY3JlYXRlT3V0cHV0Rm9ybWF0KCkgeyBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE91dHB1dEZvcm1hdCgpOwotCSAqIGZvcm1hdC5zZXRJbmRlbnRpbmcodHJ1ZSk7IGZvcm1hdC5zZXRMaW5lU2VwYXJhdG9yKERPTVV0aWxpdGllcy5ORVdMSU5FX1NUUklORyk7Ci0JICogLy8kTk9OLU5MUy0xJCBmb3JtYXQuc2V0RW5jb2RpbmcoZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKLQkgKiBmb3JtYXQuc2V0VmVyc2lvbihnZXRSZXNvdXJjZSgpLmdldFhNTFZlcnNpb24oKSk7IGlmICh0aGlzLnJlc291cmNlICE9IG51bGwpCi0JICogZm9ybWF0LnNldERvY3R5cGUodGhpcy5yZXNvdXJjZS5nZXRQdWJsaWNJZCgpLCB0aGlzLnJlc291cmNlLmdldFN5c3RlbUlkKCkpOyByZXR1cm4gZm9ybWF0OyB9Ci0JICovCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcHJlcGFyZVRvQWRkQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZXBhcmVUb0FkZENvbnRlbnRzKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNnZXRWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKS5nZXRWZXJzaW9uSUQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZmQ1ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTksIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBVc2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIEVNRjJTQVhSZW5kZXJlcgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEVNRjJTQVhSZW5kZXJlckZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJlckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVNRjJTQVhSZW5kZXJlckZhY3RvcnkoKTsKLQotCXByb3RlY3RlZCBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkjY3JlYXRlUmVuZGVyZXIoKQotCSAqLwotCXB1YmxpYyBSZW5kZXJlciBjcmVhdGVSZW5kZXJlcigpIHsKLQkJRU1GMlNBWFJlbmRlcmVyIHJlbmRlcmVyID0gbmV3IEVNRjJTQVhSZW5kZXJlcigpOwotCQlyZW5kZXJlci5zZXRWYWxpZGF0aW5nKGlzVmFsaWRhdGluZygpKTsKLQkJcmV0dXJuIHJlbmRlcmVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhXcml0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk1NTczNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKLQotLyoqCi0gKiBUaGUgRU1GMlNBWFdyaXRlciBoYW5kbGVzIHRoZSBzZXJpYWxpemF0aW9uIG9mIEVNRiBSZXNvdXJjZXMgdXNpbmcgU0FYIGV2ZW50cy4gU0FYIGV2ZW50cyBhcmUKLSAqIHRyaWdnZXJlZCB0byB0aGUgY29udGVudCBoYW5kbGVyIGFzIHRoZSB0cmVlIGlzIGJlaW5nIHBhcnNlZC4gVGhlc2UgZXZlbnRzIGNhbiB0aGVuIGJlIHdyaXR0ZW4KLSAqIGludG8gYW55IHN0cmVhbSB3cmFwcGVkIGJ5IHRoZSBDb250ZW50SGFuZGxlci4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyU0FYV3JpdGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICIiOy8vImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBVc2VkIGluIHRob3NlIGNhc2VzIHdoZXJlIG5vIEF0dHJpYnV0ZXMgYXJlIG5lY2Vzc2FyeSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMgRU1QVFlfQVRUUklCVVRFUyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotCi0JLyoqCi0JICogU2VyaWFsaXplIGFuIEVNRiByZXNvdXJjZSBpbnRvIGFuIFhNTCBTdHJlYW0gdXNpbmcgdGhlIGdpdmVuIENvbnRlbnRIYW5kbGVyLiBOb3RlIHRoYXQgdGhpcwotCSAqIG1ldGhvZCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvcHkgYSBnaXZlbiBFTUYgUmVzb3VyY2UgaWYgdGhlIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIgaXMgdXNlZCBhcwotCSAqIHRoZSBnaXZlbiBDb250ZW50SGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNlcmlhbGl6ZShUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UsIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCVRyYW5zbGF0b3Igcm9vdFRyYW5zbGF0b3IgPSByZXNvdXJjZS5nZXRSb290VHJhbnNsYXRvcigpOwotCQlFTGlzdCBjb250ZW50cyA9IHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0KLQkJaWYgKGNvbnRlbnRzLnNpemUoKSAhPSAxKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgY29udGVudHMgb2YgYSByZXNvdXJjZSBtYXkgb25seSBjb250YWluIG9uZSBFTUYgTW9kZWwgT2JqZWN0LiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JCXNlcmlhbGl6ZShoYW5kbGVyLCBlbGVtZW50LCByb290VHJhbnNsYXRvciwgbmV3IFdyaXRlckhpbnRzKHJlc291cmNlKSk7Ci0JCWhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXJpYWxpemUoQ29udGVudEhhbmRsZXIgaGFuZGxlciwgRU9iamVjdCB0YXJnZXQsIFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgV3JpdGVySGludHMgaGludHMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCUxpc3QgbW9mQ2hpbGRyZW4gPSBudWxsOwotCQlPYmplY3QgcmF3VmFsdWUgPSBudWxsOwotCQlFT2JqZWN0IG5ld1RhcmdldCA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgY3VycmVudENoaWxkVHJhbnNsYXRvciA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgbmV4dFRyYW5zbGF0b3IgPSBudWxsOwotCQljaGFyW10gY2hhcmFjdGVyRGF0YSA9IG51bGw7Ci0JCVN0cmluZyBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG51bGw7Ci0JCVN0cmluZyBjaGlsZERvbU5hbWUgPSBudWxsOwotCQlmaW5hbCBpbnQgdmVyc2lvbiA9IGhpbnRzLmdldFZlcnNpb24oKTsKLQotCQkvKgotCQkgKiBQcm9jZXNzaW5nIGhpbnRzIGFyZSB1c2VkIHRvIHJlbWVtYmVyIHdoZXJlIGFyZSBpbiB0aGUgaXRlcmF0aW9uIG9mIHRoZSB0cmFuc2xhdG9yJ3MKLQkJICogY2hpbGRyZW4uIHNlZSB0aGUgVHJhbnNsYXRvckZpbHRlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdGhpcyBhcnJheSBpcyB1c2VkLgotCQkgKi8KLQkJaW50W10gcHJvY2Vzc2luZ0hpbnRzID0gVHJhbnNsYXRvckZpbHRlci5jcmVhdGVQcm9jZXNzaW5nSGludHMoKTsKLQotCQlTdHJpbmcgdGFyZ2V0RG9tTmFtZSA9IHRyYW5zbGF0b3IuZ2V0RE9NTmFtZSh0YXJnZXQpOwotCi0JCWF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKHRyYW5zbGF0b3IsIHRhcmdldCwgaGludHMpOwotCi0JCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgdGFyZ2V0RG9tTmFtZSwgdGFyZ2V0RG9tTmFtZSwgYXR0cmlidXRlcyk7Ci0KLQkJY3VycmVudENoaWxkVHJhbnNsYXRvciA9IFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dE9iamVjdFRyYW5zbGF0b3IodHJhbnNsYXRvciwgcHJvY2Vzc2luZ0hpbnRzW1RyYW5zbGF0b3JGaWx0ZXIuTkVYVF9TVEFSVF9ISU5UX0lORFhdLCBwcm9jZXNzaW5nSGludHMsIHRhcmdldCwgdmVyc2lvbik7Ci0JCXdoaWxlIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCS8qIEZvciBlYWNoIENoaWxkIFRyYW5zbGF0b3Igb2YgdGhlIFRyYW5zbGF0b3IgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIHRoZSBtZXRob2QgKi8KLQotCQkJLyogRG9lcyB0aGUgVHJhbnNsYXRvciBoYXZlIGFueSBNT0YgQ2hpbGRyZW4/ICovCi0JCQltb2ZDaGlsZHJlbiA9IGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuZ2V0TU9GQ2hpbGRyZW4odGFyZ2V0KTsKLQkJCW9wZW5Eb21QYXRoSWZOZWNlc3NhcnkoaGFuZGxlciwgaGludHMsIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIHRhcmdldCwgbW9mQ2hpbGRyZW4pOwotCi0JCQlpZiAoY3VycmVudENoaWxkVHJhbnNsYXRvci5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJLyoKLQkJCQkgKiBUcmFuc2xhdG9ycyB3aGljaCBhcmUgbWFuYWdlZCBieSB0aGVpciBwYXJlbnRzIHJlcXVpcmUgbGVzcyBwcm9jZXNzaW5nIC0tIGp1c3QKLQkJCQkgKiBjb252ZXJ0IHRoZWlyIHZhbHVlIHRvIGEgc3RyaW5nIGFuZCB3cml0ZSBpdCBvdXQgYXMgdGhlIGNvbnRlbnQgb2YgYW4gWE1MIGVsZW1lbnQKLQkJCQkgKi8KLQkJCQljaGlsZERvbU5hbWUgPSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmdldERPTU5hbWUodGFyZ2V0KTsKLQkJCQlpZiAoIWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaXNFbXB0eVRhZygpKSB7Ci0JCQkJCS8qIFRoZSBUcmFuc2xhdG9yIGlzIG5vdCBhbiBFbXB0eSB0YWcuIEl0cyB0ZXh0IGNvbnRlbnQgaXMgc2lnbmlmaWNhbnQgKi8KLQotCQkJCQlpZiAobW9mQ2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtb2ZDaGlsZHJlbi5zaXplKCk7IGorKykgewotCi0JCQkJCQkJLyogVGV4dCBvbmx5IHRyYW5zbGF0b3JzIHdpbGwgbm90IGhhdmUgb3BlbiBhbmQgY2xvc2UgWE1MIGVsZW1lbnRzICovCi0JCQkJCQkJaWYgKCFjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzRE9NVGV4dFZhbHVlKCkpCi0JCQkJCQkJCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsIEVNUFRZX0FUVFJJQlVURVMpOwotCi0JCQkJCQkJcmF3VmFsdWUgPSBtb2ZDaGlsZHJlbi5nZXQoaik7Ci0JCQkJCQkJLyogY29udmVydFZhbHVlVG9TdHJpbmcgc2hvdWxkIGFsd2F5cyByZXR1cm4gYSBub24tbnVsbCBTdHJpbmcgKi8KLQkJCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuY29udmVydFZhbHVlVG9TdHJpbmcocmF3VmFsdWUsIHRhcmdldCk7Ci0JCQkJCQkJY2hhcmFjdGVyRGF0YSA9IFhNTEVuY29kZXJEZWNvZGVyLmVzY2FwZShjb252ZXJ0ZWRWYWx1ZSkudG9DaGFyQXJyYXkoKTsKLQkJCQkJCQloYW5kbGVyLmNoYXJhY3RlcnMoY2hhcmFjdGVyRGF0YSwgMCwgY2hhcmFjdGVyRGF0YS5sZW5ndGgpOwotCi0JCQkJCQkJaWYgKCFjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzRE9NVGV4dFZhbHVlKCkpCi0JCQkJCQkJCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFRoZSBUcmFuc2xhdG9yIGlzIGFuIEVtcHR5IEVsZW1lbnQgKGl0cyBtZXJlIHByZXNlbmNlIGhhcyBzaWduaWZpY2FuY2UpIChlLmcuCi0JCQkJCSAqIDxjYXNjYWRlLWRlbGV0ZS8+Ci0JCQkJCSAqLwotCi0JCQkJCWlmIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzQm9vbGVhbkZlYXR1cmUoKSkgewotCQkJCQkJLyogQm9vbGVhbiBmZWF0dXJlcyBtYXkgb3IgbWF5IG5vdCBiZSByZW5kZXJlZCAqLwotCQkJCQkJcmF3VmFsdWUgPSBtb2ZDaGlsZHJlbi5nZXQoMCk7Ci0JCQkJCQlpZiAocmF3VmFsdWUgIT0gbnVsbCAmJiAoKEJvb2xlYW4pIHJhd1ZhbHVlKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsIEVNUFRZX0FUVFJJQlVURVMpOwotCQkJCQkJCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lKTsKLQkJCQkJCX0KLQotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogQWx3YXlzIHJlbmRlciBhbnkgb3RoZXIgRW1wdHkgZWxlbWVudHMgKi8KLQkJCQkJCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsIEVNUFRZX0FUVFJJQlVURVMpOwotCQkJCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQotCQkJCS8qIFRoZSBUcmFuc2xhdG9yIGlzIGEgbW9yZSBjb21wbGV4IGZlYXR1cmUsIGhhbmRsZSBpdHMgcHJvY2Vzc2luZyByZWN1cnNpdmVseSAqLwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBqKyspIHsKLQkJCQkJbmV3VGFyZ2V0ID0gKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChqKTsKLQkJCQkJc2VyaWFsaXplKGhhbmRsZXIsIG5ld1RhcmdldCwgY3VycmVudENoaWxkVHJhbnNsYXRvciwgaGludHMpOwotCQkJCX0KLQkJCX0KLQotCQkJLyogRmV0Y2ggdGhlIG5leHQgcGVlciB0cmFuc2xhdG9yICovCi0JCQluZXh0VHJhbnNsYXRvciA9IFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dE9iamVjdFRyYW5zbGF0b3IodHJhbnNsYXRvciwgcHJvY2Vzc2luZ0hpbnRzW1RyYW5zbGF0b3JGaWx0ZXIuTkVYVF9TVEFSVF9ISU5UX0lORFhdLCBwcm9jZXNzaW5nSGludHMsIHRhcmdldCwgdmVyc2lvbik7Ci0KLQkJCWNsb3NlRG9tUGF0aElmTmVjZXNzYXJ5KGhhbmRsZXIsIGhpbnRzLCBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBuZXh0VHJhbnNsYXRvciwgdGFyZ2V0LCBtb2ZDaGlsZHJlbik7Ci0KLQkJCS8qCi0JCQkgKiBXZSBuZWVkZWQgdG8gaW52b2tlIGNsb3NlRG9tUGF0aElmTmVjZXNzYXJ5KCkgd2l0aCB0aGUgcGVlciwgbm93IHdlIG1vdmUgb24gdG8KLQkJCSAqIHByb2Nlc3MgdGhhdCBwZWVyCi0JCQkgKi8KLQkJCWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IgPSBuZXh0VHJhbnNsYXRvcjsKLQotCQl9Ci0JCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIHRhcmdldERvbU5hbWUsIHRhcmdldERvbU5hbWUpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYSBET00gUGF0aCBzaG91bGQgYmUgcmVuZGVyZWQuIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwKLQkgKiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBFbXB0eSBYTUwgZWxlbWVudHMgYXJlIHJlbGV2YW50IGFuZCBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgWE1MCi0JICogc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIFRoZSBFTUYgVGFyZ2V0IG9mIHRoZSBUcmFuc2xhdGlvbgotCSAqIEBwYXJhbSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBUcmFuc2xhdG9yCi0JICogQHBhcmFtIG1vZkNoaWxkcmVuCi0JICogICAgICAgICAgICBUaGUgbW9mQ2hpbGRyZW4gdGhhdCB3ZXJlIGZvdW5kIGZvciB0aGUgVHJhbnNsYXRvciBvbiB0aGUgVGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRSZW5kZXJEb21QYXRoKEVPYmplY3QgdGFyZ2V0LCBUcmFuc2xhdG9yIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIExpc3QgbW9mQ2hpbGRyZW4pIHsKLQkJcmV0dXJuICAoY3VycmVudENoaWxkVHJhbnNsYXRvci5zaG91bGRSZW5kZXJFbXB0eURPTVBhdGgodGFyZ2V0KSB8fCBtb2ZDaGlsZHJlbi5zaXplKCkgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuRG9tUGF0aElmTmVjZXNzYXJ5IHdpbGwgd3JpdGUgdGhlIGN1cnJlbnQgRE9NIFBhdGggdG8gdGhlIHNlcmlhbGl6YXRpb24gc3RyZWFtIGlmIGl0IGhhcwotCSAqIG5vdCBiZWVuIHdyaXR0ZW4gYnkgYSBwcmV2aW91cyBwZWVyIHRyYW5zbGF0b3IuIFRoZSBwcm9jZXNzaW5nIHJlc3VsdHMgaW4gdGhlIGNvbGxhcHNlIG9mCi0JICogUGVlciBUcmFuc2xhdG9ycyB3aXRoIG1hdGNoaW5nIERPTSBQYXRocyBpbnRvIGEgc2luZ2xlIFhNTCBwYXJlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgVGhlIENvbnRlbnRIYW5kbGVyIHdoaWNoIGlzIHdyaXRpbmcgdGhlIFhNTCByZXN1bHQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiAgICAgICAgICAgIEEgR2xvYmFsIGNvbnRhaW5lciBmb3IgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBzaW5nbGUgWE1MIGRvY3VtZW50Ci0JICogQHBhcmFtIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IKLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgVHJhbnNsYXRvciBiZWluZyBwcm9jZXNzZWQKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBUaGUgRU1GIFRhcmdldCBvZiB0aGUgVHJhbnNsYXRpb24KLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRG9tUGF0aElmTmVjZXNzYXJ5KENvbnRlbnRIYW5kbGVyIGhhbmRsZXIsIFdyaXRlckhpbnRzIGhpbnRzLCBUcmFuc2xhdG9yIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIEVPYmplY3QgdGFyZ2V0LCBMaXN0IG1vZkNoaWxkcmVuKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQkvKiBJZiB0aGUgdHJhbnNsYXRvciBkb2VzIG5vdCBoYXZlIGEgRE9NIFBhdGgsIHRoZW4gd2UgZG8gbm90aGluZyAqLwotCQlpZiAoY3VycmVudENoaWxkVHJhbnNsYXRvci5oYXNET01QYXRoKCkgJiYgc2hvdWxkUmVuZGVyRG9tUGF0aCh0YXJnZXQsIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIG1vZkNoaWxkcmVuKSkgewotCi0JCQlTdHJpbmcgY2hpbGREb21QYXRoID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5nZXRET01QYXRoKCk7Ci0KLQkJCS8qCi0JCQkgKiBJc0RvbVBhdGhBY3RpdmUoKSB3aWxsIHZlcmlmeSB3aGV0aGVyIHRoaXMgRE9NIFBhdGggaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZQotCQkJICogWE1MIHN0cmVhbQotCQkJICovCi0JCQlpZiAoIWhpbnRzLmlzRG9tUGF0aEFjdGl2ZShjaGlsZERvbVBhdGgpKSB7Ci0KLQkJCQkvKgotCQkJCSAqIFdyaXRlIGFuIG9wZW4gZWxlbWVudCBmb3IgdGhlIERPTSBQYXRoIGFuZCAicmVtZW1iZXIiIHRoYXQgd2UgaGF2ZSB3cml0dGVuIGl0Ci0JCQkJICovCi0JCQkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbVBhdGgsIGNoaWxkRG9tUGF0aCwgRU1QVFlfQVRUUklCVVRFUyk7Ci0JCQkJaGludHMucHVzaERvbVBhdGgoY2hpbGREb21QYXRoKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvc2VEb21QYXRoSWZOZWNlc3Nhcnkgd2lsbCBkZXRlcm1pbmUgd2hldGhlciB0aGUgbmV4dCBwZWVyIFRyYW5zbGF0b3Igc2hhcmVzIHRoZSBhY3RpdmUgRE9NCi0JICogUGF0aCBvZiB0aGUgY3VycmVudCBUcmFuc2xhdG9yLiBJZiB0aGUgbmV4dCBwZWVyIFRyYW5zbGF0b3IgaGFzIHRoZSBzYW1lIERPTSBQYXRoLCBubyBhY3Rpb24KLQkgKiB3aWxsIGJlIHRha2VuIChoZW5jZSBjb25kZW5zaW5nIHRoZSBlbGVtZW50cyBpbnRvIGEgc2luZ2xlIFhNTCBwYXJlbnQpLiBIb3dldmVyLCBpZiB0aGUgRE9NCi0JICogUGF0aCBkaWZmZXJzIChpbmNsdWRpbmcgdGhlIE5leHQgUGVlciBUcmFuc2xhdG9yIGhhcyBubyBET00gUGF0aCkgdGhlbiB0aGUgY3VycmVudCBET00gUGF0aAotCSAqIHdpbGwgYmUgY2xvc2VkIChhIGNsb3NlIFhNTCBlbGVtZW50IGlzIGdlbmVyYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgVGhlIENvbnRlbnRIYW5kbGVyIHdoaWNoIGlzIHdyaXRpbmcgdGhlIFhNTCByZXN1bHQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiAgICAgICAgICAgIEEgR2xvYmFsIGNvbnRhaW5lciBmb3IgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBzaW5nbGUgWE1MIGRvY3VtZW50Ci0JICogQHBhcmFtIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IKLQkgKiAgICAgICAgICAgIFRoZSBsYXN0IFRyYW5zbGF0b3IgdG8gaGF2ZSBjb21wbGV0ZWQgcHJvY2Vzc2luZwotCSAqIEBwYXJhbSBuZXh0VHJhbnNsYXRvcgotCSAqICAgICAgICAgICAgVGhlIG5leHQgcGVlciBUcmFuc2xhdG9yIHRoYXQgd2lsbCBiZWNvbWUgYWN0aXZlCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgVGhlIEVNRiBUYXJnZXQgb2YgdGhlIFRyYW5zbGF0aW9uCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VEb21QYXRoSWZOZWNlc3NhcnkoQ29udGVudEhhbmRsZXIgaGFuZGxlciwgV3JpdGVySGludHMgaGludHMsIFRyYW5zbGF0b3IgY3VycmVudENoaWxkVHJhbnNsYXRvciwgVHJhbnNsYXRvciBuZXh0VHJhbnNsYXRvciwgRU9iamVjdCB0YXJnZXQsIExpc3QgbW9mQ2hpbGRyZW4pIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCWlmIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmhhc0RPTVBhdGgoKSAmJiBzaG91bGRSZW5kZXJEb21QYXRoKHRhcmdldCwgY3VycmVudENoaWxkVHJhbnNsYXRvciwgbW9mQ2hpbGRyZW4pKSB7Ci0JCQlTdHJpbmcgY2hpbGREb21QYXRoID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5nZXRET01QYXRoKCk7Ci0JCQlpZiAobmV4dFRyYW5zbGF0b3IgIT0gbnVsbCkgeyAvKgotCQkJCQkJCQkJCSAgICogVGhlcmUgYXJlIG1vcmUgcGVlcnMgYWZ0ZXIgdGhpcyBlbGVtZW50LCB3ZSBjYW4gcGVlawotCQkJCQkJCQkJCSAgICogYWhlYWQKLQkJCQkJCQkJCQkgICAqLwotCQkJCVN0cmluZyBuZXh0UGVlckRvbVBhdGggPSBuZXh0VHJhbnNsYXRvci5nZXRET01QYXRoKCk7Ci0JCQkJaWYgKG5leHRQZWVyRG9tUGF0aCA9PSBudWxsIHx8ICFuZXh0UGVlckRvbVBhdGguZXF1YWxzKGNoaWxkRG9tUGF0aCkpIHsKLQkJCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21QYXRoLCBjaGlsZERvbVBhdGgpOwotCQkJCQloaW50cy5wb3BEb21QYXRoKCk7Ci0JCQkJfQotCi0JCQl9IGVsc2UgeyAvKiBUaGlzIHdhcyB0aGUgbGFzdCBjaGlsZCBlbGVtZW50LCB3ZSBtdXN0IGNsb3NlIHRoZSBkb21wYXRoICovCi0JCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21QYXRoLCBjaGlsZERvbVBhdGgpOwotCQkJCWhpbnRzLnBvcERvbVBhdGgoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFnZ3JlZ2F0ZSB0aGUgQXR0cmlidXRlIHRyYW5zbGF0b3IgY2hpbGRyZW4gZnJvbSBhIGdpdmVuIHRyYW5zbGF0b3IuIFRoaXMgbWV0aG9kIHdpbGwgcmVxdWVzdAotCSAqIHRoZSBBdHRyaWJ1dGVzSW1wbCBvYmplY3QgZnJvbSB0aGUgV3JpdGVySGludHMgb2JqZWN0LiBUaGUgV3JpdGVySGludHMgbWFpbnRhaW5zIHRoaXMKLQkgKiByZXVzYWJsZSBjb2xsZWN0aW9uIHRvIGxpbWl0IHRoZSByZXF1aXJlbWVudCBmb3IgbmV3IG9iamVjdCBjcmVhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhbnNsYXRvcgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiBAcmV0dXJuIGFuIGluaXRpYWxpemVkIHNldCBvZiBBdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gVHJhbnNsYXRvciBhbmQgRU1GIFRhcmdldAotCSAqLwotCXByaXZhdGUgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgRU9iamVjdCB0YXJnZXQsIFdyaXRlckhpbnRzIGhpbnRzKSB7Ci0KLQkJQXR0cmlidXRlc0ltcGwgYXR0cmlidXRlcyA9IGhpbnRzLmdldEF0dHJpYnV0ZUhvbGRlcigpOwotCQlpbnQgdmVyc2lvbiA9IGhpbnRzLmdldFZlcnNpb24oKTsKLQkJT2JqZWN0IHJhd1ZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIGNoaWxkRG9tTmFtZSA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgYXR0cmlidXRlVHJhbnNsYXRvciA9IG51bGw7Ci0JCWludFtdIHByb2Nlc3NpbmdIaW50cyA9IFRyYW5zbGF0b3JGaWx0ZXIuY3JlYXRlUHJvY2Vzc2luZ0hpbnRzKCk7Ci0KLQkJd2hpbGUgKChhdHRyaWJ1dGVUcmFuc2xhdG9yID0gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0QXR0cmlidXRlVHJhbnNsYXRvcih0cmFuc2xhdG9yLCBwcm9jZXNzaW5nSGludHNbVHJhbnNsYXRvckZpbHRlci5ORVhUX1NUQVJUX0hJTlRfSU5EWF0sIHByb2Nlc3NpbmdIaW50cywgdGFyZ2V0LCB2ZXJzaW9uKSkgIT0gbnVsbCkgewotCi0JCQlMaXN0IG1vZkNoaWxkcmVuID0gYXR0cmlidXRlVHJhbnNsYXRvci5nZXRNT0ZDaGlsZHJlbih0YXJnZXQpOwotCQkJaWYgKG1vZkNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaisrKSB7Ci0KLQkJCQkJY2hpbGREb21OYW1lID0gYXR0cmlidXRlVHJhbnNsYXRvci5nZXRET01OYW1lKHRhcmdldCk7Ci0JCQkJCXJhd1ZhbHVlID0gbW9mQ2hpbGRyZW4uZ2V0KGopOwotCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IGF0dHJpYnV0ZVRyYW5zbGF0b3IuY29udmVydFZhbHVlVG9TdHJpbmcocmF3VmFsdWUsIHRhcmdldCk7Ci0JCQkJCWNvbnZlcnRlZFZhbHVlID0gWE1MRW5jb2RlckRlY29kZXIuZXNjYXBlKGNvbnZlcnRlZFZhbHVlKTsKLQkJCQkJYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgIlN0cmluZyIsIGNvbnZlcnRlZFZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQljaGlsZERvbU5hbWUgPSBhdHRyaWJ1dGVUcmFuc2xhdG9yLmdldERPTU5hbWUodGFyZ2V0KTsKLQkJCQljb252ZXJ0ZWRWYWx1ZSA9IChTdHJpbmcpIGF0dHJpYnV0ZVRyYW5zbGF0b3IuZ2V0TU9GVmFsdWUodGFyZ2V0KTsKLQkJCQlpZiAoY29udmVydGVkVmFsdWUgIT0gbnVsbCkKLQkJCQkJYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgIlN0cmluZyIsIGNvbnZlcnRlZFZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIFdyaXRlckhpbnRzIGlzIHVzZWQgdG8gInJlbWVtYmVyIiBjZXJ0YWluIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB3aGlsZSB0aGUgd3JpdGVyIGlzCi0JICogcHJvY2Vzc2luZy4gT2YgcGFydGljdWxhciBpbnRlcmVzdCBhcmUgdGhlIHZlcnNpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgRE9NIFBhdGggb3V0cHV0LgotCSAqIENvbnNlY3V0aXZlIGVsZW1lbnRzIHdpdGggY29uc2lzdGVudCAoaWRlbnRpY2FsKSBET00gUGF0aHMgYXJlIGNvbGxhcHNlZCB1bmRlciBhIHNpbmdsZSBYTUwKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIFRoZSBXcml0ZXJIaW50cyBwcm92aWRlcyBnbG9iYWwgc3RhdGUgYmV0d2VlbiByZWN1cnNpdmUgaW52b2NhdGlvbnMgb2Ygc2VyaWFsaXplKCkuIEl0IHNob3VsZAotCSAqIGJlIG5vdCBiZSB1c2VkIHRvIHN0b3JlIGxvY2FsIGRhdGEgKGUuZy4gZGF0YSB0aGF0IGlzIG9ubHkgcmVsZXZhbnQgdG8gYSBzaW5nbGUgVHJhbnNsYXRvciBpbgotCSAqIGEgZ2l2ZW4gY29udGV4dCkuCi0JICogCi0JICogVGhlIFdyaXRlckhpbnRzIGFsc28gc3RvcmVzIGFuIEF0dHJpYnV0ZXNJbXBsIG9iamVjdCB0aGF0IGlzIHJlLXVzZWQgdG8gc3RvcmUgYXR0cmlidXRlcy4gVGhlCi0JICogZ2V0QXR0cmlidXRlcygpIG1ldGhvZCB3aWxsIHJlcXVlc3QgdGhlIEF0dHJpYnV0ZXMgSG9sZGVyLgotCSAqIAotCSAqIEBhdXRob3IgbWRlbGRlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBjbGFzcyBXcml0ZXJIaW50cyB7Ci0JCXByaXZhdGUgZmluYWwgVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlOwotCQlwcml2YXRlIGZpbmFsIFN0YWNrIGRvbVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCXByaXZhdGUgZmluYWwgQXR0cmlidXRlc0ltcGwgYXR0cmlidXRlc0ltcGwgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKLQotCQlwdWJsaWMgV3JpdGVySGludHMoVHJhbnNsYXRvclJlc291cmNlIHJlcykgewotCQkJdGhpcy5yZXNvdXJjZSA9IHJlczsKLQkJfQotCi0JCS8qKgotCQkgKiBQdXNoIGEgbmV3IGRvbVBhdGggb250byB0aGUgc3RhY2sKLQkJICogCi0JCSAqIEBwYXJhbSBkb21QYXRoCi0JCSAqICAgICAgICAgICAgYSBET01QYXRoIHdoaWNoIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIFhNTCBzdHJlYW0KLQkJICovCi0JCXB1YmxpYyB2b2lkIHB1c2hEb21QYXRoKFN0cmluZyBkb21QYXRoKSB7Ci0KLQkJCWlmIChkb21QYXRoICE9IG51bGwgJiYgZG9tUGF0aC5sZW5ndGgoKSA+IDApCi0JCQkJZG9tU3RhY2sucHVzaChkb21QYXRoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQb3AgdGhlIGN1cnJlbnQgZG9tUGF0aCBmcm9tIHRoZSBBcnJheQotCQkgKi8KLQkJcHVibGljIHZvaWQgcG9wRG9tUGF0aCgpIHsKLQotCQkJaWYgKCFkb21TdGFjay5pc0VtcHR5KCkpCi0JCQkJZG9tU3RhY2sucG9wKCk7Ci0JCX0KLQotCQkvKioKLQkJICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gRE9NUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIFhNTCBzdHJlYW0KLQkJICogCi0JCSAqIEBwYXJhbSBkb21QYXRoCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gRE9NUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIFhNTCBzdHJlYW0KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzRG9tUGF0aEFjdGl2ZShTdHJpbmcgZG9tUGF0aCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmICghZG9tU3RhY2suaXNFbXB0eSgpKSB7Ci0KLQkJCQlTdHJpbmcgY3VycmVudERvbVBhdGggPSAoU3RyaW5nKSBkb21TdGFjay5wZWVrKCk7Ci0JCQkJaWYgKGN1cnJlbnREb21QYXRoICE9IG51bGwgJiYgZG9tUGF0aCAhPSBudWxsKQotCQkJCQlyZXN1bHQgPSBjdXJyZW50RG9tUGF0aC5lcXVhbHMoZG9tUGF0aCk7Ci0JCQkJZWxzZSBpZiAoIShjdXJyZW50RG9tUGF0aCA9PSBudWxsIF4gZG9tUGF0aCA9PSBudWxsKSkKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBFTUYgUmVzb3VyY2UKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLQkJCXJldHVybiB0aGlzLnJlc291cmNlLmdldFZlcnNpb25JRCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgYW4gZW1wdHkgQXR0cmlidXRlc0ltcGwgb2JqZWN0IHRvIHN0b3JlIGF0dHJpYnV0ZXMuIFdpdGhpbiB0aGUgY29udGV4dCBvZiBhIGdpdmVuCi0JCSAqIFdyaXRlckhpbnRzIG9iamVjdCAoYW5kIGhlbmNlIHNpbmdsZSBYTUwgZG9jdW1lbnQpLCB0aGUgb2JqZWN0IHJldHVybmVkIGlzIGEgc2luZ2xldG9uLgotCQkgKiBUaGUgc2FtZSBBdHRyaWJ1dGVzSW1wbCBvYmplY3QgaXMgY2xlYXJlZCBhbmQgcmV1c2VkIGZvciBlYWNoIGludm9jYXRpb24uCi0JCSAqIAotCQkgKiBAcmV0dXJuIGFuIGVtcHR5IEF0dHJpYnV0ZXNJbXBsIG9iamVjdCB0byBzdG9yZSBhdHRyaWJ1dGVzCi0JCSAqLwotCQlwdWJsaWMgQXR0cmlidXRlc0ltcGwgZ2V0QXR0cmlidXRlSG9sZGVyKCkgewotCQkJdGhpcy5hdHRyaWJ1dGVzSW1wbC5jbGVhcigpOwotCQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc0ltcGw7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjNkYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5EZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIERlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgTWFwLyo8U3RyaW5nIHNob3J0TmFtZSwgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcj4qLyBkZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKCk7IAotCXByaXZhdGUgTWFwLyo8UmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciwgUmVzb3VyY2UuRmFjdG9yeT4qLyBmYWN0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyBGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlLkZhY3RvcnkgdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgVVJJJ3MgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlJbXBsI2dldEZhY3RvcnkoVVJJKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RmlsZU5hbWVGYWN0b3J5KFVSSSB1cmkpIHsKLQotCQlpZih1cmkgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih1cmkpOwotCQkJCi0JCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0RmFjdG9yeShkZXNjcmlwdG9yKTsJCi0JCQl9CQotCQl9Ci0JCXJldHVybiBudWxsOwotCQkKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShVUkkgdXJpKSB7Ci0JCXJldHVybiBnZXRGYWN0b3J5KHVyaSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShVUkkgdXJpLCBTdHJpbmcgY29udGVudFR5cGUpCi0JewotCQlSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSA9IG51bGw7Ci0JCWlmKHVyaSAhPSBudWxsICYmIHVyaS5sYXN0U2VnbWVudCgpICE9IG51bGwpIHsKLQkJCVJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IodXJpKTsKLQkJCQotCQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VGYWN0b3J5ID0gZ2V0RmFjdG9yeShkZXNjcmlwdG9yKTsJCi0JCQl9CQotCQl9Ci0JCWlmKHJlc291cmNlRmFjdG9yeSA9PSBudWxsKQotCQkJcmVzb3VyY2VGYWN0b3J5ID0gc3VwZXIuZ2V0RmFjdG9yeSh1cmksIGNvbnRlbnRUeXBlKTsKLQkJcmV0dXJuIHJlc291cmNlRmFjdG9yeTsgCi0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBmaWxlIG5hbWUgcmVwcmVzZW50aW5nIHRoZSBsYXN0IHNlZ21lbnQgb2YgYSBVUkkgd2l0aCB0aGUgY29ycmVzcG9uZGluZwotCSAqIFJlc291cmNlLkZhY3RvcnkuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KFN0cmluZyBhU2ltcGxlRmlsZU5hbWUsIFJlc291cmNlLkZhY3RvcnkgYUZhY3RvcnkpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoYVNpbXBsZUZpbGVOYW1lKTsKLQkJU3RyaW5nIGxhc3RTZWdtZW50ID0gdXJpLmxhc3RTZWdtZW50KCk7IAotCQlhZGREZXNjcmlwdG9yKG5ldyBTdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKGxhc3RTZWdtZW50LCBhRmFjdG9yeSkpOwkJCi0JfSAKLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKFVSSSB1cmkpIHsKLQkJcmV0dXJuIChSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQodXJpLmxhc3RTZWdtZW50KCkpOwotCX0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIE1hcCBnZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBzeW5jaHJvbml6ZWQgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeyAgCi0JCVJlc291cmNlLkZhY3RvcnkgZmFjdG9yeSA9IChGYWN0b3J5KSBmYWN0b3JpZXMuZ2V0KGRlc2NyaXB0b3IpOwotCQlpZihmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3Rvcmllcy5wdXQoZGVzY3JpcHRvciwgKGZhY3RvcnkgPSBkZXNjcmlwdG9yLmNyZWF0ZUZhY3RvcnkoKSkpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0b3IoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7IAotCQlkZXNjcmlwdG9ycy5wdXQoZGVzY3JpcHRvci5nZXRTaG9ydFNlZ21lbnQoKSwgZGVzY3JpcHRvcik7Ci0JfQotIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvR2VuZXJpY1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0dlbmVyaWNUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmUwOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvR2VuZXJpY1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBTcGVjaWFsaXplZCB0cmFuc2xhdG9yIGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBzaW1wbGUgbWFwcGluZ3Mgd2l0aCBubyBzcGVjaWFsaXplZCBiZWhhdmlvci4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGVDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gcGF0aHMKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gcGF0aHMpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRocyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgRUNsYXNzIGVDbGFzcykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIGVDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUcmFuc2xhdG9yW10KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICogICAgICAgICAgICBUaGUgY2hpbGRyZW4gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBhcHBlbmRDaGlsZHJlbihHZW5lcmljVHJhbnNsYXRvciB0cmFuLCBUcmFuc2xhdG9yW10gY2hpbGQpIHsKLQkJVHJhbnNsYXRvcltdIG9yZ0NoaWxkID0gdHJhbi5nZXRDaGlsZHJlbigpOwotCQlUcmFuc2xhdG9yW10gbmV3Q2hpbGRyZW4gPSAoVHJhbnNsYXRvcltdKSBjb25jYXQob3JnQ2hpbGQsIGNoaWxkKTsKLQkJdHJhbi5zZXRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCXJldHVybiB0cmFuOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBhcHBlbmRDaGlsZChHZW5lcmljVHJhbnNsYXRvciB0cmFuLCBUcmFuc2xhdG9yIGNoaWxkKSB7Ci0JCU9iamVjdFtdIG9yZ0NoaWxkID0gdHJhbi5nZXRDaGlsZHJlbigpOwotCQlUcmFuc2xhdG9yW10gbmV3Q2hpbGRyZW4gPSAoVHJhbnNsYXRvcltdKSBjb25jYXQob3JnQ2hpbGQsIGNoaWxkKTsKLQkJdHJhbi5zZXRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCXJldHVybiB0cmFuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JRFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lEVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGJmNmEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lEVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIElEVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCXB1YmxpYyBjbGFzcyBOb1Jlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkJcHVibGljIE5vUmVzb3VyY2VFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIE5vUmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgSURfRkVBVFVSRSA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzX0VJREF0dHJpYnV0ZSgpOwotCXN0YXRpYyBmaW5hbCBwdWJsaWMgSURUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IElEVHJhbnNsYXRvcigpOwotCi0JcHVibGljIElEVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoImlkIiwgSURfRkVBVFVSRSwgRE9NX0FUVFJJQlVURSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCVhNSVJlc291cmNlIHJlcyA9IChYTUlSZXNvdXJjZSkgZW1mT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTm9SZXNvdXJjZUV4Y2VwdGlvbigpOwotCQlTdHJpbmcgaWQgPSByZXMuZ2V0SUQoZW1mT2JqZWN0KTsKLQkJaWYgKGlkID09IG51bGwgJiYgdmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKChpZCAhPSBudWxsICYmICFpZC5lcXVhbHModmFsdWUpKSB8fCAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKGlkKSkpCi0JCQlyZXMuc2V0SUQoZW1mT2JqZWN0LCAoU3RyaW5nKSB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTm9SZXNvdXJjZUV4Y2VwdGlvbigpOwotCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpIGVtZk9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE5vUmVzb3VyY2VFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlcy5nZXRJRChlbWZPYmplY3QpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lETWFwKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JUm9vdE9iamVjdFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JUm9vdE9iamVjdFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDgxMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvSVJvb3RPYmplY3RSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJvb3RPYmplY3RSZXNvdXJjZSB7Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRSb290T2JqZWN0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0xpbmtVcGRhdGVyVGFyZ2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9MaW5rVXBkYXRlclRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWNkMWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0xpbmtVcGRhdGVyVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTGlua1VwZGF0ZXJUYXJnZXQgZXh0ZW5kcyBPYmplY3QgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rVXBkYXRlclRhcmdldCBJTlNUQU5DRSA9IG5ldyBMaW5rVXBkYXRlclRhcmdldCgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExpbmtVcGRhdGVyTXVsdGlUYXJnZXQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKi8KLQlwcml2YXRlIExpbmtVcGRhdGVyVGFyZ2V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdXBkYXRlRE9NKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXJlZnJlc2hTb3VyY2VPYmplY3RzKG1hcCwgbm9kZSwgbW9mT2JqZWN0LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0YoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJcmVmcmVzaFNvdXJjZU9iamVjdHMobWFwLCBub2RlLCBtb2ZPYmplY3QsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU291cmNlT2JqZWN0cyhUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCwgYm9vbGVhbiBkb21VcGRhdGUpIHsKLQkJVHJhbnNsYXRvclBhdGhbXSBwYXRocyA9IG1hcC5nZXRUcmFuc2xhdG9yUGF0aHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJVHJhbnNsYXRvclBhdGggcGF0aCA9IHBhdGhzW2ldOwotCQkJTGlzdCBhbGxTb3VyY2VPYmplY3RzID0gcGF0aC5maW5kT2JqZWN0cyhtb2ZPYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsU291cmNlT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGN1ck9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlFTUYyRE9NQWRhcHRlciBjdXJBZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihjdXJPYmplY3QuZUFkYXB0ZXJzKCksIEVNRjJET01BZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoY3VyQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWlmIChkb21VcGRhdGUpCi0JCQkJCQljdXJBZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJCQllbHNlCi0JCQkJCQljdXJBZGFwdGVyLnVwZGF0ZU1PRigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9NYXBwZWRYTUlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL01hcHBlZFhNSUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDkzOWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL01hcHBlZFhNSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5JRFV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwZWRYTUlIZWxwZXIgZXh0ZW5kcyBYTUxIZWxwZXJJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLU1BBQ0VfUFJPVE9DT0wgPSAid29ya3NwYWNlOi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MID0gInBsYXRmb3JtOi9yZXNvdXJjZS8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIE5VTExfRkVBVFVSRSA9IG5ldyBVbnN1cHBvcnRlZEZlYXR1cmUoKTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2luZ01hcHMgPSB0cnVlOwotCXByb3RlY3RlZCBNYXAgY2FjaGVkUmVsYXRpdmVVUklzOwotCXByb3RlY3RlZCBNYXAgcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hcHBlZFhNTEhlbHBlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgTWFwcGVkWE1JSGVscGVyKFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgcHJlZml4ZXNUb1VSSXMpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCQl0aGlzLnByZWZpeGVzVG9VUklzLnB1dEFsbChwcmVmaXhlc1RvVVJJcyk7Ci0JCXB1c2hDb250ZXh0KCk7IC8vTmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIGNvbnRleHQgdG8gemVybwotCQlTZXQga2V5cyA9IHByZWZpeGVzVG9VUklzLmtleVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHVyaSA9IChTdHJpbmcpIHByZWZpeGVzVG9VUklzLmdldChwcmVmaXgpOwotCQkJbmFtZXNwYWNlU3VwcG9ydC5kZWNsYXJlUHJlZml4KHByZWZpeCwgdXJpKTsKLQkJfQotCi0JfQotCi0JcHVibGljIFVSSSByZXNvbHZlKFVSSSByZWxhdGl2ZSwgVVJJIGJhc2UpIHsKLQkJVVJJIHJlc29sdmVkID0gbnVsbDsKLQkJYm9vbGVhbiBpc01hcHBlZCA9IGZhbHNlOwotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJVVJJIGxvY2FscmVzb3VyY2VVUkkgPSBudWxsOwotCQkJaWYgKHJlbGF0aXZlLmhhc0ZyYWdtZW50KCkpCi0JCQkJbG9jYWxyZXNvdXJjZVVSSSA9IHJlbGF0aXZlLnRyaW1GcmFnbWVudCgpOwotCQkJZWxzZQotCQkJCWxvY2FscmVzb3VyY2VVUkkgPSByZWxhdGl2ZTsKLQkJCWlzTWFwcGVkID0gISgoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKSBzZXQuZ2V0VVJJQ29udmVydGVyKCkuZ2V0VVJJTWFwKCkpLmdldFVSSShsb2NhbHJlc291cmNlVVJJKS5lcXVhbHMobG9jYWxyZXNvdXJjZVVSSSkpOwotCQl9Ci0JCWlmICghaXNNYXBwZWQpIHsKLQkJCWlmIChpc1VzaW5nQ29udGFpbmVyUmVsYXRpdmVQYXRocygpICYmIHNldCAhPSBudWxsKQotCQkJCXJlc29sdmVkID0gc2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZShyZWxhdGl2ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNvbHZlZCA9IHJlbGF0aXZlOwotCQl9Ci0JCXJldHVybiByZXNvbHZlZCA9PSBudWxsID8gc3VwZXIucmVzb2x2ZShyZWxhdGl2ZSwgYmFzZSkgOiByZXNvbHZlZDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaXNVc2luZ0NvbnRhaW5lclJlbGF0aXZlUGF0aHMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVXNpbmdDb250YWluZXJSZWxhdGl2ZVBhdGhzKCkgewotCQlyZXR1cm4gKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIHJlc291cmNlKS5nZXRGb3JtYXQoKSA9PSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX01PRjUgfHwgdXNpbmdNYXBzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCS8qCi0JCSAqIHByb2JsZW0gLSB0aGUgaW5jb21pbmcga2V5IHZhbHVlIHBhaXIgaXMgZWpiYm5kLT5lamJibmQueG1pOyBob3dldmVyLCB0aGUgbWFwIGFscmVhZHkgaGFzCi0JCSAqIGEga2V5IHZhbHVlIHBhaXIgb2YgZWpiYm5kLT5odHRwOi8vL2VqYmJuZC5lY29yZQotCQkgKi8KLQkJaWYgKHVyaS5lbmRzV2l0aCgiLmVjb3JlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdXNpbmdNYXBzID0gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGV4aXN0aW5nID0gKFN0cmluZykgcHJlZml4ZXNUb1VSSXMuZ2V0KHByZWZpeCk7Ci0JCWlmIChleGlzdGluZyA9PSBudWxsKSB7Ci0JCQlwcmVmaXhlc1RvVVJJcy5wdXQocHJlZml4LCB1cmkpOwotCQkJbmFtZXNwYWNlU3VwcG9ydC5kZWNsYXJlUHJlZml4KHByZWZpeCwgdXJpKTsKLQkJfSBlbHNlIGlmICghZXhpc3RpbmcuZXF1YWxzKHVyaSkpIHsKLQkJCWdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLmFkZE9yaWdpbmFsUGFja2FnZVVSSShleGlzdGluZywgdXJpKTsKLQkJCWdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLnNldEZvcm1hdChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX01PRjUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSBnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSBnZXRSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjZ2V0SFJFRihFT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SFJFRihFT2JqZWN0IG9iaikgewotCQlpZiAoIWdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLnVzZXNEZWZhdWx0Rm9ybWF0KCkpIHsKLQkJCVVSSUNvbnZlcnRlciBjb252ID0gZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQlpZiAoY29udiAhPSBudWxsICYmIGNvbnYgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyKSB7Ci0JCQkJU3RyaW5nIGhyZWYgPSBnZXRDb21wYXRpYmxpbHR5SFJFRihvYmosIChDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyKSBjb252KTsKLQkJCQlyZXR1cm4gdXNlV29ya3NwYWNlUHJvdG9jb2xJZk5lY2Vzc2FyeShocmVmKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SFJFRihvYmopOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIGhyZWYKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2VXb3Jrc3BhY2VQcm90b2NvbElmTmVjZXNzYXJ5KFN0cmluZyBocmVmKSB7Ci0JCWlmIChocmVmICE9IG51bGwgJiYgaHJlZi5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKSkKLQkJCXJldHVybiBXT1JLU1BBQ0VfUFJPVE9DT0wgKyBocmVmLnN1YnN0cmluZygxOSk7Ci0JCXJldHVybiBocmVmOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENvbXBhdGlibGlsdHlIUkVGKEVPYmplY3Qgb2JqLCBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyIGNvbnYpIHsKLQkJLy9JbXBsZW1lbnRhdGlvbiBjb3BpZWQgZnJvbSBzdXBlci5nZXRIUkVGKEVPYmplY3QpCi0JCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgb2JqOwotCi0JCVVSSSBvYmplY3RVUkkgPSBvLmVQcm94eVVSSSgpOwotCQlpZiAob2JqZWN0VVJJID09IG51bGwpIHsKLQkJCVJlc291cmNlIG90aGVyUmVzb3VyY2UgPSBvYmouZVJlc291cmNlKCk7Ci0JCQlpZiAob3RoZXJSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJb2JqZWN0VVJJID0gaGFuZGxlRGFuZ2xpbmdIUkVGKG9iaik7Ci0JCQkJaWYgKG9iamVjdFVSSSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCW9iamVjdFVSSSA9IG90aGVyUmVzb3VyY2UuZ2V0VVJJKCkuYXBwZW5kRnJhZ21lbnQob3RoZXJSZXNvdXJjZS5nZXRVUklGcmFnbWVudChvYmopKTsKLQkJfQotCi0JCS8vTW9kaWZpZWQgdG8gZGlzcGF0Y2ggYmFjayB0byBVUkkgQ29udmVydGVyCi0JCWlmICghb2JqZWN0VVJJLmlzUmVsYXRpdmUoKSkgewotCQkJb2JqZWN0VVJJID0gbWFrZVJlbGF0aXZlKG9iamVjdFVSSSwgY29udik7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBVUkkgbWFrZVJlbGF0aXZlKFVSSSBvYmplY3RVUkksIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIgY29udikgewotCQlTdHJpbmcgZnJhZ21lbnQgPSBvYmplY3RVUkkuZnJhZ21lbnQoKTsKLQkJb2JqZWN0VVJJID0gb2JqZWN0VVJJLnRyaW1GcmFnbWVudCgpOwotCQlVUkkgcmVsYXRpdmUgPSAoVVJJKSBnZXRDYWNoZWRSZWxhdGl2ZVVSSXMoKS5nZXQob2JqZWN0VVJJKTsKLQkJaWYgKHJlbGF0aXZlID09IG51bGwpIHsKLQkJCXJlbGF0aXZlID0gY29udi5kZU5vcm1hbGl6ZShvYmplY3RVUkkpOwotCQkJaWYgKHJlbGF0aXZlLmlzUmVsYXRpdmUoKSkKLQkJCQljYWNoZWRSZWxhdGl2ZVVSSXMucHV0KG9iamVjdFVSSSwgcmVsYXRpdmUpOwotCQl9Ci0JCXJldHVybiByZWxhdGl2ZS5hcHBlbmRGcmFnbWVudChmcmFnbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIFVSSUNvbnZlcnRlciBnZXRVUklDb252ZXJ0ZXIoKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKHNldCAhPSBudWxsKQotCQkJcmV0dXJuIHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRDYWNoZWRSZWxhdGl2ZVVSSXMoKSB7Ci0JCWlmIChjYWNoZWRSZWxhdGl2ZVVSSXMgPT0gbnVsbCkKLQkJCWNhY2hlZFJlbGF0aXZlVVJJcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBjYWNoZWRSZWxhdGl2ZVVSSXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbCNnZXRJRChFT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoRU9iamVjdCBvYmopIHsKLQkJaWYgKGdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLnVzZXNEZWZhdWx0Rm9ybWF0KCkpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0SUQob2JqKTsKLQkJcmV0dXJuIElEVXRpbC5nZXRPckFzc2lnbklEKG9iaiwgcmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXROU0luZm8oRVBhY2thZ2UgcGtnKSB7Ci0JCVN0cmluZyBwcmVmaXggPSBnZXRNYXBwZWRQcmVmaXgocGtnKTsKLQkJaWYgKHByZWZpeCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtwa2cuZ2V0TnNQcmVmaXgoKSwgcGtnLmdldE5zVVJJKCl9OwotCQlyZXR1cm4gbmV3IFN0cmluZ1tde3ByZWZpeCwgcHJlZml4ICsgIi54bWkifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGVkUHJlZml4KEVQYWNrYWdlIHBrZykgewotCQlTdHJpbmcgbnNVUkkgPSBwa2cuZ2V0TnNVUkkoKTsKLQkJaWYgKHVzaW5nTWFwcyB8fCAhZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkudXNlc0RlZmF1bHRGb3JtYXQoKSkKLQkJCXJldHVybiAoU3RyaW5nKSBwYWNrYWdlVVJJc1RvUHJlZml4ZXMuZ2V0KG5zVVJJKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwZWRQcmVmaXhPckRlZmF1bHQoRVBhY2thZ2UgcGtnKSB7Ci0JCVN0cmluZyBwcmVmaXggPSBnZXRNYXBwZWRQcmVmaXgocGtnKTsKLQkJcmV0dXJuIHByZWZpeCA9PSBudWxsID8gcGtnLmdldE5zUHJlZml4KCkgOiBwcmVmaXg7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlVVJJc1RvUHJlZml4ZXMuCi0JICogCi0JICogQHJldHVybiBNYXAKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpIHsKLQkJcmV0dXJuIHBhY2thZ2VVUklzVG9QcmVmaXhlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwYWNrYWdlVVJJc1RvUHJlZml4ZXMuCi0JICogCi0JICogQHBhcmFtIHBhY2thZ2VVUklzVG9QcmVmaXhlcwotCSAqICAgICAgICAgICAgVGhlIHBhY2thZ2VVUklzVG9QcmVmaXhlcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoTWFwIHBhY2thZ2VVUklzVG9QcmVmaXhlcykgewotCQl0aGlzLnBhY2thZ2VVUklzVG9QcmVmaXhlcyA9IHBhY2thZ2VVUklzVG9QcmVmaXhlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFFOYW1lKEVDbGFzcyBjKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZShjKTsKLQotCQlpZiAoeG1sTWFwICE9IG51bGwpIHsKLQkJCVhNTFJlc291cmNlLlhNTEluZm8gY2xzSW5mbyA9IHhtbE1hcC5nZXRJbmZvKGMpOwotCi0JCQlpZiAoY2xzSW5mbyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGNsc0luZm8uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJcmV0dXJuIGdldFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgbmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlFUGFja2FnZSBwID0gYy5nZXRFUGFja2FnZSgpOwotCQlwYWNrYWdlcy5wdXQocCwgbnVsbCk7Ci0KLQkJaWYgKHAuZ2V0TnNQcmVmaXgoKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkIAotCQkJcmV0dXJuIG5hbWU7Ci0KLQkJLy9Nb2RpZmllZCBmcm9tIHN1cGVyY2xhc3MKLQkJLy9yZXR1cm4gcC5nZXROc1ByZWZpeCgpICsgIjoiICsgbmFtZTsKLQkJcmV0dXJuIGdldE1hcHBlZFByZWZpeE9yRGVmYXVsdChwKSArICI6IiArIG5hbWU7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbCNzZXRWYWx1ZShFT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUsCi0JICogICAgICBPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IHBvc2l0aW9uKSB7Ci0JCWlmIChmZWF0dXJlID09IE5VTExfRkVBVFVSRSkKLQkJCXJldHVybjsKLQkJaWYgKCFmZWF0dXJlLmlzVHJhbnNpZW50KCkpIHsKLQkJCWlmICh2YWx1ZSA9PSBudWxsICYmIGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgIT0gbnVsbCAmJiBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpLmlzUHJpbWl0aXZlKCkpCi0JCQkJLy9Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIE1PRjUgd2hlcmUgdHlwZXMgbGlrZSBJbnRlZ2VyIG1pZ2h0IGhhdmUgYmVlbiBzZXQKLQkJCQkvL2FuZCBzZXJpYWxpemVkIGFzICJ4c2k6bmlsIgotCQkJCXJldHVybjsKLQotCQkJc3VwZXIuc2V0VmFsdWUob2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwgcG9zaXRpb24pOwotCQl9Ci0JfQotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXIjZ2V0RmVhdHVyZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoRUNsYXNzIGVDbGFzcywgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNFbGVtZW50KSB7Ci0JCWlmIChVbnN1cHBvcnRlZEZlYXR1cmUuaXNVbnN1cHBvcnRlZChlQ2xhc3MsIG5hbWUpKQotCQkJcmV0dXJuIE5VTExfRkVBVFVSRTsKLQkJcmV0dXJuIHN1cGVyLmdldEZlYXR1cmUoZUNsYXNzLCBuYW1lc3BhY2VVUkksIG5hbWUsIGlzRWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlciNnZXRGZWF0dXJlS2luZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RmVhdHVyZUtpbmQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gTlVMTF9GRUFUVVJFKQotCQkJcmV0dXJuIFhNTEhlbHBlci5EQVRBVFlQRV9TSU5HTEU7Ci0JCXJldHVybiBzdXBlci5nZXRGZWF0dXJlS2luZChmZWF0dXJlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9NdWx0aU9iamVjdFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL011bHRpT2JqZWN0VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWVkNWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL011bHRpT2JqZWN0VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMzEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTXVsdGlPYmplY3RUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIEVNUFRZX1RSQU5TTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXXt9OwotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIE11bHRpT2JqZWN0VHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBUcmFuc2xhdG9yIGdldERlbGVnYXRlRm9yKEVPYmplY3Qgbyk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgVHJhbnNsYXRvciBnZXREZWxlZ2F0ZUZvcihTdHJpbmcgZG9tTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpOwotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBnZXREZWxlZ2F0ZUZvcihub2RlTmFtZSwgcmVhZEFoZWFkTmFtZSkuY3JlYXRlRU1GT2JqZWN0KG5vZGVOYW1lLCByZWFkQWhlYWROYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb24pIHsKLQkJaWYgKG8gPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9UUkFOU0xBVE9SUzsKLQkJcmV0dXJuIGdldERlbGVnYXRlRm9yKChFT2JqZWN0KSBvKS5nZXRDaGlsZHJlbihvLCB2ZXJzaW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldERPTU5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERPTU5hbWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBnZXREZWxlZ2F0ZUZvcigoRU9iamVjdCkgdmFsdWUpLmdldERPTU5hbWUodmFsdWUpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc01hbmFnZWRCeVBhcmVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRFbmRUYWcoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKGdldERPTVBhdGgoKSkpIHsKLQkJCXJldHVybiBzdXBlci5zaG91bGRJbmRlbnRFbmRUYWcobm9kZSk7Ci0JCX0KLQkJVHJhbnNsYXRvciBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlRm9yKG5vZGUuZ2V0Tm9kZU5hbWUoKSwgbnVsbCk7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuc2hvdWxkSW5kZW50RW5kVGFnKG5vZGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5zaG91bGRJbmRlbnRFbmRUYWcobm9kZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTmFtZXNwYWNlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTmFtZXNwYWNlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzIzZWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL05hbWVzcGFjZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDE0LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlQWRhcHRlcjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIE5hbWVzcGFjZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4OwotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIE5hbWVzcGFjZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWUpIHsKLQkJc3VwZXIoZG9tTmFtZSwgTmFtZXNwYWNlQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgRE9NX0FUVFJJQlVURSk7Ci0JCWluaXRQcmVmaXgoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFByZWZpeCgpIHsKLQkJU3RyaW5nIGROYW1lID0gZ2V0RE9NTmFtZShudWxsKTsKLQkJcHJlZml4ID0gZE5hbWUuc3Vic3RyaW5nKERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeS5YTUxOUy5sZW5ndGgoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNzZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQlOYW1lc3BhY2VBZGFwdGVyLmFkZE5hbWVzcGFjZShwcmVmaXgsIChTdHJpbmcpIHZhbHVlLCBlbWZPYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNTZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBnZXRNT0ZWYWx1ZShlbWZPYmplY3QpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXJldHVybiBOYW1lc3BhY2VBZGFwdGVyLmdldE5hbWVzcGFjZVVSSUF0VGhpc0xldmVsKHByZWZpeCwgbW9mT2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3VuU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdW5TZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlOYW1lc3BhY2VBZGFwdGVyLnJlbW92ZU5hbWVzcGFjZShwcmVmaXgsIGVtZk9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNmZWF0dXJlRXhpc3RzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGZlYXR1cmVFeGlzdHMoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc0RhdGFUeXBlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RhdGFUeXBlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzTWFwRm9yKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFwRm9yKE9iamVjdCBhRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKGFGZWF0dXJlID09IGZlYXR1cmUpIHsKLQkJCU5hbWVzcGFjZSBuYW1lc3BhY2UgPSAoTmFtZXNwYWNlKSAob2xkVmFsdWUgPT0gbnVsbCA/IG5ld1ZhbHVlIDogb2xkVmFsdWUpOwotCQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotCQkJCXJldHVybiBwcmVmaXguZXF1YWxzKG5hbWVzcGFjZS5nZXRQcmVmaXgoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL09iamVjdFRyYW5zbGF0b3JGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL09iamVjdFRyYW5zbGF0b3JGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4YjljZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9PYmplY3RUcmFuc2xhdG9yRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjEsIDIwMDMKLSAqICAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgT2JqZWN0VHJhbnNsYXRvckZpbHRlciBleHRlbmRzIFRyYW5zbGF0b3JGaWx0ZXIgewotCi0JcHVibGljIE9iamVjdFRyYW5zbGF0b3JGaWx0ZXIoKSB7Ci0JCXN1cGVyKG51bGwsIC0xKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0VHJhbnNsYXRvckZpbHRlcihUcmFuc2xhdG9yIHRyYW5zLCBpbnQgdmVyc2lvbikgewotCQlzdXBlcih0cmFucywgdmVyc2lvbik7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBzY2FuTmV4dFRyYW5zbGF0b3IoVHJhbnNsYXRvcltdIGNoaWxkcmVuLCBpbnQgc3RhcnQpIHsKLQkJaW50IGZvdW5kID0gc3RhcnQgKyAxOwotCQlmb3IgKDsgZm91bmQgPCBjaGlsZHJlbi5sZW5ndGg7ICsrZm91bmQpIHsKLQkJCWlmICghY2hpbGRyZW5bZm91bmRdLmlzRE9NQXR0cmlidXRlKCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZm91bmQgPSAoZm91bmQgPCBjaGlsZHJlbi5sZW5ndGgpID8gZm91bmQgOiAtMTsKLQkJcmV0dXJuIGZvdW5kOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWFkQWhlYWRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlYWRBaGVhZEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2QxYTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlYWRBaGVhZEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMiwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkQWhlYWRIZWxwZXIgewotCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJlbnRET01OYW1lOwotCXByb3RlY3RlZCBTdHJpbmdbXSB2YWx1ZXM7Ci0JcHJvdGVjdGVkIFN0cmluZyBjaGlsZERPTU5hbWU7Ci0KLQlwdWJsaWMgUmVhZEFoZWFkSGVscGVyKFN0cmluZyBwYXJlbnRET01OYW1lLCBTdHJpbmdbXSB2YWx1ZXMsIFN0cmluZyBjaGlsZERPTU5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXJlbnRET01OYW1lID0gcGFyZW50RE9NTmFtZTsKLQkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7Ci0JCXRoaXMuY2hpbGRET01OYW1lID0gY2hpbGRET01OYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoaWxkRE9NTmFtZSgpIHsKLQkJcmV0dXJuIGNoaWxkRE9NTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJlbnRET01OYW1lKCkgewotCQlyZXR1cm4gcGFyZW50RE9NTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRET01OYW1lKFN0cmluZyBzdHJpbmcpIHsKLQkJY2hpbGRET01OYW1lID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRET01OYW1lKFN0cmluZyBzdHJpbmcpIHsKLQkJcGFyZW50RE9NTmFtZSA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhTdHJpbmdbXSBzdHJpbmdzKSB7Ci0JCXZhbHVlcyA9IHN0cmluZ3M7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBub2RlVmFsdWVJc1JlYWRBaGVhZE5hbWUoU3RyaW5nIG5vZGVOYW1lKSB7Ci0KLQkJcmV0dXJuIChjaGlsZERPTU5hbWUgIT0gbnVsbCkgPyBjaGlsZERPTU5hbWUuZXF1YWxzKG5vZGVOYW1lKSA6IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5vZGVOYW1lSXNSZWFkQWhlYWROYW1lKFN0cmluZyBub2RlTmFtZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG5vZGVOYW1lLmVxdWFscyh2YWx1ZXNbaV0pKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZmFmMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2VkUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSwgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlIHsKLQkvL1RPRE8gLSByZW5hbWUgcGFja2FnZWQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURURfRVJST1JfTVNHID0gIlRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX1dBU19TQVZFRCA9IDYwMTsKLQkKLQkvKioKLQkgKiBBIGZsYWcgdXNlZCB0byBpbmRpY2F0ZSBhIFJlZmVyZW5jZWRSZXNvdXJjZSBpcyBhYm91dAotCSAqIHRvIHNhdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfQUJPVVRfVE9fU0FWRSA9IDYwMjsKLQkKLQkvKioKLQkgKiBBIGZsYWcgdXNlZCB0byBpbmRpY2F0ZSBhIFJlZmVyZW5jZWRSZXNvdXJjZSBoYXMgZmFpbGVkCi0JICogdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9TQVZFX0ZBSUxFRCA9IDYwMzsKLQotCS8qKgotCSAqIEFjY2VzcyB0aGlzIHJlc291cmNlIGZvciByZWFkIG9ubHkuIFRoaXMgY2FsbCBpbmNyZW1lbnRzIHRoZSB1c2UgcmVhZCBjb3VudCBvZiB0aGlzIHJlc291cmNlLgotCSAqIENsaWVudHMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZXkgdXNlIHRoZSByZXNvdXJjZS4gVGhleSBzaG91bGQgY2FsbAotCSAqIHJlbGVhc2VGcm9tUmVhZCgpIGFmdGVyIHRoZXkgYXJlIGRvbmUgbW9kaWZ5aW5nIHRoaXMgcmVzb3VyY2UuCi0JICovCi0Jdm9pZCBhY2Nlc3NGb3JSZWFkKCk7Ci0KLQkvKioKLQkgKiBBY2Nlc3MgdGhpcyByZXNvdXJjZSBmb3Igd3JpdGUgb25seS4gVGhpcyBjYWxsIGluY3JlbWVudHMgdGhlIHVzZSB3cml0ZSBjb3VudCBvZiB0aGlzCi0JICogcmVzb3VyY2UuIENsaWVudHMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZXkgbW9kaWZ5IHRoZSByZXNvdXJjZS4gVGhleSBzaG91bGQgY2FsbAotCSAqIHJlbGVhc2VGcm9tV3JpdGUoKSBhZnRlciB0aGV5IGFyZSBkb25lIG1vZGlmeWluZyB0aGlzIHJlc291cmNlLgotCSAqLwotCXZvaWQgYWNjZXNzRm9yV3JpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgaGFzIGp1c3QgYmVlbiBsb2FkZWQgYW5kIG5vdCB5ZXQgYWNjZXNzZWQgZm9yIHJlYWQgb3Igd3JpdGUuCi0JICovCi0JYm9vbGVhbiBpc05ldygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIGFueSB3cml0ZSByZWZlcmVuY2VzLgotCSAqLwotCWJvb2xlYW4gaXNSZWFkT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBpcyBzaGFyZWQgZm9yIHJlYWQgb3Igd3JpdGUgYnkgbW9yZSB0aGFuIG9uZSBhY2Nlc3Nvci4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGlzIHNoYXJlZCBmb3Igd3JpdGUgYnkgbW9yZSB0aGFuIG9uZSBhY2Nlc3Nvci4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKTsKLQotCS8qKgotCSAqIFJlbGVhc2UgcmVhZCB0aGUgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UuIFRoaXMgY2FsbCBkZWNyZW1lbnRzIHRoZSB1c2UgY291bnQgb2YgdGhpcyByZXNvdXJjZQotCSAqIGFuZCB3aWxsIHJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSBpdHMgcmVzb3VyY2Ugc2V0IGlmIHRoZSB1c2UgY291bnQgZ29lcyB0byAwLiBDbGllbnRzIHNob3VsZAotCSAqIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0aGV5IGFyZSBkb25lIGFjY2Vzc2luZyB0aGUgcmVzb3VyY2UgYW5kIG9ubHkgYWZ0ZXIgdGhleSBoYXZlIGNhbGxlZAotCSAqIGFjY2Vzc0ZvclJlYWQoKSB0byBvYnRhaW4gYWNjZXNzLgotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHdyaXRlIHRoZSBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZS4gVGhpcyBjYWxsIGRlY3JlbWVudHMgdGhlIHdyaXRlIGNvdW50IG9mIHRoaXMKLQkgKiByZXNvdXJjZSBhbmQgd2lsbCByZW1vdmUgdGhlIHJlc291cmNlIGZyb20gaXRzIHJlc291cmNlIHNldCBpZiB0aGUgdXNlIGNvdW50IGdvZXMgdG8gMC4KLQkgKiBDbGllbnRzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhleSBhcmUgZG9uZSBhY2Nlc3NpbmcgdGhlIHJlc291cmNlIGFuZCBvbmx5IGFmdGVyIHRoZXkKLQkgKiBoYXZlIGNhbGxlZCBhY2Nlc3NGb3JXcml0ZSgpIHRvIG9idGFpbiBhY2Nlc3MuCi0JICovCi0Jdm9pZCByZWxlYXNlRnJvbVdyaXRlKCk7Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGlzIHJlc291cmNlIG9ubHkgaWYgdGhlIHdyaXRlIGNvdW50IGlzIGVxdWFsIHRvIDEuCi0JICovCi0Jdm9pZCBzYXZlSWZOZWNlc3NhcnkoKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBpcyBkaXJ0eSBhbmQgaXMgbm90IHNoYXJlZCBmb3Igd3JpdGUuCi0JICovCi0JYm9vbGVhbiBuZWVkc1RvU2F2ZSgpOwotCi0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHdlIHNob3VsZCBhbGxvdyBhIHJlZnJlc2ggdG8gdGFrZSBwbGFjZSBldmVuIHdoZW4gdGhpcyByZXNvdXJjZSBpcyBkaXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXZvaWQgc2V0Rm9yY2VSZWZyZXNoKGJvb2xlYW4gYik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBzaG91bGQgYWxsb3cgYSByZWZyZXNoIHRvIHRha2UgcGxhY2UgZXZlbiB3aGVuIHRoaXMgcmVzb3VyY2UgaXMgZGlydHkuCi0JICovCi0JYm9vbGVhbiBzaG91bGRGb3JjZVJlZnJlc2goKTsKLQotCWJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvcGVuIHJlYWQgYWNjZXNzZXMgb24gdGhpcyByZXNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgZ2V0UmVhZENvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3BlbiB3cml0ZSBhY2Nlc3NlcyBvbiB0aGlzIHJlc291cmNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXRXcml0ZUNvdW50KCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIGJlaW5nIGFjY2Vzc2VkLCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSByZXNvdXJjZSBzZXQuCi0JICovCi0Jdm9pZCB1bmxvYWRJZk5lY2Vzc2FyeSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5MWMyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXM7Ci0JcHJvdGVjdGVkIExpc3QgbG9jYWxBZGFwdGVyRmFjdG9yaWVzOwotCi0JLyoqCi0JICogUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBhY3R1YWxseSBpbnN0YW50aWF0ZSBhIG5ldyBSZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRvQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGwjY3JlYXRlUmVzb3VyY2UoVVJJKQotCSAqLwotCXB1YmxpYyBmaW5hbCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlcyA9IGRvQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJYWRhcHROZXcocmVzKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGFwdE5ldyhSZXNvdXJjZSByZXMpIHsKLQkJaWYgKGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnbG9iYWxBZGFwdGVyRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZ2xvYmFsQWRhcHRlckZhY3Rvcmllcy5nZXQoaSk7Ci0JCQkJZmFjdG9yeS5hZGFwdEFsbE5ldyhyZXMpOwotCQkJfQotCQl9Ci0JCWlmIChsb2NhbEFkYXB0ZXJGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEFkYXB0ZXJGYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBsb2NhbEFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGkpOwotCQkJCWZhY3RvcnkuYWRhcHRBbGxOZXcocmVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBsb2NhbCBhZGFwdGVyIGZhY3RvcnkgaXMgYW4gYWRhcHRlciBmYWN0b3J5IHRoYXQgeW91IHVzZSB0byBvbmx5IGFkYXB0IHRoZSByZXNvdXJjZQotCSAqIHNwZWNpZmljIHRvIHRoZSBSZXNvdXJjZUZhY3RvcnkgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMb2NhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGxvY2FsQWRhcHRlckZhY3RvcmllcyA9PSBudWxsKQotCQkJbG9jYWxBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJbG9jYWxBZGFwdGVyRmFjdG9yaWVzLmFkZChmYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMb2NhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGxvY2FsQWRhcHRlckZhY3RvcmllcyAhPSBudWxsKQotCQkJbG9jYWxBZGFwdGVyRmFjdG9yaWVzLnJlbW92ZShmYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBBIGdsb2JhbCBhZGFwdGVyIGZhY3Rvcnkgd2lsbCBiZSB1c2VkIHRvIGFkYXB0IGFueSByZXNvdXJjZSBjcmVhdGVkIGJ5IGFueSBSZXNvdXJjZUZhY3RvcnkKLQkgKiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRHbG9iYWxBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCWlmIChnbG9iYWxBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpCi0JCQlnbG9iYWxBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJZ2xvYmFsQWRhcHRlckZhY3Rvcmllcy5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUdsb2JhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMgIT0gbnVsbCkKLQkJCWdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMucmVtb3ZlKGZhY3RvcnkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NkMzk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuSURVdGlsOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBSZWZlcmVuY2VkUmVzb3VyY2UgewotCS8vVE9ETyBBZGQgdG9TdHJpbmcgaG9vawotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT19TVFJJTkcgPSAiUmVmZXJlbmNlZFhNSVJlc291cmNlLCBmaWxlID0gIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPVU5UX1RPX1NUUklORyA9ICIgUj0gIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9DT1VOVF9UT19TVFJJTkcgPSAiIFc9ICI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IHJlYWRSZWZlcmVuY2VDb3VudCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZWRpdFJlZmVyZW5jZUNvdW50ID0gMDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05ldyA9IHRydWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZm9yY2VSZWZyZXNoOwotCQotCSAgcHVibGljIHN0YXRpYyBjbGFzcyBFU3luY2hyb25pemVkQWRhcHRlckxpc3QgZXh0ZW5kcyBFQWRhcHRlckxpc3QKLQkgIHsKLQotCSAgICBwdWJsaWMgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0KE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCQlzdXBlcihub3RpZmllcik7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLmFkZChvYmplY3QpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgc3VwZXIuYWRkKGluZGV4LCBvYmplY3QpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLmFkZEFsbChjb2xsZWN0aW9uKTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCByZW1vdmUoaW50IGluZGV4KQotCSAgICB7Ci0JICAgIHJldHVybiBzdXBlci5yZW1vdmUoaW5kZXgpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUFsbChjb2xsZWN0aW9uKTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpCi0JICAgIHsKLQkgICAgIHN1cGVyLmNsZWFyKCk7Ci0JICAgIH0KLQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLnNldChpbmRleCwgb2JqZWN0KTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtb3ZlKGludCBuZXdQb3NpdGlvbiwgT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICBzdXBlci5tb3ZlKG5ld1Bvc2l0aW9uLCBvYmplY3QpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgbW92ZShpbnQgbmV3UG9zaXRpb24sIGludCBvbGRQb3NpdGlvbikKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2xkUG9zaXRpb24pOwotCSAgICB9Ci0JICB9Ci0KLQkgCi0JLyoqCi0JICogUmVmZXJlbmNhYmxlWE1JUmVzb3VyY2VJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlI2dldFJlYWRDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRSZWFkQ291bnQoKSB7Ci0JCXJldHVybiByZWFkUmVmZXJlbmNlQ291bnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2UjZ2V0V3JpdGVDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRXcml0ZUNvdW50KCkgewotCQlyZXR1cm4gZWRpdFJlZmVyZW5jZUNvdW50OwotCX0KLQotCi0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2FjY2Vzc0ZvclJlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JSZWFkKCkgewotCQljaGVja0RlbGV0ZWQoKTsKLQkJaWYgKCFpc05ldygpKQotCQkJcmVhZFJlZmVyZW5jZUNvdW50Kys7Ci0JCWlzTmV3ID0gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNhY2Nlc3NGb3JXcml0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvcldyaXRlKCkgewotCQljaGVja0RlbGV0ZWQoKTsKLQkJZWRpdFJlZmVyZW5jZUNvdW50Kys7Ci0JCWlmIChpc05ldykKLQkJCXJlbGVhc2VGcm9tUmVhZCgpOwotCQlpc05ldyA9IGZhbHNlOwotCQlpZiAoIWlzVHJhY2tpbmdNb2RpZmljYXRpb24oKSkKLQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgdGhpcyByZXNvdXJjZSBoYXMgYmVlbiByZW1vdmVkIGFuZCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgZG9lcyBub3QgaGF2ZSBhCi0JICogUmVzb3VyY2VTZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tEZWxldGVkKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oREVMRVRFRF9FUlJPUl9NU0cpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb2xsZWN0Q29udGFpbmVkT2JqZWN0cyhqYXZhLnV0aWwuTGlzdCBjb2xsZWN0aW5nLCBFT2JqZWN0IHBhcmVudE9iamVjdCkgewotCi0JCWphdmEudXRpbC5JdGVyYXRvciBjaGlsZHJlbiA9IHBhcmVudE9iamVjdC5lQ29udGVudHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKSB7Ci0JCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGNoaWxkcmVuLm5leHQoKTsKLQkJCWNvbGxlY3RpbmcuYWRkKGNoaWxkKTsKLQkJCWNvbGxlY3RDb250YWluZWRPYmplY3RzKGNvbGxlY3RpbmcsIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnN1cmVGdWxsSURIeWRyYXRpb24oKSB7Ci0JCUxpc3QgYWxsUmVmT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3Igcm9vdE9iamVjdHMgPSBnZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyb290T2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgcm9vdE9iamVjdHMubmV4dCgpOwotCQkJYWxsUmVmT2JqZWN0cy5hZGQoY2hpbGQpOwotCQkJY29sbGVjdENvbnRhaW5lZE9iamVjdHMoYWxsUmVmT2JqZWN0cywgY2hpbGQpOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlciA9IGFsbFJlZk9iamVjdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotCQkJSURVdGlsLmFzc2lnbklEKChFT2JqZWN0KSBpdGVyLm5leHQoKSwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBiZWluZyBhY2Nlc3NlZCwgdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHVubG9hZElmTmVjZXNzYXJ5KCkgewotCQlpZiAoKGdldFRvdGFsUmVmZXJlbmNlQ291bnQoKSA8PSAwKSB8fCAoZWRpdFJlZmVyZW5jZUNvdW50IDw9IDAgJiYgaXNNb2RpZmllZCgpKSkKLQkJCXVubG9hZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHdyaXRlIGFjY2Vzc2VzIHRvIHRoaXMgcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBpbnQgVGhlIG51bWJlciBvZiByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VG90YWxSZWZlcmVuY2VDb3VudCgpIHsKLQkJcmV0dXJuIGVkaXRSZWZlcmVuY2VDb3VudCArIHJlYWRSZWZlcmVuY2VDb3VudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzTmV3Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7Ci0JCXJldHVybiBpc05ldzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzUmVhZE9ubHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gZWRpdFJlZmVyZW5jZUNvdW50IDw9IDA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc1NoYXJlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gZ2V0VG90YWxSZWZlcmVuY2VDb3VudCgpID4gMTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzU2hhcmVkRm9yV3JpdGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgewotCQlyZXR1cm4gZWRpdFJlZmVyZW5jZUNvdW50ID4gMTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNwcmVEZWxldGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVEZWxldGUoKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNyZWxlYXNlRnJvbVJlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCXJlYWRSZWZlcmVuY2VDb3VudC0tOwotCQlpZiAocmVhZFJlZmVyZW5jZUNvdW50IDwgMCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZWFkIHJlZmVyZW5jZSBjb3VudCBlcnJvcjogICIgKyB0aGlzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCXVubG9hZElmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNyZWxlYXNlRnJvbVdyaXRlCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpIHsKLQkJZWRpdFJlZmVyZW5jZUNvdW50LS07Ci0JCWlmIChlZGl0UmVmZXJlbmNlQ291bnQgPCAwKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldyaXRlIHJlZmVyZW5jZSBjb3VudCBlcnJvcjogICIgKyB0aGlzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCXVubG9hZElmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNzYXZlSWZOZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1NoYXJlZEZvcldyaXRlKCkpIC8vIGNhbGxlciBpcyB0aGUgb25seSByZWZlcmVuY2VyCi0JCQlzYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFRPX1NUUklORyArIGdldFVSSSgpLnRvU3RyaW5nKCkgKyBSRUFEX0NPVU5UX1RPX1NUUklORyArIG5ldyBJbnRlZ2VyKHJlYWRSZWZlcmVuY2VDb3VudCkgKyBXUklURV9DT1VOVF9UT19TVFJJTkcgKyBuZXcgSW50ZWdlcihlZGl0UmVmZXJlbmNlQ291bnQpOwotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjbmVlZHNUb1NhdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRzVG9TYXZlKCkgewotCQlyZXR1cm4gaXNNb2RpZmllZCgpICYmICFpc1NoYXJlZEZvcldyaXRlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNzZXRGb3JjZVJlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JjZVJlZnJlc2goYm9vbGVhbiBiKSB7Ci0JCWZvcmNlUmVmcmVzaCA9IGI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2Ujc2hvdWxkRm9yY2VSZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRGb3JjZVJlZnJlc2goKSB7Ci0JCXJldHVybiBmb3JjZVJlZnJlc2g7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNEb0xvYWQoSW5wdXRTdHJlYW0gYXJnMCwgTWFwIGFyZzEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaXNUcmFja2luZ01vZHMgPSBpc1RyYWNraW5nTW9kaWZpY2F0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNUcmFja2luZ01vZHMpCi0JCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24oZmFsc2UpOwotCQkJc3VwZXIuYmFzaWNEb0xvYWQoYXJnMCwgYXJnMSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaXNUcmFja2luZ01vZHMpCi0JCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZG9VbmxvYWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5sb2FkKCkgewotCQkKLQkJdHJ5IHsKLQkJCS8vIFVzaW5nIGxvYWQgbG9jayB0byBlbnN1cmUgbm8gb3RoZXIgdGhyZWFkcyB3aWxsIGF0dGVtcHQgYSBsb2FkIGR1cmluZyB0aGUgdW5sb2FkIHByb2Nlc3MKLQkJCWFkZFN5bmNocm9uaXphdGlvbkxvYWRpbmdBZGFwdGVyKCk7Ci0JCQl3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpOwotCQkJCi0JCQlpZiAoaXNUcmFja2luZ01vZGlmaWNhdGlvbigpICYmIGVkaXRSZWZlcmVuY2VDb3VudCA8IDEpIC8vZG8gbm90IHR1cm4gb2ZmIG1vZGlmaWNhdGlvbiBpZgotCQkJCS8vIHdlIHN0aWxsIGhhdmUgYSB3cml0ZSBjb3VudAotCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKGZhbHNlKTsKLQkJCXN1cGVyLmRvVW5sb2FkKCk7Ci0JCQlzZXRGb3JjZVJlZnJlc2goZmFsc2UpOwotCQkJc2V0TW9kaWZpZWQoZmFsc2UpOyAvL2RjYiAtIHRoaXMgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgcmVzb3VyY2VzIHdpdGhvdXQgZmlsZXMgYXJlCi0JCQkvLyBtYXJrZWQgYXMgbm90IG1vZGlmaWVkLgotCQkJaWYgKHJlYWRSZWZlcmVuY2VDb3VudCA9PSAwICYmIGVkaXRSZWZlcmVuY2VDb3VudCA9PSAwKSB7Ci0JCQkJZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUodGhpcyk7Ci0JCQl9Ci0JCQotCQl9IGZpbmFsbHkgewotCQkJLy9SZW1vdmluZyB0aGUgbG9hZCBsb2NrCi0JCQlyZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpOwotCQl9Ci0JCQkKLQl9Ci0KLQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSBoYXMgYmVlbiB1bmxvYWRlZCwgYW5kIHRoZXJlIGFyZSBubyByZWZlcmVuY2VzLiBUcmVhdCB0aGUgcmVzb3VyY2UgbGlrZSBhIG5ldwotCSAqIFJlc291cmNlCi0JICovCi0JLy8gbmV2ZXIgdXNlZAotLy8JcHJpdmF0ZSB2b2lkIHJlc2V0QXNOZXcoKSB7Ci0vLwkJcmVhZFJlZmVyZW5jZUNvdW50ID0gMTsKLS8vCQlpc05ldyA9IHRydWU7Ci0vLwl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSNzYXZlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlub3RpZnlBYm91dFRvU2F2ZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3VwZXIuc2F2ZShvcHRpb25zKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG5vdGlmeVNhdmVGYWlsZWQoKTsKLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS53cml0ZShlKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlTYXZlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVNhdmVkKCkgewotCQlub3RpZnlTYXZlRXZlbnQoUkVTT1VSQ0VfV0FTX1NBVkVEKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5QWJvdXRUb1NhdmUoKSB7Ci0gICAgICAgIG5vdGlmeVNhdmVFdmVudChSRVNPVVJDRV9BQk9VVF9UT19TQVZFKTsKLSAgICB9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5U2F2ZUZhaWxlZCgpIHsKLSAgICAgICAgbm90aWZ5U2F2ZUV2ZW50KFJFU09VUkNFX1NBVkVfRkFJTEVEKTsKLSAgICB9Ci0JCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVNhdmVFdmVudChpbnQgZXZlbnRUeXBlKSB7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPQotCQkJbmV3IE5vdGlmaWNhdGlvbkltcGwoZXZlbnRUeXBlLCB0aGlzLCB0aGlzKQotCQkJewotCQkJICBwdWJsaWMgT2JqZWN0IGdldE5vdGlmaWVyKCkKLQkJCSAgewotCQkJCXJldHVybiBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsLnRoaXM7Ci0JCQkgIH0KLQkJCSAgcHVibGljIGludCBnZXRGZWF0dXJlSUQoQ2xhc3MgZXhwZWN0ZWRDbGFzcykKLQkJCSAgewotCQkJCXJldHVybiBldmVudFR5cGU7Ci0JCQkgIH0KLQkJCX07Ci0JCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlJlZmVyZW5jZWRSZXNvdXJjZSN3YXNSZXZlcnRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIEVMaXN0IGVBZGFwdGVycygpCi0JICB7Ci0JICAgIGlmIChlQWRhcHRlcnMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVBZGFwdGVycyA9ICBuZXcgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQWRhcHRlcnM7Ci0JICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWMzN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUgYXBpIGZvciByZW5kZXJpbmcgYW4gRU1GIG9iamVjdCB0byBYTUwgYW5kIHZpY2UgdmVyc2EKLSAqLwotcHVibGljIGludGVyZmFjZSBSZW5kZXJlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhQX1NDSEVNQV9MQU5HVUFHRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvc2NoZW1hTGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXM0NfWE1MX1NDSEVNQSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKLQotCXZvaWQgc2V0UmVzb3VyY2UoVHJhbnNsYXRvclJlc291cmNlIGFSZXNvdXJjZSk7Ci0KLQlUcmFuc2xhdG9yUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKTsKLQotCXZvaWQgZG9Mb2FkKElucHV0U3RyZWFtIGluLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCWJvb2xlYW4gdXNlU3RyZWFtc0ZvcklPKCk7Ci0KLQl2b2lkIHByZXBhcmVUb0FkZENvbnRlbnRzKCk7Ci0KLQlpbnQgZ2V0VmVyc2lvbklEKCk7Ci0KLQlib29sZWFuIGlzTW9kaWZpZWQoKTsKLQotCXZvaWQgYWNjZXNzRm9yV3JpdGUoKTsKLQotCXZvaWQgYWNjZXNzRm9yUmVhZCgpOwotCi0Jdm9pZCByZWxlYXNlRnJvbVJlYWQoKTsKLQotCXZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpOwotCi0Jdm9pZCBwcmVEZWxldGUoKTsKLQotCXZvaWQgcHJlVW5sb2FkKCk7Ci0KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0KLQlib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKTsKLQotCXZvaWQgc2V0QmF0Y2hNb2RlKGJvb2xlYW4gaXNCYXRjaCk7Ci0JCi0JYm9vbGVhbiBpc0JhdGNoTW9kZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyOTRkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW5kZXJlckZhY3RvcnkgewotCi0JcHVibGljIGFic3RyYWN0IFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZW5kZXJlckZhY3RvcnkgZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKLQotCXByaXZhdGUgc3RhdGljIFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGRlZmF1bHRIYW5kbGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRpbmcgPSB0cnVlOwotCi0JLyoqCi0JICogSW50ZXJlc3RlZCBwYXJ0aWVzIGNhbiB1c2UgdGhlCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBOb3RpZmllciBOb3RpZmljYXRpb25FbmdpbmUgPSBOb3RpZmllci5JTlNUQU5DRTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlbmRlcmVyRmFjdG9yeSBnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkgewotCQlpZiAoZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9PSBudWxsKQotCQkJZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IGdldERlZmF1bHRIYW5kbGVyKCkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpOwotCQlyZXR1cm4gZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0KLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuXG4qKipTZXR0aW5nIGZhY3Rvcnk6ICIgKyBmYWN0b3J5KTsKLQkJTm90aWZpY2F0aW9uRW5naW5lLm5vdGlmeUxpc3RlbmVycyhmYWN0b3J5KTsKLQkJZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJSZW5kZXJlckZhY3RvcnkgaW5zdGFuY2U6ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm90aWZpZXIgewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE5vdGlmaWVyIElOU1RBTkNFID0gbmV3IE5vdGlmaWVyKCk7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uIHJlc291cmNlRmFjdG9yeUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIE5vdGlmaWVyKCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKFJlbmRlcmVyRmFjdG9yeSByZW5kZXJlckZhY3RvcnkpIHsKLQotCQkJZmluYWwgaW50IGxlbmd0aCA9IHJlc291cmNlRmFjdG9yeUxpc3RlbmVycy5zaXplKCk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTm90aWZ5aW5nICIgKyBsZW5ndGggKyAiIGxpc3RlbmVycyIpOwotCi0JCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCS8qCi0JCQkJICogU2luY2UgdGhlIHJlbmRlcmVyIGZhY3RvcmllcyBhcmUgc2luZ2xldG9ucywgdGhpcyByZWZlcmVuY2UgY2hlY2sgc2hvdWxkIGFsd2F5cwotCQkJCSAqIHdvcmsKLQkJCQkgKi8KLQkJCQlpZiAocmVuZGVyZXJGYWN0b3J5ICE9IFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpIHsKLQkJCQkJV2Vha1JlZmVyZW5jZSB3cmVmID0gbnVsbDsKLQkJCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCQkJCQlzeW5jaHJvbml6ZWQgKHJlc291cmNlRmFjdG9yeUxpc3RlbmVycykgewotCQkJCQkJZm9yIChJdGVyYXRvciBpID0gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQkJCXdyZWYgPSAoV2Vha1JlZmVyZW5jZSkgaS5uZXh0KCk7Ci0JCQkJCQkJbGlzdGVuZXIgPSAoTGlzdGVuZXIpIHdyZWYuZ2V0KCk7Ci0JCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmeWluZyBMaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJCQkJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQkJCQkJbGlzdGVuZXIudXBkYXRlUmVuZGVyZXJGYWN0b3J5KHJlbmRlcmVyRmFjdG9yeSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlpLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbCkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBsaXN0ZW5lcjogIiArIGwpOwotCQkJc3luY2hyb25pemVkIChyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQlyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlKGwpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyVG9SZW1vdmUpIHsKLQkJCWZpbmFsIGludCBsZW5ndGggPSByZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMuc2l6ZSgpOwotCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQlXZWFrUmVmZXJlbmNlIHdyZWYgPSBudWxsOwotCQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKLQkJCQlzeW5jaHJvbml6ZWQgKHJlc291cmNlRmFjdG9yeUxpc3RlbmVycykgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQl3cmVmID0gKFdlYWtSZWZlcmVuY2UpIGkubmV4dCgpOwotCQkJCQkJbGlzdGVuZXIgPSAoTGlzdGVuZXIpIHdyZWYuZ2V0KCk7Ci0JCQkJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQkJCWlmIChsaXN0ZW5lciA9PSBsaXN0ZW5lclRvUmVtb3ZlKSB7Ci0JCQkJCQkJCWkucmVtb3ZlKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaS5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciB7Ci0JCXZvaWQgdXBkYXRlUmVuZGVyZXJGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBuZXdSZW5kZXJlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpbmcoKSB7Ci0JCXJldHVybiB2YWxpZGF0aW5nOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGluZyhib29sZWFuIGIpIHsKLQkJdmFsaWRhdGluZyA9IGI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgZ2V0RGVmYXVsdEhhbmRsZXIoKSB7Ci0JCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKQotCQkJZGVmYXVsdEhhbmRsZXIgPSBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuSU5TVEFOQ0U7Ci0JCXJldHVybiBkZWZhdWx0SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0SGFuZGxlcihSZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBoYW5kbGVyKSB7Ci0JCWRlZmF1bHRIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1ZGY0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIHsKLQotCVJlbmRlcmVyRmFjdG9yeSBnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OTg0YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIHsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciBpcyBhcHBsaWNhYmxlIHRvIHRoZSBnaXZlbiBmaWxlVVJJLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlVVJJIFRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgZGVjbGFyZXMgYSByZXNvdXJjZSBmYWN0b3J5IGFwcGxpY2FibGUgdG8gdGhlIGdpdmVuIFVSSS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VuYWJsZWRGb3IoVVJJIGZpbGVVUkkpOwotCQotCS8qKgotCSAqIFRoZSBjb250ZW50VHlwZSBpcyBvbmUgb3B0aW9uYWwgd2F5IHRoYXQgYSBSZXNvdXJjZUZhY3RvcnkKLQkgKiBtaWdodCBhcHBseSB0byBhIFVSSS4gQ2xpZW50cyBzaG91bGQgY2FsbCB7QGxpbmsgaXNFbmFibGVkRm9yfSAKLQkgKiBpbnN0ZWFkIG9mIGNvbXBhcmluZyB0aGUgY29udGVudCBUeXBlcyB3aGVuIHNlYXJjaGluZyBmb3IgYW4KLQkgKiBhcHBsaWNhYmxlIGRlc2NyaXB0b3IgZnJvbSBhIHNldC4gIAotCSAqIAotCSAqIDxwPjxiPlN1YmNsYXNzZXMgbWF5IHJldHVybiBudWxsLihvcHRpb25hbCk8L2I+PC9wPgotCSAqICAKLQkgKiBAcmV0dXJuIFRoZSBjb250ZW50IHR5cGUgdGhhdCB0aGlzIGRlc2NyaXB0b3IgaXMgYXBwbGljYWJsZSB0by4KLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBJbiB0aGUgY2FzZSB3aGVyZSBtb3JlIHRoYW4gb25lIGZhY3RvcnkgaXMgZGVmaW5lZCBmb3IgdGhlIHNhbWUgZmlsZU5hbWUsIAotCSAqIGFuZCBjcmVhdGlvbiBpcyBwYXNzZWQgYSB1cmkgb25seSBhIGRlZmF1bHQgZmFjdG9yeSBpcyBuZWVkZWQKLQkgKiAKLQkgKiAgCi0JICogQHJldHVybiBUaGUgYm9vbGVhbiBkZXNjcmliaW5nIHRoZSBkZWZhdWx0IGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBzaG9ydCBzZWdtZW50IGlzIG9uZSBwb3NzaWJsZSB3YXkgdGhhdCBhIFJlc291cmNlRmFjdG9yeQotCSAqIG1pZ2h0IGFwcGx5IHRvIGEgVVJJLiBDbGllbnRzIHNob3VsZCBjYWxsIHtAbGluayBpc0VuYWJsZWRGb3J9IAotCSAqIGluc3RlYWQgb2YgY29tcGFyaW5nIHRoZSBzaG9ydCBzZWdtZW50cyB3aGVuIHNlYXJjaGluZyBmb3IgYW4KLQkgKiBhcHBsaWNhYmxlIGRlc2NyaXB0b3IgZnJvbSBhIHNldC4gIAotCSAqIAotCSAqIDxwPjxiPlN1YmNsYXNzZXMgbWF5IE5PVCByZXR1cm4gbnVsbC48L2I+PC9wPgotCSAqICAKLQkgKiBAcmV0dXJuIFRoZSBzaG9ydCBzZWdtZW50IHRoYXQgdGhpcyBkZXNjcmlwdG9yIGlzIGFwcGxpY2FibGUgdG8uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTaG9ydFNlZ21lbnQoKTsKLQkKLQkKLQkvKioKLQkgKiBUaGUgY29ycmVjdCBpbnN0YW5jZSBvZiBSZXNvdXJjZS5GYWN0b3J5LiBUaGUgaW5zdGFuY2UgcmV0dXJuZWQKLQkgKiBtYXkgb3IgbWF5IG5vdCBiZSB1bmlxdWUsIHNvIGlmIHlvdSByZXF1aXJlIHRoZSBzYW1lIGluc3RhbmNlIAotCSAqIGZvciBlYWNoIGNhbGwsIHlvdSBzaG91bGQgY2FjaGUgdGhlIHZhbHVlIHJldHVybmVkIHRoZSBmaXJzdAotCSAqIHRpbWUgZnJvbSB0aGlzIG1ldGhvZC4gCi0JICogCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBSZXNvdXJjZS5GYWN0b3J5LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBSZXNvdXJjZS5GYWN0b3J5IGNyZWF0ZUZhY3RvcnkoKTsKLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0U2hvcnRTZWdtZW50KCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmKG8gaW5zdGFuY2VvZiBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKQotCQkJcmV0dXJuIGdldFNob3J0U2VnbWVudCgpLmVxdWFscygoKFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpbykuZ2V0U2hvcnRTZWdtZW50KCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUm9vdFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jvb3RUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NjQwZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUm9vdFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgUm9vdFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSb290VHJhbnNsYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICovCi0JcHVibGljIFJvb3RUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRUNsYXNzIGVDbGFzcykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKE5vdGlmaWVyLCBPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKLQkJKChSZXNvdXJjZSkgb3duZXIpLmdldENvbnRlbnRzKCkuYWRkKG5ld0luZGV4LCAoRU9iamVjdCl2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNyZW1vdmVNT0ZWYWx1ZShOb3RpZmllciwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJKChSZXNvdXJjZSkgb3duZXIpLmdldENvbnRlbnRzKCkucmVtb3ZlKHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShSZXNvdXJjZSByZXMsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAocmVzICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKLQkJCXJlcy5nZXRDb250ZW50cygpLmFkZCgoRU9iamVjdCl2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc011bHRpVmFsdWVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU291cmNlTGlua1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1NvdXJjZUxpbmtUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZDY5N2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU291cmNlTGlua1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUxpbmtUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIFNvdXJjZUxpbmtUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBwYXRoKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgU291cmNlTGlua1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHBhdGgsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHBhdGgpOwotCQlmU3R5bGUgfD0gc3R5bGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFNvdXJjZUxpbmtUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBzdHlsZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQotCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQlpZiAoc3RyVmFsdWUgIT0gbnVsbCkKLQkJCS8vIEZpbmQgdGhlIG9iamVjdCB3aXRoIHRoZSBuYW1lIHRoYXQgbWF0Y2hlcyBtYXRjaE5hbWUKLQkJCXZhbHVlID0gZlRyYW5zbGF0b3JQYXRoc1swXS5maW5kT2JqZWN0KG93bmVyLCBzdHJWYWx1ZS50cmltKCkpOwotCQlpZiAoKGZTdHlsZSAmIFRyYW5zbGF0b3IuU1RSSU5HX1JFU1VMVF9PSykgIT0gMCkKLQkJCXJldHVybiAoKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBzdHJWYWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlUcmFuc2xhdG9yUGF0aCBwYXRoID0gZlRyYW5zbGF0b3JQYXRoc1swXTsKLQkJT2JqZWN0IGF0dHJWYWx1ZSA9IHBhdGguZ2V0TGFzdE1hcCgpLmdldE1PRlZhbHVlKChFT2JqZWN0KSB2YWx1ZSk7Ci0JCXJldHVybiBwYXRoLmdldExhc3RNYXAoKS5jb252ZXJ0VmFsdWVUb1N0cmluZyhhdHRyVmFsdWUsIG93bmVyKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1N0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1N0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhZjRlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9TdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIERlY2xhcmVzIGEgc3ViY2xhc3MgdG8gY3JlYXRlIFJlc291cmNlLkZhY3RvcnkoaWVzKSBmcm9tIGFuIGV4dGVuc2lvbi4gCi0gKi8KLWNsYXNzIFN0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIHsKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzaG9ydFNlZ21lbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZS5GYWN0b3J5IGZhY3Rvcnk7Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNob3J0U2VnbWVudCBBIG5vbi1udWxsIG5hbWUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmYWN0b3J5Ci0JICogQHBhcmFtIGZhY3RvcnkgQSBub24tbnVsbCBSZXNvdXJjZS5GYWN0b3J5IHRoYXQgY2FuIGxvYWQgZmlsZXMgb2YgdGhlIGdpdmVuIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcihTdHJpbmcgc2hvcnRTZWdtZW50LCBSZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzaG9ydFNlZ21lbnQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnkpOwotCQl0aGlzLnNob3J0U2VnbWVudCA9IHNob3J0U2VnbWVudDsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9ICAKLQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihVUkkgZmlsZVVSSSkgewotCQkvKiBzaG9ydFNlZ21lbnQgbXVzdCBiZSBub24tbnVsbCBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgY3JlYXRlZCwgCi0JCSAqIGEgdmFsaWRhdGlvbiBjaGVjayBpbiBpbml0KCkgdmVyaWZpZXMgdGhpcyByZXF1aXJlbWVudCAqLwotCQlpZihmaWxlVVJJICE9IG51bGwgJiYgZmlsZVVSSS5sYXN0U2VnbWVudCgpICE9IG51bGwpCi0JCQlyZXR1cm4gc2hvcnRTZWdtZW50LmVxdWFscyhmaWxlVVJJLmxhc3RTZWdtZW50KCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfSAKLQkKLQlwdWJsaWMgUmVzb3VyY2UuRmFjdG9yeSBjcmVhdGVGYWN0b3J5KCkgewotCQkgcmV0dXJuIGZhY3Rvcnk7CQkJCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydFNlZ21lbnQoKSB7Ci0JCXJldHVybiBzaG9ydFNlZ21lbnQ7Ci0JfSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMjgwNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgVHJhbnNsYXRvciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19TVFlMRSA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRE9NX0FUVFJJQlVURSA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU1QVFlfVEFHID0gMSA8PCAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENEQVRBX0NPTlRFTlQgPSAxIDw8IDI7Ci0JLyoqCi0JICogU3R5bGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGVuZCB0YWcgc2hvdWxkIE5PVCBiZSBpbmRlbnRlZDsgYnkgZGVmYXVsdCBpdCBpcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTkRfVEFHX05PX0lOREVOVCA9IDEgPDwgMzsKLQkvKioKLQkgKiBTdHlsZSBiaXQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBib29sZWFucyBzaG91bGQgTk9UIGJlIGNvbnZlcnRlZCBhcyAiVHJ1ZSIgYW5kICJGYWxzZSI7IGRlZmF1bHQKLQkgKiBpcyB0aGF0IHRoZXkgYXJlCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQk9PTEVBTl9MT1dFUkNBU0UgPSAxIDw8IDQ7Ci0JLyoqCi0JICogU3R5bGUgYml0IHRoYXQgaW5kaWNhdGVzIGFuIGVudW0gdmFsdWUgY29udGFpbnMgaHlwaGVucyBJZiB0aGlzIGlzIHRydWUsIHRoZW4gaW50ZXJuYWxseSB0aGUKLQkgKiBoeXBoZW5zIGFyZSByZXBsYWNlZCB3aXRoIHVuZGVyc2NvcmVzCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU5VTV9GRUFUVVJFX1dJVEhfSFlQSEVOUyA9IDEgPDwgNTsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IE9CSkVDVF9NQVAgPSAxIDw8IDY7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgQk9PTEVBTl9GRUFUVVJFID0gMSA8PCA3OwotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU0hBUkVEX1JFRkVSRU5DRSA9IDEgPDwgODsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBmZWF0dXJlIG1heSBiZSBzaWduaWZpY2FudCBldmVuIGlmIGl0IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU1QVFlfQ09OVEVOVF9JU19TSUdOSUZJQ0FOVCA9IDEgPDwgOTsKLQotCS8qKgotCSAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBmZWF0dXJlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1lbnQgbm9kZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IENPTU1FTlRfRkVBVFVSRSA9IDEgPDwgMTA7Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgaXMgbnVsbCwgdGhlbiBhbiBlVW5zZXQoKSB3aWxsIGJlIGludm9rZWQgb24gdGhlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBVTlNFVF9JRl9OVUxMID0gMSA8PCAxMTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBjb250ZW50cyBhcyBhIFN0cmluZyBpZiB0aGUgZmVhdHVyZSBpcyB1bnJlc29sdmVhYmxlIChVc2VkIGJ5IHRoZQotCSAqIFNvdXJjZUxpbmtUcmFuc2xhdG9yKQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUUklOR19SRVNVTFRfT0sgPSAxIDw8IDEyOwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGZET01OYW1lczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZET01QYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgTWFwIHJlYWRBaGVhZE5hbWVzOwotCXByb3RlY3RlZCBpbnQgZlN0eWxlID0gTk9fU1RZTEU7Ci0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCXByb3RlY3RlZCBUcmFuc2xhdG9yUGF0aFtdIGZUcmFuc2xhdG9yUGF0aHM7Ci0JcHJvdGVjdGVkIEVDbGFzcyBlbWZDbGFzczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZOYW1lU3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCS8vIGFkZGVkIGJ5IE1ERQotCXByb3RlY3RlZCBTdHJpbmcgZG9tTmFtZUFuZFBhdGggPSBudWxsOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFueSBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBUcmFuc2xhdG9yIGFyZSB0aGVtc2VsdmVzIERlcGVuZGVuY3lUcmFuc2xhdG9ycwotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzRGVwZW5kZW5jeVBhcmVudDsKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGRlcGVuZGVuY3lGZWF0dXJlOwotCXByb3RlY3RlZCBzdGF0aWMgRWNvcmVQYWNrYWdlIEVDT1JFX1BBQ0tBR0UgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCi0JLy8gVXNlIHRoaXMgaWRlbnRpZmllciBmb3IgdGhlIERPTU5hbWUgd2hlbiB0aGUgYXR0cmlidXRlCi0JLy8gdmFsdWUgaXMgdG8gYmUgZXh0cmFjdGVkIGRpcmVjdGx5IGZyb20gdGhlIHRleHQgb2YgdGhlIG5vZGUuCi0JLy8gVGhpcyBpcyByYXJlLCBidXQgb2NjdXJzIGluIHRoZSB3ZWIueG1sIGluIHRoZSBjYXNlIG9mIGEKLQkvLyBXZWxjb21lRmlsZS4KLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBURVhUX0FUVFJJQlVURV9WQUxVRSA9ICIkVEVYVF9BVFRSSUJVVEVfVkFMVUUiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBDT05UQUlORVJfRkVBVFVSRSA9IG5ldyBDb250YWluZXJGZWF0dXJlKCk7Ci0KLQlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBST09UX0ZFQVRVUkUgPSBuZXcgUm9vdEZlYXR1cmUoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ29udGFpbmVyRmVhdHVyZSBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwgewotCQlwcm90ZWN0ZWQgQ29udGFpbmVyRmVhdHVyZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJvb3RGZWF0dXJlIGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlSW1wbCB7Ci0JCXByb3RlY3RlZCBSb290RmVhdHVyZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBmaW5kQ2hpbGQoU3RyaW5nIHRhZ05hbWUsIE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQotCQlUcmFuc2xhdG9yIHJlc3VsdCA9IG51bGw7Ci0JCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRyZW4odGFyZ2V0LCB2ZXJzaW9uSUQpOwotCi0JCWlmIChtYXBzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJCVRyYW5zbGF0b3IgbWFwID0gbWFwc1tpXTsKLQkJCQlpZiAobWFwLmlzTWFwRm9yKHRhZ05hbWUpKSB7Ci0JCQkJCXJlc3VsdCA9IG1hcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSBmYWN0b3J5ID0gZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCAmJiBmYWN0b3J5LmFjY2VwdHModGFnTmFtZSkpIHsKLQkJCQlyZXN1bHQgPSBmYWN0b3J5LmNyZWF0ZSh0YWdOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHN0cmluZyB0b2dldGhlciBhcnJheXMgb2YgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGFycmF5MS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgYXJyYXkxLmxlbmd0aCArIGFycmF5Mi5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTEubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3Qgb2JqZWN0MikgewotCQlPYmplY3RbXSBuZXdBcnJheSA9IG5ldyBPYmplY3RbXXtvYmplY3QyfTsKLQkJcmV0dXJuIGNvbmNhdChhcnJheTEsIG5ld0FycmF5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUGFyZW50QW5kVGV4dEF0dHJpYnV0ZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBwYXJlbnRGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHBhcmVudCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihkb21OYW1lLCBwYXJlbnRGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JCXBhcmVudC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltde25ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBjaGlsZEZlYXR1cmUpfSk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCWluaXRpYWxpemVET01OYW1lQW5kUGF0aChkb21OYW1lQW5kUGF0aCk7Ci0JCXNldEVNRkNsYXNzKGVDbGFzcyk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKGRvbU5hbWVBbmRQYXRoKTsKLQkJc2V0RmVhdHVyZShhRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJdGhpcyhkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCQlzZXRFTUZDbGFzcyhlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBwYXRoKSB7Ci0JCXRoaXMoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBuZXcgVHJhbnNsYXRvclBhdGhbXXtwYXRofSk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gcGF0aHMpIHsKLQkJaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKGRvbU5hbWVBbmRQYXRoKTsKLQkJZlRyYW5zbGF0b3JQYXRocyA9IHBhdGhzOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCWluaXRpYWxpemVET01OYW1lQW5kUGF0aChkb21OYW1lQW5kUGF0aCk7Ci0JCWZTdHlsZSA9IHN0eWxlOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVjb3JlUGFja2FnZSBnZXRFY29yZVBhY2thZ2UoKSB7Ci0JCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGZET01OYW1lc1swXTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RE9NTmFtZXMoKSB7Ci0JCXJldHVybiBmRE9NTmFtZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRET01QYXRoKCkgewotCQlyZXR1cm4gZkRPTVBhdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRE9NUGF0aCgpIHsKLQkJcmV0dXJuIGZET01QYXRoICE9IG51bGwgJiYgZkRPTVBhdGgubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBET00gbmFtZXMgYW5kIHBhdGggb3V0IG9mIDxkb21OYW1lQW5kUGF0aD5hbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKFN0cmluZyBkb21OYW1lQW5kUGF0aEFyZykgewotCQlpZiAoZG9tTmFtZUFuZFBhdGhBcmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGlueCA9IGRvbU5hbWVBbmRQYXRoQXJnLmxhc3RJbmRleE9mKCcvJyk7Ci0JCWlmIChpbnggIT0gLTEpIHsKLQkJCWZET01OYW1lcyA9IHBhcnNlRE9NTmFtZXMoZG9tTmFtZUFuZFBhdGhBcmcuc3Vic3RyaW5nKGlueCArIDEpKTsKLQkJCWZET01QYXRoID0gZG9tTmFtZUFuZFBhdGhBcmcuc3Vic3RyaW5nKDAsIGlueCk7Ci0JCX0gZWxzZSB7Ci0JCQlmRE9NTmFtZXMgPSBwYXJzZURPTU5hbWVzKGRvbU5hbWVBbmRQYXRoQXJnKTsKLQkJCWZET01QYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBhZGRlZCBieSBNREUKLQkJdGhpcy5kb21OYW1lQW5kUGF0aCA9IGRvbU5hbWVBbmRQYXRoQXJnOwotCi0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgYW4gZW1wdHkgdGFnOyBlZywgPGRpc3RyaWJ1dGFibGUvPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ0RBVEFDb250ZW50KCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIENEQVRBX0NPTlRFTlQpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIERPTU5hbWUgcmVwcmVzZW50cyBhIHN1YiBlbGVtZW50IG5hbWUgb3IgYW4gYXR0cmlidXRlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgRE9NTmFtZSBpcyBhbiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RPTUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBET01fQVRUUklCVVRFKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSB3cml0dGVuIGFzIGFuIGVtcHR5IHRhZzsgZWcsIDxkaXN0cmlidXRhYmxlLz4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VGFnKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIEVNUFRZX1RBRykgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW5VcHBlcmNhc2UoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgQk9PTEVBTl9GRUFUVVJFKSAhPSAwICYmIChmU3R5bGUgJiBCT09MRUFOX0xPV0VSQ0FTRSkgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW5GZWF0dXJlKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIEJPT0xFQU5fRkVBVFVSRSkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRFbmRUYWcoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgRU5EX1RBR19OT19JTkRFTlQpID09IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50RW5kVGFnKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gc2hvdWxkSW5kZW50RW5kVGFnKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpIHsKLQkJcmV0dXJuICgoZlN0eWxlICYgRU1QVFlfVEFHKSAhPSAwKSB8fCAoKGZTdHlsZSAmIEVNUFRZX0NPTlRFTlRfSVNfU0lHTklGSUNBTlQpICE9IDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyB0byBhbm90aGVyIE1PRiBvYmplY3QgKG5vdCBhIHByaW1pdGl2ZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09iamVjdE1hcCgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBPQkpFQ1RfTUFQKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBmb3IgYSBzaGFyZWQgcmVmZXJlbmNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgU0hBUkVEX1JFRkVSRU5DRSkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VudW1XaXRoSHlwaGVucygpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBFTlVNX0ZFQVRVUkVfV0lUSF9IWVBIRU5TKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtYXAgcmVwcmVzZW50cyBhIGNhc2Ugd2hlcmUgdGhlIHRleHQgb2YgdGhlIERPTU5vZGUgcmVwcmVzZW50cyB0aGUKLQkgKiBvYmplY3RzIG9uZSBhbmQgb25seSBhdHRyaWJ1dGUgdmFsdWUuIEFuIGV4YW1wbGUgb2YgdGhpcyBjYXNlIGlzIGEgPHdlbGNvbWUtZmlsZT5maWxlLnR4dAotCSAqIDwvd2VsY29tZS1maWxlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RPTVRleHRWYWx1ZSgpIHsKLQkJcmV0dXJuIGZET01OYW1lc1swXSA9PSBURVhUX0FUVFJJQlVURV9WQUxVRTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaWQgaXMgdGhlIG1vZiBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgc2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSURNYXAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaWQgaXMgdGhlIG1vZiBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgc2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlua01hcCgpIHsKLQkJcmV0dXJuIGZUcmFuc2xhdG9yUGF0aHMgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RhcmdldExpbmtNYXAoKSB7Ci0JCXJldHVybiBpc0xpbmtNYXAoKSAmJiAhaXNPYmplY3RNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hcCBpcyB0aGUgb25lIHJlcHJlc2VudGluZyBhIG5vZGUgd2l0aCB0aGUgbmFtZSA8ZG9tTmFtZT4uIEJ5IGRlZmF1bHQKLQkgKiB0aGlzIG1ldGhvZCBzaW1wbHkgY29tcGFyZXMgdGhlIERPTSBuYW1lIG9mIHRoZSBtYXAgYWdhaW5zdCB0aGUgPGRvbU5hbWU+cGFyYW1ldGVyCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGRvbU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hcEZvcihTdHJpbmcgZG9tTmFtZSkgewotCQlpZiAoZG9tTmFtZS5lcXVhbHMoZ2V0RE9NUGF0aCgpKSkKLQkJCXJldHVybiB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZET01OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRvbU5hbWUuZXF1YWxzKGZET01OYW1lc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwRm9yKE9iamVjdCBhRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIGZlYXR1cmUgPT0gYUZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgZmVhdHVyZSBiZWluZyBtYXBwZWQgaXMgYSBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBmZWF0dXJlIGlzIG11bHRpIHZhbHVlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKCkgewotCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJcmV0dXJuIGZlYXR1cmUuaXNNYW55KCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgY29tbWEgc2VwYXJhdGVkIG5hbWVzIGZyb20gPGRvbU5hbWVzU3RyaW5nPi4gUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqIEBwYXJhbSBkb21OYW1lc1N0cmluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBwYXJzZURPTU5hbWVzKFN0cmluZyBkb21OYW1lc1N0cmluZykgewotCQlpbnQgc3RhcnRJbnggPSAwOwotCQlpbnQgaW54ID0gZG9tTmFtZXNTdHJpbmcuaW5kZXhPZignLCcpOwotCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCXdoaWxlIChpbnggIT0gLTEpIHsKLQkJCXJlc3VsdHMuYWRkKGRvbU5hbWVzU3RyaW5nLnN1YnN0cmluZyhzdGFydElueCwgaW54KSk7Ci0JCQlzdGFydElueCA9IGlueCArIDE7Ci0JCQlpbnggPSBkb21OYW1lc1N0cmluZy5pbmRleE9mKCcsJywgc3RhcnRJbngpOwotCQl9Ci0JCWlmIChzdGFydElueCA9PSAwKQotCQkJcmVzdWx0cy5hZGQoZG9tTmFtZXNTdHJpbmcpOwotCQllbHNlCi0JCQlyZXN1bHRzLmFkZChkb21OYW1lc1N0cmluZy5zdWJzdHJpbmcoc3RhcnRJbngpKTsKLQkJcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBjbiA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlpbnQgaSA9IGNuLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWNuID0gY24uc3Vic3RyaW5nKCsraSwgY24ubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoY24pOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKGZET01OYW1lc1swXSk7Ci0JCWZvciAoaW50IGogPSAxOyBqIDwgZkRPTU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlzYi5hcHBlbmQoJ3wnKTsKLQkJCXNiLmFwcGVuZChmRE9NTmFtZXNbal0pOwotCQl9Ci0JCXNiLmFwcGVuZCgnLCcpOwotCQlzYi5hcHBlbmQoaGFzaENvZGUoKSk7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBUcmFuc2xhdG9yUGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBUcmFuc2xhdG9yUGF0aAotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUGF0aFtdIGdldFRyYW5zbGF0b3JQYXRocygpIHsKLQkJcmV0dXJuIGZUcmFuc2xhdG9yUGF0aHM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zbGF0b3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlUcmFuc2xhdG9yIG1hcEluZm8gPSAoVHJhbnNsYXRvcikgb2JqZWN0OwotCQlyZXR1cm4gZkRPTU5hbWVzLmVxdWFscyhtYXBJbmZvLmdldERPTU5hbWVzKCkpICYmIChmZWF0dXJlID09IG51bGwgJiYgbWFwSW5mby5nZXRGZWF0dXJlKCkgPT0gbnVsbCB8fCBmZWF0dXJlLmVxdWFscyhtYXBJbmZvLmdldEZlYXR1cmUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlzTWFuYWdlZEJ5UGFyZW50LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4obnVsbCwgLTEpID09IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBJbiB0aGUgOTklIGNhc2UgdGhlcmUgaXMgb25seSBvbmUgbm9kZSBuYW1lIHRvIGJlIGNvbmNlcm5lZCB3aXRoLCBidXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKLQkgKiBmb3IgdGhlIGNhc2VzIHdoZXJlIG11bHRpcGxlIGRvbSBuYW1lcyBtYXAgdG8gb25lIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlpZiAoZW1mQ2xhc3MgPT0gbnVsbCkgewotCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpc09iamVjdE1hcCgpKQotCQkJCXJldHVybiBjcmVhdGVFTUZPYmplY3QoZmVhdHVyZSk7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZUVNRk9iamVjdChlbWZDbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJaWYgKGFGZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gY3JlYXRlRU1GT2JqZWN0KCgoRVJlZmVyZW5jZSkgYUZlYXR1cmUpLmdldEVSZWZlcmVuY2VUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoRUNsYXNzIGFuRUNsYXNzKSB7Ci0JCWlmIChhbkVDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBhbkVDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKS5jcmVhdGUoYW5FQ2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRWYWx1ZUlmTmVjZXNzYXJ5KFN0cmluZyB0ZXh0VmFsdWUsIE5vdGlmaWVyIG93bmVyLCBpbnQgdmVyc2lvbklkKSB7Ci0JCVRyYW5zbGF0b3IgdGV4dFRyYW5zbGF0b3IgPSB0aGlzLmZpbmRDaGlsZChUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBvd25lciwgdmVyc2lvbklkKTsKLQkJaWYgKHRleHRUcmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCU9iamVjdCBvYmplY3RWYWx1ZSA9IHRleHRUcmFuc2xhdG9yLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHRleHRWYWx1ZSwgKEVPYmplY3QpIG93bmVyKTsKLQkJCXRleHRUcmFuc2xhdG9yLnNldE1PRlZhbHVlKG93bmVyLCBvYmplY3RWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgZmVhdHVyZSBpcyB2YWxpZCBvbiBhIHBhcnRpY3VsYXIgbW9mT2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmVhdHVyZSBzcGVjaWZpZWQgZXhpc3RzIG9uIHRoZSBNT0Ygb2JqZWN0LgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBlbWZPYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmUuZ2V0TmFtZSgpKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFRyYW5zbGF0b3JzIHdoaWNoIGRvIG5vdCBoYXZlIGEgZmVhdHVyZSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCBjdXN0b20gYmVoYXZpb3IuCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0U3RyaW5nVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJaWYgKGlzRW1wdHlUYWcoKSAmJiBmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vRmFrZSBpdCBvdXQgd2l0aCBhIHZhbHVlIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lLCBTdHJpbmcgdmFsdWUsIE5vdGlmaWVyIG93bmVyKSB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCi0JCQlpZiAoIXRoaXMuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCQkJCXJlc3VsdCA9IGNyZWF0ZUVNRk9iamVjdChub2RlTmFtZSwgcmVhZEFoZWFkTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKHZhbHVlLCAoRU9iamVjdCkgb3duZXIpOwotCQkJfQotCi0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSBzdHJpbmcgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0IFRoZSBjb252ZXJ0ZWQgdmFsdWUKLQkgKiBAcGFyYW0gc3RyVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gc3RyVmFsdWU7Ci0JCWlmIChzdHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNFbnVtV2l0aEh5cGhlbnMoKSkKLQkJCQlzdHJWYWx1ZSA9IHN0clZhbHVlLnJlcGxhY2UoJy0nLCAnXycpOwotCQkJaWYgKCFpc0NEQVRBQ29udGVudCgpKSB7Ci0JCQkJc3RyVmFsdWUgPSBzdHJWYWx1ZS50cmltKCk7Ci0JCQl9Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gRmVhdHVyZVZhbHVlQ29udmVydGVyLkRFRkFVTFQuY29udmVydFZhbHVlKHN0clZhbHVlLCBmZWF0dXJlKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWlmIChpc0VtcHR5VGFnKCkgJiYgIWlzRE9NQXR0cmlidXRlKCkgJiYgIWlzRE9NVGV4dFZhbHVlKCkgJiYgaXNCb29sZWFuRmVhdHVyZSgpKQotCQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCQlFT2JqZWN0IGNvbnZlcnRUb1R5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCQlpZiAoY29udmVydFRvVHlwZSA9PSBudWxsKQotCQkJCXZhbHVlID0gc3RyVmFsdWU7Ci0JCQllbHNlIGlmIChjb252ZXJ0VG9UeXBlLmVxdWFscyhnZXRFY29yZVBhY2thZ2UoKS5nZXRFU3RyaW5nKCkpKSB7Ci0JCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHR5cGUgdG8gYSBzdHJpbmcgdmFsdWUuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGZvciBzcGVjaWFsCi0JICogY2FzZXMgd2hlcmUgc3BlY2lhbCBjb252ZXJzaW9uIG5lZWRzIHRvIG9jY3VyIGJhc2VkIG9uIHRoZSBmZWF0dXJlIGFuZCBvciBvYmplY3QgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyBUaGUgY29udmVydGVkIHZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gY29udmVydC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAoaXNFbXB0eVRhZygpIHx8IHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaXNFbnVtV2l0aEh5cGhlbnMoKSkKLQkJCXJldHVybiB2YWx1ZS50b1N0cmluZygpLnJlcGxhY2UoJ18nLCAnLScpOwotCQllbHNlIGlmIChpc0Jvb2xlYW5VcHBlcmNhc2UoKSkKLQkJCXJldHVybiAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSA/ICJUcnVlIiA6ICJGYWxzZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXJldHVybiB2YWx1ZS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0VmFyaWFibGVDaGlsZHJlbihOb3RpZmllciB0YXJnZXQsIGludCB2ZXJzaW9uKSB7Ci0JCVRyYW5zbGF0b3JbXSByZXN1bHRzID0gbnVsbDsKLQkJVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSBmYWN0b3J5ID0gZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlMaXN0IHZhcmlhYmxlVHJhbnNsYXRvcnMgPSBmYWN0b3J5LmNyZWF0ZSh0YXJnZXQpOwotCQkJaWYgKHZhcmlhYmxlVHJhbnNsYXRvcnMgIT0gbnVsbCAmJiB2YXJpYWJsZVRyYW5zbGF0b3JzLnNpemUoKSA+IDApIHsKLQkJCQlPYmplY3RbXSB2dG9hID0gdmFyaWFibGVUcmFuc2xhdG9ycy50b0FycmF5KCk7Ci0KLQkJCQlyZXN1bHRzID0gbmV3IFRyYW5zbGF0b3JbdnRvYS5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykKLQkJCQkJcmVzdWx0c1tpXSA9IChUcmFuc2xhdG9yKSB2dG9hW2ldOwotCQkJfQotCi0JCX0KLQkJaWYgKHJlc3VsdHMgPT0gbnVsbCkKLQkJCXJlc3VsdHMgPSBuZXcgVHJhbnNsYXRvclswXTsKLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBudWxsIGJ5IGRlZmF1bHQ7IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHJldHVybiBzcGVjaWZpYyBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgTU9GIGNoaWxkcmVuIHRoYXQgY3VycmVudGx5IGV4aXN0IGZvciB0aGUgdmFsdWVzIG9mIGFuIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCUxpc3QgcmVzdWx0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJaWYgKGlzTXVsdGlWYWx1ZWQoKSkKLQkJCXJlc3VsdCA9IChMaXN0KSB2YWx1ZTsKLQkJZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmFsdWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbW9mT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhIHZhbHVlIG9mIGEgZmVhdHVyZSBpbiBhIG1vZiBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSwgaW50IG5ld0luZGV4KSB7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCWlmICgoZlN0eWxlICYgVU5TRVRfSUZfTlVMTCkgIT0gMCAmJiB2YWx1ZSA9PSBudWxsKQotCQkJCUV4dGVuZGVkRWNvcmVVdGlsLmVVbnNldE9yUmVtb3ZlKChFT2JqZWN0KSBvd25lciwgZmVhdHVyZSwgdmFsdWUpOwotCQkJZWxzZQotCQkJCUV4dGVuZGVkRWNvcmVVdGlsLmVTZXRPckFkZCgoRU9iamVjdCkgb3duZXIsIGZlYXR1cmUsIHZhbHVlLCBuZXdJbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChvd25lciBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXNldE1PRlZhbHVlKChFT2JqZWN0KSBvd25lciwgdmFsdWUpOwotCQl9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCXNldE1PRlZhbHVlKChSZXNvdXJjZSkgb3duZXIsIHZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJLy8JCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCS8vCQkJZW1mT2JqZWN0LmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQlzZXRNT0ZWYWx1ZShlbWZPYmplY3QsIHZhbHVlLCAtMSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNzZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoUmVzb3VyY2UgcmVzLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHJlcyAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpCi0JCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQoKEVPYmplY3QpdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCUV4dGVuZGVkRWNvcmVVdGlsLmVVbnNldE9yUmVtb3ZlKChFT2JqZWN0KSBvd25lciwgZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJYm9vbGVhbiBpc1NldCA9IGZlYXR1cmUgIT0gbnVsbCAmJiBlbWZPYmplY3QuZUlzU2V0KGZlYXR1cmUpOwotCQlpZiAoaXNFbXB0eVRhZygpKQotCQkJcmV0dXJuIGlzU2V0ICYmICgoQm9vbGVhbikgZW1mT2JqZWN0LmVHZXQoZmVhdHVyZSkpLmJvb2xlYW5WYWx1ZSgpOwotCQlyZXR1cm4gaXNTZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5TZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJZW1mT2JqZWN0LmVVbnNldChmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckxpc3QoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCSgoTGlzdCkgbW9mT2JqZWN0LmVHZXQoZmVhdHVyZSkpLmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gYUZlYXR1cmU7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vVGhpcyB3YXkgYW4gaW5zdGFuY2UgY2hlY2sgaGFwcGVucyBvbmx5IG9uY2UKLQkJaWYgKGFGZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJZlN0eWxlIHw9IE9CSkVDVF9NQVA7Ci0JCQlpZiAoISgoRVJlZmVyZW5jZSkgYUZlYXR1cmUpLmlzQ29udGFpbm1lbnQoKSkKLQkJCQlmU3R5bGUgfD0gU0hBUkVEX1JFRkVSRU5DRTsKLQkJfQotCi0JCWlmIChnZXRFY29yZVBhY2thZ2UoKS5nZXRFQm9vbGVhbigpID09IGZlYXR1cmUuZ2V0RVR5cGUoKSkKLQkJCWZTdHlsZSB8PSBCT09MRUFOX0ZFQVRVUkU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RU1GQ2xhc3MoRUNsYXNzIGFuRUNsYXNzKSB7Ci0JCXRoaXMuZW1mQ2xhc3MgPSBhbkVDbGFzczsKLQkJaWYgKGFuRUNsYXNzICE9IG51bGwpCi0JCQlmU3R5bGUgfD0gT0JKRUNUX01BUDsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1JlYWRBaGVhZE5hbWVzKCkgewotCQlyZXR1cm4gcmVhZEFoZWFkTmFtZXMgIT0gbnVsbCAmJiAhcmVhZEFoZWFkTmFtZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVhZCBhaGVhZCBuYW1lcywgaWYgdGhleSBhcmUgZGVmaW5lZCwgZm9yIGEgZ2l2ZW4gcGFyZW50IG5vZGUgbmFtZS4gVGhpcyBpcyB1c2VkCi0JICogd2hlbiBjcmVhdGlvbiBvZiBhIHNwZWNpZmljIEVNRiBvYmplY3QgaXMgZGVwZW5kZW50IG9uIHRoZSB2YWx1ZSBvZiBhIGNoaWxkIG5vZGUuCi0JICovCi0JcHVibGljIFJlYWRBaGVhZEhlbHBlciBnZXRSZWFkQWhlYWRIZWxwZXIoU3RyaW5nIHBhcmVudE5hbWUpIHsKLQkJaWYgKHJlYWRBaGVhZE5hbWVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChSZWFkQWhlYWRIZWxwZXIpIHJlYWRBaGVhZE5hbWVzLmdldChwYXJlbnROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWFkQWhlYWRIZWxwZXIoUmVhZEFoZWFkSGVscGVyIGhlbHBlcikgewotCQlpZiAocmVhZEFoZWFkTmFtZXMgPT0gbnVsbCkKLQkJCXJlYWRBaGVhZE5hbWVzID0gbmV3IEhhc2hNYXAoMyk7Ci0JCXJlYWRBaGVhZE5hbWVzLnB1dChoZWxwZXIuZ2V0UGFyZW50RE9NTmFtZSgpLCBoZWxwZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVwZW5kZW5jeUNoaWxkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVwZW5kZW5jeVBhcmVudCgpIHsKLQkJaWYgKGlzRGVwZW5kZW5jeVBhcmVudCA9PSBudWxsKSB7Ci0JCQlpc0RlcGVuZGVuY3lQYXJlbnQgPSBCb29sZWFuLkZBTFNFOwotCQkJVHJhbnNsYXRvcltdIHRoZUNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4obnVsbCwgLTEpOwotCQkJaWYgKHRoZUNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCS8vRm9yIG5vdyB3ZSBhc3N1bWUgb25lCi0JCQkJCWlmICh0aGVDaGlsZHJlbltpXS5pc0RlcGVuZGVuY3lDaGlsZCgpKSB7Ci0JCQkJCQlpc0RlcGVuZGVuY3lQYXJlbnQgPSBCb29sZWFuLlRSVUU7Ci0JCQkJCQlkZXBlbmRlbmN5RmVhdHVyZSA9IHRoZUNoaWxkcmVuW2ldLmdldERlcGVuZGVuY3lGZWF0dXJlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzRGVwZW5kZW5jeVBhcmVudC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXREZXBlbmRlbmN5RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGRlcGVuZGVuY3lGZWF0dXJlOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGJhc2ljR2V0RGVwZW5kZW5jeU9iamVjdChFT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gKEVPYmplY3QpIHBhcmVudC5lR2V0KGRlcGVuZGVuY3lGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2Ugd2hlbiB0aGUgRE9NIHBhdGggaXMgbm90IG51bGwsIGFuZCB0aGVyZSBhcmUgbm8gY2hpbGRyZW4uIERlZmF1bHQgaXMgZmFsc2UsIGJ1dAotCSAqIHN1YmNsYXNzZXMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5kZXJFbXB0eURPTVBhdGgoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCXJldHVybiBpc0VtcHR5Q29udGVudFNpZ25pZmljYW50KCk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHdoZW4gdGhlIHRyYW5zbGF0b3IgdG9sZXJhdGVzIHBhcmVudCBub2RlcyB0aGF0IHJlbGF0ZSB0byB0aGUgRE9NIHBhdGgsIGFuZCBubyBjaGlsZHJlbjsKLQkgKiBkZWZhdWx0IGlzIGRvIG5vdGhpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZUZyb21FbXB0eURPTVBhdGgoRU9iamVjdCBlT2JqZWN0KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBOYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGVzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVNwYWNlKCkgewotCQlyZXR1cm4gZk5hbWVTcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG5hbWVzcGFjZSBmb3IgdGhlIGRvbSBhdHRyaWJ1dGUKLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZVNwYWNlKFN0cmluZyBzdHJpbmcpIHsKLQkJZk5hbWVTcGFjZSA9IHN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSBnZXRWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5KCkgewotCQlpZiAoaXNPYmplY3RNYXAoKSkKLQkJCXJldHVybiBEZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkuSU5TVEFOQ0U7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW51bUZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlICE9IG51bGwgJiYgRUNPUkVfUEFDS0FHRS5nZXRFRW51bSgpLmlzSW5zdGFuY2UoZmVhdHVyZS5nZXRFVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0dGFibGUoKSB7Ci0JCXJldHVybiBmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZS5pc1Vuc2V0dGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RhdGFUeXBlKCkgewotCQlyZXR1cm4gZmVhdHVyZSAhPSBudWxsICYmIGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21tZW50KCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIENPTU1FTlRfRkVBVFVSRSkgIT0gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyMDY3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIxLCAyMDAzCi0gKiAgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotCi0vKgotICogVHJhbnNsYXRvciBmaWx0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBPYmplY3QgYW5kIEF0dHJpYnV0ZSBUcmFuc2xhdG9ycyB3aXRob3V0Ci0gKiBicmVha2luZyB0aGVtIG91dCBpbnRvIHNlcGVyYXRlIGRhdGEgc3RydWN0dXJlcy4gVGhlIEZpbHRlciB3aWxsIHJlbHkgb24gdGhlIHVuZGVybHlpbmcgZGF0YQotICogc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgdGhlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBUcmFuc2xhdG9yLgotICogCi0gKiBnZXROZXh0Q2hpbGQoKSB3aWxsIHJldHVybiBudWxsIHdoZW4gbm8gb3RoZXIgdHJhbnNsYXRvcnMgb2YgdGhlIGdpdmVuIGdlbnJlIGFyZSBhdmFpbGFibGUuCi0gKiAKLSAqIFRoZSBwcm9jZXNzaW5nIGhpbnRzIHdoaWNoIGFyZSBjcmVhdGVkIGFuZCB0aGVuIHBhc3NlZCB0byBnZXROZXh0KlRyYW5zbGF0b3IoKSBzdG9yZSBpbmZvcm1hdGlvbgotICogdGhhdCBuZWVkcyB0byBiZSBwZXJzaXN0ZWQgYmV0d2VlbiBjYWxscy4gVGhlIGNyZWF0ZVByb2Nlc3NpbmdIaW50cygpIHdpbGwgY3JlYXRlIGEgcHJvcGVybHkKLSAqIGluaXRpYWxpemVkIGFycmF5LiBUaGUgY29uc3RhbnRzIE5FWFRfU1RBUlRfSElOVF9JTkRYIGFuZCBNT0RFX0hJTlRfSU5EWCBwcm92aWRlIHBvaW50ZXJzIGludG8KLSAqIHRoZSBhcnJheSBmb3IgdGhlIE5FWFRfU1RBUlQgcG9zaXRpb24gYW5kIHRoZSBwcm9wZXIgbW9kZSB0byBvcGVyYXRlIGluCi0gKiAoU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERSBvcgotICogIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNsYXRvckZpbHRlciB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVHJhbnNsYXRvciB0cmFuc2xhdG9yOwotCXByb3RlY3RlZCBmaW5hbCBpbnQgdmVyc2lvbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FWFRfU1RBUlRfSElOVF9JTkRYID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0hJTlRfSU5EWCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQVJJQUJMRV9UUkFOU0xBVE9SU19NT0RFID0gMTsKLQotCS8qCi0JICogVGhlc2UgVHJhbnNsYXRvckZpbHRlcnMgYXJlIHVzZWQgaW4gYSBzdGF0ZWxlc3MgbW9kZS4gT25seSB0aGVpciBzY2FuTmV4dFRyYW5zbGF0b3IoKSBtZXRob2RzCi0JICogd2lsbCBiZSBpbnZva2VkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvckZpbHRlciBvYmplY3RUcmFuc2xhdG9yRmlsdGVyID0gbmV3IE9iamVjdFRyYW5zbGF0b3JGaWx0ZXIobnVsbCwgLTEpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JGaWx0ZXIgYXR0cmlidXRlVHJhbnNsYXRvckZpbHRlciA9IG5ldyBBdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyKG51bGwsIC0xKTsKLQotCi0JcHJvdGVjdGVkIGludCBtb2RlID0gU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERTsKLQlwcm90ZWN0ZWQgaW50IGluZGV4ID0gLTE7Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBjYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yID0gbnVsbDsKLQotCXB1YmxpYyBUcmFuc2xhdG9yRmlsdGVyKFRyYW5zbGF0b3IgdHJhbnMsIGludCB2ZXJzaW9uKSB7Ci0JCXRoaXMudHJhbnNsYXRvciA9IHRyYW5zOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIENhbGxpbmcgcGVlayB0d2ljZSB3aWxsIGFkdmFuY2UgdGhlIGN1cnJlbnQgY2hpbGQKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBwZWVrTmV4dENoaWxkKEVPYmplY3QgdGFyZ2V0KSB7Ci0JCWNhY2hlZFBlZWtBaGVhZFRyYW5zbGF0b3IgPSBnZXROZXh0Q2hpbGQodGFyZ2V0KTsKLQkJcmV0dXJuIGNhY2hlZFBlZWtBaGVhZFRyYW5zbGF0b3I7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmV4dENoaWxkKCkgd2lsbCByZXR1cm4gbnVsbCB3aGVuIG5vIG90aGVyIHRyYW5zbGF0b3JzIG9mIHRoZSBnaXZlbiBnZW5yZSBhcmUgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldE5leHRDaGlsZChFT2JqZWN0IHRhcmdldCkgewotCi0JCVRyYW5zbGF0b3IgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGNhY2hlZFBlZWtBaGVhZFRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvcjsKLQkJCWNhY2hlZFBlZWtBaGVhZFRyYW5zbGF0b3IgPSBudWxsOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWludCBmb3VuZCA9IDA7Ci0JCVRyYW5zbGF0b3IgY2hpbGRyZW5bXSA9IG51bGw7Ci0JCXN3aXRjaCAobW9kZSkgewotCQkJY2FzZSBTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFIDoKLQkJCQljaGlsZHJlbiA9IHRoaXMudHJhbnNsYXRvci5nZXRDaGlsZHJlbih0YXJnZXQsIHRoaXMudmVyc2lvbik7Ci0KLQkJCQkvKiBMb29rIGZvciB0aGUgbmV4dCBBdHRyaWJ1dGUgVHJhbnNsYXRvciAqLwotCQkJCWZvdW5kID0gc2Nhbk5leHRUcmFuc2xhdG9yKGNoaWxkcmVuLCB0aGlzLmluZGV4KTsKLQotCQkJCWlmIChmb3VuZCA+PSAwKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIElmIGZvdW5kLCAoMSkgdXBkYXRlIHRoZSByZXN1bHQsICgyKSB1cGRhdGUgdGhlIGluZGV4IHNvIHdlIGNhbiBza2lwIGFoZWFkIG9uCi0JCQkJCSAqIHRoZSBuZXh0IGludm9jYXRpb24gKDMpIGVzY2FwZSB0aGUgVkFSSUFCTEVfVFJBTlNMQVRPUlMgcHJvY2Vzc2luZwotCQkJCQkgKi8KLQkJCQkJcmVzdWx0ID0gY2hpbGRyZW5bZm91bmRdOwotCQkJCQl0aGlzLmluZGV4ID0gZm91bmQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIFJlc2V0IHRoZSBpbmRleC4gRE8gTk9UIEJSRUFLLiBBbGxvdyBlbnRyeSBpbnRvIFZBUklBQkxFX1RSQU5TTEFUT1JTIGNhc2UKLQkJCQkgKi8KLQkJCQl0aGlzLmluZGV4ID0gLTE7Ci0JCQkJLyoKLQkJCQkgKiB1cGRhdGUgdGhlIG1vZGUgdG8gVkFSSUFCTEVfVFJBTlNMQVRPUlMgc28gd2UgY2FuIHNraXAgdG8gaXQgZGlyZWN0bHkgbmV4dCB0aW1lCi0JCQkJICovCi0JCQkJdGhpcy5tb2RlID0gVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERTsKLQkJCWNhc2UgVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERSA6Ci0JCQkJY2hpbGRyZW4gPSB0aGlzLnRyYW5zbGF0b3IuZ2V0VmFyaWFibGVDaGlsZHJlbih0YXJnZXQsIHRoaXMudmVyc2lvbik7Ci0JCQkJZm91bmQgPSBzY2FuTmV4dFRyYW5zbGF0b3IoY2hpbGRyZW4sIHRoaXMuaW5kZXgpOwotCQkJCWlmIChmb3VuZCA+PSAwKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIElmIGZvdW5kLCAoMSkgdXBkYXRlIHRoZSByZXN1bHQsICgyKSB1cGRhdGUgdGhlIGluZGV4IHNvIHdlIGNhbiBza2lwIGFoZWFkIG9uCi0JCQkJCSAqIHRoZSBuZXh0IGludm9jYXRpb24KLQkJCQkJICovCi0JCQkJCXJlc3VsdCA9IGNoaWxkcmVuW2ZvdW5kXTsKLQkJCQkJdGhpcy5pbmRleCA9IGZvdW5kOwotCQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGNyZWF0ZVByb2Nlc3NpbmdIaW50cygpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXXstMSwgU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERX07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIGdldE5leHRBdHRyaWJ1dGVUcmFuc2xhdG9yKFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgaW50IHN0YXJ0SGludCwgaW50W10gbmV4dEhpbnQsIEVPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbikgewotCi0JCXJldHVybiBUcmFuc2xhdG9yRmlsdGVyLmdldE5leHRDaGlsZCh0cmFuc2xhdG9yLCBzdGFydEhpbnQsIG5leHRIaW50LCB0YXJnZXQsIHZlcnNpb24sIGF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBnZXROZXh0T2JqZWN0VHJhbnNsYXRvcihUcmFuc2xhdG9yIHRyYW5zbGF0b3IsIGludCBzdGFydEhpbnQsIGludFtdIG5leHRIaW50LCBFT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb24pIHsKLQotCQlyZXR1cm4gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0Q2hpbGQodHJhbnNsYXRvciwgc3RhcnRIaW50LCBuZXh0SGludCwgdGFyZ2V0LCB2ZXJzaW9uLCBvYmplY3RUcmFuc2xhdG9yRmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROZXh0Q2hpbGQoKSB0YWtlcyBoaW50cyBvbiB3aGVyZSB0byBiZWdpbiBpbiB0aGUgY2hpbGRyZW4gYXJyYXkgb2YgdGhlIGdpdmVuIFRyYW5zbGF0b3IuCi0JICogV2hlbiBpdCBmaW5kcyB0aGUgdHJhbnNsYXRvciwgaXQgd2lsbCB1cGRhdGUgdGhlIGhpbnRzIGFycmF5IHdpdGggdGhlIHN0YXJ0IGhpbnQgZm9yIHRoZSBuZXh0Ci0JICogaW52b2NhdGlvbihoaW50c1swXSkgYW5kIHdoZW4gbmVjZXNzYXJ5IGl0IHdpbGwgdXNlIHVwZGF0ZSB0aGUgbW9kZSAoaGludHNbMV0pIHRvIGVpdGhlcgotCSAqIFNUQU5EQVJEX1RSQU5TTEFUT1JTIG9yIFZBUklBQkxFX1RSQU5TTEFUT1JTLgotCSAqIAotCSAqIEBwYXJhbSB0cmFuc2xhdG9yCi0JICogQHBhcmFtIHN0YXJ0SGludAotCSAqIEBwYXJhbSBoaW50cwotCSAqICAgICAgICAgICAgYSB0d28tZWxlbWVudCBhcnJheTogaGludHNbMF0gd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIG5leHQgc3RhcnRIaW50IGFuZCBoaW50c1sxXQotCSAqICAgICAgICAgICAgd2lsbCBiZSB1c2VkIHRvIHN0b3JlIHRoZSBtb2RlLgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqIEBwYXJhbSB0cmFuc2xhdG9yRmlsdGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBnZXROZXh0Q2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBpbnQgc3RhcnRIaW50LCBpbnRbXSBoaW50cywgRU9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uLCBUcmFuc2xhdG9yRmlsdGVyIHRyYW5zbGF0b3JGaWx0ZXIpIHsKLQotCQlUcmFuc2xhdG9yIHJlc3VsdCA9IG51bGw7Ci0KLQkJaW50IGluZGV4ID0gc3RhcnRIaW50OwotCQlUcmFuc2xhdG9yIGNoaWxkcmVuW10gPSBudWxsOwotCi0JCXN3aXRjaCAoaGludHNbTU9ERV9ISU5UX0lORFhdKSB7Ci0JCQljYXNlIFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREUgOgotCQkJCWNoaWxkcmVuID0gdHJhbnNsYXRvci5nZXRDaGlsZHJlbih0YXJnZXQsIHZlcnNpb24pOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIHN0YXJ0SGludCA8IGNoaWxkcmVuLmxlbmd0aCkgewotCi0JCQkJCS8qIExvb2sgZm9yIHRoZSBuZXh0IEF0dHJpYnV0ZSBUcmFuc2xhdG9yICovCi0JCQkJCWluZGV4ID0gdHJhbnNsYXRvckZpbHRlci5zY2FuTmV4dFRyYW5zbGF0b3IoY2hpbGRyZW4sIGluZGV4KTsKLQotCQkJCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIElmIGZvdW5kLCAoMSkgdXBkYXRlIHRoZSByZXN1bHQsICgyKSB1cGRhdGUgdGhlIGluZGV4IHNvIHdlIGNhbiBza2lwCi0JCQkJCQkgKiBhaGVhZCBvbiB0aGUgbmV4dCBpbnZvY2F0aW9uICgzKSBlc2NhcGUgdGhlIFZBUklBQkxFX1RSQU5TTEFUT1JTCi0JCQkJCQkgKiBwcm9jZXNzaW5nCi0JCQkJCQkgKi8KLQkJCQkJCXJlc3VsdCA9IGNoaWxkcmVuW2luZGV4XTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIERPIE5PVCBCUkVBSyB3ZSB3aWxsIGRlZmF1bHQgdG8gVkFSSUFCTEUgVFJBTlNMQVRPUlMgTU9ERSBzbyB3ZSBtdXN0IHJlc2V0Ci0JCQkJCSAqIHRoZSBzdGFydEhpbnQgYXBwcm9wcmlhdGVseQotCQkJCQkgKi8KLQkJCQkJc3RhcnRIaW50ID0gLTE7Ci0JCQkJfQotCi0JCQljYXNlIFZBUklBQkxFX1RSQU5TTEFUT1JTX01PREUgOgotCQkJCWhpbnRzW01PREVfSElOVF9JTkRYXSA9IFZBUklBQkxFX1RSQU5TTEFUT1JTX01PREU7Ci0JCQkJLyoKLQkJCQkgKiBSZXNldCB0aGUgaW5kZXguCi0JCQkJICovCi0JCQkJaW5kZXggPSBzdGFydEhpbnQ7Ci0JCQkJY2hpbGRyZW4gPSB0cmFuc2xhdG9yLmdldFZhcmlhYmxlQ2hpbGRyZW4odGFyZ2V0LCB2ZXJzaW9uKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwICYmIHN0YXJ0SGludCA8IGNoaWxkcmVuLmxlbmd0aCkgewotCQkJCQlpbmRleCA9IHRyYW5zbGF0b3JGaWx0ZXIuc2Nhbk5leHRUcmFuc2xhdG9yKGNoaWxkcmVuLCBpbmRleCk7Ci0JCQkJCXJlc3VsdCA9IChpbmRleCA+PSAwKSA/IGNoaWxkcmVuW2luZGV4XSA6IG51bGw7Ci0JCQkJfQotCQl9Ci0KLQkJaGludHNbTkVYVF9TVEFSVF9ISU5UX0lORFhdID0gKHJlc3VsdCA9PSBudWxsICYmIGNoaWxkcmVuICE9IG51bGwpID8gY2hpbGRyZW4ubGVuZ3RoIDogaW5kZXg7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgc2Nhbk5leHRUcmFuc2xhdG9yKFRyYW5zbGF0b3JbXSBjaGlsZHJlbiwgaW50IHN0YXJ0KTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKLQkJcmV0dXJuIG1vZGU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclBhdGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JQYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDg0M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclBhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLQotcHVibGljIGNsYXNzIFRyYW5zbGF0b3JQYXRoIHsKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIG1hcEluZm9QYXRoOwotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYW4gYXJyYXkgb2YgVHJhbnNsYXRvciB0aGF0IHNwZWNpZmllcyB0aGUgcGF0aCB0byBmb2xsb3cgZnJvbSBhbiBvYmplY3QgdG8KLQkgKiBhbm90aGVyIG9iamVjdAotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUGF0aChUcmFuc2xhdG9yW10gcGF0aCkgewotCQltYXBJbmZvUGF0aCA9IHBhdGg7Ci0JfQotCi0JcHVibGljIExpc3QgZmluZE9iamVjdHMoRU9iamVjdCBzdGFydE9iamVjdCkgewotCQlPYmplY3QgY3VyID0gc3RhcnRPYmplY3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwSW5mb1BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCVRyYW5zbGF0b3IgY3VyTWFwID0gbWFwSW5mb1BhdGhbaV07Ci0JCQlpZiAoY3VyIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjdXJBdHRyID0gY3VyTWFwLmdldEZlYXR1cmUoKTsKLQkJCQlpZiAoY3VyQXR0ciA9PSBUcmFuc2xhdG9yLkNPTlRBSU5FUl9GRUFUVVJFKSB7Ci0JCQkJCWN1ckF0dHIgPSAoKEVPYmplY3QpIGN1cikuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJCQljdXIgPSAoKEVPYmplY3QpIGN1cikuZUNvbnRhaW5lcigpOwotCQkJCX0gZWxzZSBpZiAoY3VyQXR0ciA9PSBUcmFuc2xhdG9yLlJPT1RfRkVBVFVSRSkgewotCQkJCQljdXIgPSAoKFRyYW5zbGF0b3JSZXNvdXJjZSkgc3RhcnRPYmplY3QuZVJlc291cmNlKCkpLmdldFJvb3RPYmplY3QoKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdXIgPSAoKEVPYmplY3QpIGN1cikuZUdldChjdXJBdHRyKTsKLQkJCQl9Ci0JCQkJaWYgKGN1ck1hcC5pc011bHRpVmFsdWVkKCkpIHsKLQkJCQkJcmV0dXJuIChMaXN0KSBjdXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZmluZE9iamVjdChFT2JqZWN0IHN0YXJ0T2JqZWN0LCBPYmplY3QgbWF0Y2hWYWx1ZSkgewotCQlMaXN0IG9iamVjdHMgPSBmaW5kT2JqZWN0cyhzdGFydE9iamVjdCk7Ci0JCWlmIChvYmplY3RzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZpbmRPYmplY3Qob2JqZWN0cywgZ2V0TGFzdE1hcCgpLCBtYXRjaFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBmaW5kT2JqZWN0KExpc3Qgb2JqZWN0TGlzdCwgVHJhbnNsYXRvciBtYXAsIE9iamVjdCBtYXRjaFZhbHVlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG1vZk9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBjdXJNYXRjaFZhbHVlID0gbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSk7Ci0JCQlpZiAobWF0Y2hWYWx1ZS5lcXVhbHMoY3VyTWF0Y2hWYWx1ZSkpCi0JCQkJcmV0dXJuIG1vZk9iamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRMYXN0TWFwKCkgewotCQlyZXR1cm4gbWFwSW5mb1BhdGhbbWFwSW5mb1BhdGgubGVuZ3RoIC0gMV07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBjbiA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlpbnQgaSA9IGNuLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWNuID0gY24uc3Vic3RyaW5nKCsraSwgY24ubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoY24pOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKG1hcEluZm9QYXRoWzBdKTsKLQkJZm9yIChpbnQgaiA9IDE7IGogPCBtYXBJbmZvUGF0aC5sZW5ndGg7IGorKykgewotCQkJc2IuYXBwZW5kKCdcbicpOwotCQkJc2IuYXBwZW5kKG1hcEluZm9QYXRoW2pdKTsKLQkJfQotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjOWM0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotcHVibGljIGludGVyZmFjZSBUcmFuc2xhdG9yUmVzb3VyY2UgZXh0ZW5kcyBSZWZlcmVuY2VkUmVzb3VyY2UgewotCS8qCi0JICogbXVzdCBtYWtlIGEgc3ViY2xhc3MgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgZm9yIEVTdHJ1Y3R1cmFsRmVhdHVyZSBpcyBwcm90ZWN0ZWQKLQkgKi8KLQlzdGF0aWMgY2xhc3MgRG9jVHlwZUZlYXR1cmUgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsIHsKLQkJcHJvdGVjdGVkIERvY1R5cGVGZWF0dXJlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCi0JRVN0cnVjdHVyYWxGZWF0dXJlIERPQ19UWVBFX0ZFQVRVUkUgPSBuZXcgRG9jVHlwZUZlYXR1cmUoKTsKLQotCS8qKgotCSAqIFRoZSBwdWJsaWMgaWQgb2YgdGhlIFhNTCBkb2N1bWVudCwgaWYgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXRQdWJsaWNJZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlFT2JqZWN0IGdldFJvb3RPYmplY3QoKTsKLQotCS8qKgotCSAqIFRoZSBzeXN0ZW0gaWQgb2YgdGhlIFhNTCBkb2N1bWVudCwgaWYgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXRTeXN0ZW1JZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGljIGlkIGFuZCBzeXN0ZW0gaWQgb2YgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQl2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBwdWJsaWMvc3lzdGVtIGlkcyBpZiBuZWNlc3NhcnkKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSBpbiB0aGUgZG9jdW1lbnQgdHlwZSBoZWFkZXIgb2YgdGhlIHNlcmlhbGl6ZWQgeG1sIGZpbGUKLQkgKi8KLQlTdHJpbmcgZ2V0RG9jdHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgWE1MIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotCSAqLwotCVN0cmluZyBnZXRYTUxWZXJzaW9uKCk7Ci0KLQlUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCk7Ci0KLQkvKioKLQkgKiBFbnRpdHkgcmVzb2x2ZXIgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHVzaW5nIHN0YW5kYXJkIHBhcnNlcnMgdG8gcmVhZCB0aGUgcmVzb3VyY2UKLQkgKi8KLQlFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpOwotCi0JYm9vbGVhbiB1c2VzRFREKCk7Ci0KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpOwotCi0Jdm9pZCBzZXRWZXJzaW9uSUQoaW50IGkpOwotCi0JUmVuZGVyZXIgZ2V0UmVuZGVyZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYTQ1MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSBleHRlbmRzIFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFJlbmRlcmVyRmFjdG9yeS5MaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgUmVuZGVyZXJGYWN0b3J5IHJlbmRlcmVyRmFjdG9yeTsKLQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuaW5nRm9yVXBkYXRlcyA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkuCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnksIGJvb2xlYW4gbGlzdGVuaW5nRm9yVXBkYXRlcykgewotCQlzdXBlcigpOwotCQlyZW5kZXJlckZhY3RvcnkgPSBhUmVuZGVyZXJGYWN0b3J5OwotCQlzZXRMaXN0ZW5pbmdGb3JVcGRhdGVzKGxpc3RlbmluZ0ZvclVwZGF0ZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCXRoaXMoYVJlbmRlcmVyRmFjdG9yeSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuaW5nRm9yVXBkYXRlcyhib29sZWFuIHNob3VsZEJlTGlzdGVuaW5nRm9yVXBkYXRlcykgewotCi0JCWlmICh0aGlzLmxpc3RlbmluZ0ZvclVwZGF0ZXMgXiBzaG91bGRCZUxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKLQkJCWlmICghc2hvdWxkQmVMaXN0ZW5pbmdGb3JVcGRhdGVzKQotCQkJCVJlbmRlcmVyRmFjdG9yeS5Ob3RpZmljYXRpb25FbmdpbmUucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQllbHNlCi0JCQkJUmVuZGVyZXJGYWN0b3J5Lk5vdGlmaWNhdGlvbkVuZ2luZS5hZGRMaXN0ZW5lcih0aGlzKTsKLQotCQkJdGhpcy5saXN0ZW5pbmdGb3JVcGRhdGVzID0gc2hvdWxkQmVMaXN0ZW5pbmdGb3JVcGRhdGVzOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5pbmdGb3JVcGRhdGVzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5pbmdGb3JVcGRhdGVzOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBkb0NyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVuZGVyZXIgYVJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKCk7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeS5MaXN0ZW5lciN1cGRhdGVSZW5kZXJlckZhY3RvcnkoY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlUmVuZGVyZXJGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBuZXdSZW5kZXJlckZhY3RvcnkpIHsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVwZGF0aW5nIHJlbmRlcmVyIGZhY3RvcnkiKTsKLQkJcmVuZGVyZXJGYWN0b3J5ID0gbmV3UmVuZGVyZXJGYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyNTI0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5TdHJpbmdVdGlsOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNsYXRvclJlc291cmNlSW1wbCBleHRlbmRzIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBUcmFuc2xhdG9yUmVzb3VyY2UsIElSb290T2JqZWN0UmVzb3VyY2V7Ci0Jc3RhdGljIGZpbmFsIHB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgSURfRkVBVFVSRSA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzX0VJREF0dHJpYnV0ZSgpOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WRVJTSU9OID0gIjEuMCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgUmVuZGVyZXIgcmVuZGVyZXI7Ci0JLyoqCi0JICogVGhlIHB1YmxpYyBJZCB0byB1c2UgYXQgdGhlIGhlYWQgb2YgdGhlIGRvY3VtZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGljSWQ7Ci0JLyoqCi0JICogVGhlIHN5c3RlbSBJZCB0byB1c2UgYXQgdGhlIGhlYWQgb2YgdGhlIGRvY3VtZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB4bWxWZXJzaW9uOwotCS8vIERlZmF1bHQgdGhlIHJlc291cmNlcyB0byBKMkVFIDEuNAotCXByb3RlY3RlZCBpbnQgdmVyc2lvbklEOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgc2luY2UgNC8yOS8yMDAzIC0gdXNlZCBmb3IgY29tcGF0aWJpbGl0eSBTdWJjbGFzc2VzIHNob3VsZAotCSAqICAgICAgICAgICAgIGJlIHVzaW5nIHRoZSBSZW5kZXJlcnMgYW5kIHRyYW5zbGF0b3IgZnJhbWV3b3JrCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgc2luY2UgNC8yOS8yMDAzIC0gdXNlZCBmb3IgY29tcGF0aWJpbGl0eSBTdWJjbGFzc2VzIHNob3VsZAotCSAqICAgICAgICAgICAgIGJlIHVzaW5nIHRoZSBSZW5kZXJlcnMgYW5kIHRyYW5zbGF0b3IgZnJhbWV3b3JrCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmkpOwotCQlzZXRSZW5kZXJlcihhUmVuZGVyZXIpOwotCQl2ZXJzaW9uSUQgPSBnZXREZWZhdWx0VmVyc2lvbklEKCk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwoUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFJlbmRlcmVyKGFSZW5kZXJlcik7Ci0JfQotCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCWlmIChzdXBlci5nZXRFbmNvZGluZygpID09IG51bGwpCi0JCQlzZXRFbmNvZGluZyhERUZBVUxUX0VOQ09ESU5HKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVuY29kaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHB1YmxpY0lkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIEVMaXN0LgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCWlmIChjb250ZW50cyA9PSBudWxsIHx8IGNvbnRlbnRzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEVPYmplY3QpIGdldENvbnRlbnRzKCkuZ2V0KDApOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiBzeXN0ZW1JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N0eXBlVmFsdWVzKFN0cmluZyBhUHVibGljSWQsIFN0cmluZyBhU3lzdGVtSWQpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gIShTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChwdWJsaWNJZCwgYVB1YmxpY0lkKSAmJiBTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChzeXN0ZW1JZCwgYVN5c3RlbUlkKSk7Ci0JCXB1YmxpY0lkID0gYVB1YmxpY0lkOwotCQlzeXN0ZW1JZCA9IGFTeXN0ZW1JZDsKLQkJaWYgKGNoYW5nZWQpIHsKLQkJCWVOb3RpZnkobmV3IE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlNFVCwgbnVsbCwgbnVsbCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZSgpIHsKLQkJCQkJcmV0dXJuIERPQ19UWVBFX0ZFQVRVUkU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJCQkJcmV0dXJuIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwudGhpczsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHhtbFZlcnNpb24uCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhNTFZlcnNpb24oKSB7Ci0JCWlmICh4bWxWZXJzaW9uID09IG51bGwpCi0JCQl4bWxWZXJzaW9uID0gREVGQVVMVF9WRVJTSU9OOwotCQlyZXR1cm4geG1sVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB4bWxWZXJzaW9uLgotCSAqIAotCSAqIEBwYXJhbSB4bWxWZXJzaW9uCi0JICogICAgICAgICAgICBUaGUgeG1sVmVyc2lvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYTUxWZXJzaW9uKFN0cmluZyB4bWxWZXJzaW9uKSB7Ci0JCXRoaXMueG1sVmVyc2lvbiA9IHhtbFZlcnNpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNEb0xvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWJvb2xlYW4gaXNUcmFja2luZ01vZHMgPSBpc1RyYWNraW5nTW9kaWZpY2F0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNUcmFja2luZ01vZHMpCi0JCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24oZmFsc2UpOwotCQkJcmVuZGVyZXIuZG9Mb2FkKGlucHV0U3RyZWFtLCBvcHRpb25zKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChpc1RyYWNraW5nTW9kcykKLQkJCQlzZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQkJfQotCQkvLyBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkvLyByZWNvcmRUaW1lKCJMb2FkIiwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJlbmRlcmVyLnVzZVN0cmVhbXNGb3JJTygpKSB7Ci0gICAgICAgICAgICBzdXBlci5zYXZlKG9wdGlvbnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm90aWZ5QWJvdXRUb1NhdmUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZG9TYXZlKChPdXRwdXRTdHJlYW0pbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5U2F2ZWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgIG5vdGlmeVNhdmVGYWlsZWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkud3JpdGUoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub3RpZnlTYXZlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnhtaS5oZWxwZXJzLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwjZG9TYXZlKE91dHB1dFN0cmVhbSwKLQkgKiAgICAgIE1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJcmVuZGVyZXIuZG9TYXZlKG91dHB1dFN0cmVhbSwgb3B0aW9ucyk7Ci0JCXNldE1vZGlmaWVkKGZhbHNlKTsKLQkJLy8gbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gcmVjb3JkVGltZSgiU2F2ZSIsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8vIHByaXZhdGUgdm9pZCByZWNvcmRUaW1lKFN0cmluZyB0eXBlLCBsb25nIHN0YXJ0LCBsb25nIGVuZCkgewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbihyZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSArICJcdCIgKyB0eXBlICsgIlx0IiArCi0JLy8gKGVuZCAtIHN0YXJ0KSArCi0JLy8gIlx0XHRcdG1zIiArICJcdCIgKyAoKCB0aGlzLmdldFZlcnNpb25JRCgpKSAvIDEwLjApICsgIlx0IiArIHRoaXMpOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JLy8gfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2RvVW5sb2FkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZCgpIHsKLQkJcmVuZGVyZXIucHJlVW5sb2FkKCk7Ci0JCXN1cGVyLmRvVW5sb2FkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZW5kZXJlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlbmRlcmVyCi0JICovCi0JcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKCkgewotCQlyZXR1cm4gcmVuZGVyZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVuZGVyZXIuCi0JICogCi0JICogQHBhcmFtIHJlbmRlcmVyCi0JICogICAgICAgICAgICBUaGUgcmVuZGVyZXIgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVuZGVyZXIoUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyOwotCQlpZiAocmVuZGVyZXIuZ2V0UmVzb3VyY2UoKSAhPSB0aGlzKQotCQkJcmVuZGVyZXIuc2V0UmVzb3VyY2UodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogRm9yIGNvbXBhdGliaWxpdHkgb2Ygb2xkIHN1YnR5cGUgcmVzb3VyY2VzLCByZXR1cm5zIHRoZSBzdXBlcgotCSAqIGltcGxlbWVudGF0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcmltR2V0Q29udGVudHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50cygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRDb250ZW50cygpIHsKLQkJd2FpdEZvclJlc291cmNlVG9Mb2FkSWZOZWNlc3NhcnkoKTsKLQkJaWYgKGNvbnRlbnRzID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVDb250ZW50cygpOwotCQl9Ci0JCXJldHVybiBjb250ZW50czsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udGVudHMoKSB7Ci0JCWNvbnRlbnRzID0gbmV3IFJlc291cmNlSW1wbC5Db250ZW50c0VMaXN0KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZW5kZXJlci5wcmVwYXJlVG9BZGRDb250ZW50cygpOwotCQkJCXJldHVybiBzdXBlci5hZGQob2JqZWN0KTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkJCXJlbmRlcmVyLnByZXBhcmVUb0FkZENvbnRlbnRzKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmFkZEFsbChjb2xsZWN0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwgJiYgcHVibGljSWQgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHB1YklkID0gcHVibGljSWQgPT0gbnVsbCA/IGdldERlZmF1bHRQdWJsaWNJZCgpIDogcHVibGljSWQ7Ci0JCVN0cmluZyBzeXNJZCA9IHN5c3RlbUlkID09IG51bGwgPyBnZXREZWZhdWx0U3lzdGVtSWQoKSA6IHN5c3RlbUlkOwotCQlzZXREb2N0eXBlVmFsdWVzKHB1YklkLCBzeXNJZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJc2V0RW5jb2RpbmcoREVGQVVMVF9FTkNPRElORyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBudWxsIGJ5IGRlZmF1bHQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNjcmVhdGVFbnRpdHlSZXNvbHZlcigpCi0JICovCi0JcHVibGljIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRQdWJsaWNJZCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0U3lzdGVtSWQoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gdmVyc2lvbklEOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbklEKGludCBpKSB7Ci0JCXZlcnNpb25JRCA9IGk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSN1c2VzRFREKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1c2VzRFREKCkgewotCQlyZXR1cm4gZ2V0UHVibGljSWQoKSAhPSBudWxsICYmIGdldFN5c3RlbUlkKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIG5vdGlmeSB3aGVuIHRoZSBJRCBnZXRzIHNldDsgbmVlZCB0aGlzIHRvIHB1c2ggaXQgaW50bwotCSAqIHRoZSByZXNvdXJjZQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSNzZXRJRChFT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgaWQpIHsKLQkJU3RyaW5nIG9sZElkID0gZ2V0SUQoZU9iamVjdCk7Ci0JCXN1cGVyLnNldElEKGVPYmplY3QsIGlkKTsKLQkJZU9iamVjdC5lTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KSBlT2JqZWN0LCBOb3RpZmljYXRpb24uU0VULCBJRF9GRUFUVVJFLCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGV4dGVudCBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogcmVzb3VyY2UgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXMgbG9hZGVkIG9yIHNhdmVkLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc01vZGlmaWVkKCkgfHwgcmVuZGVyZXIuaXNNb2RpZmllZCgpOwotCX0KLQotCS8qCi0JICogT3ZlcnJpZGVuIHRvIGdpdmUgdGhlIHJlbmRlcmVyIGEgaG9vawotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlI2FjY2Vzc0ZvcldyaXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JXcml0ZSgpIHsKLQkJcmVuZGVyZXIuYWNjZXNzRm9yV3JpdGUoKTsKLQkJc3VwZXIuYWNjZXNzRm9yV3JpdGUoKTsKLQl9Ci0KLQkvKgotCSAqIE92ZXJyaWRlbiB0byBnaXZlIHRoZSByZW5kZXJlciBhIGhvb2sKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZSNhY2Nlc3NGb3JSZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JSZWFkKCkgewotCQlyZW5kZXJlci5hY2Nlc3NGb3JSZWFkKCk7Ci0JCXN1cGVyLmFjY2Vzc0ZvclJlYWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCXJlbmRlcmVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCQlzdXBlci5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVdyaXRlKCkgewotCQlyZW5kZXJlci5yZWxlYXNlRnJvbVdyaXRlKCk7Ci0JCXN1cGVyLnJlbGVhc2VGcm9tV3JpdGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2guUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbCNwcmVEZWxldGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZURlbGV0ZSgpIHsKLQkJc3VwZXIucHJlRGVsZXRlKCk7Ci0JCXJlbmRlcmVyLnByZURlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gc3VwZXIuaXNTaGFyZWQoKSB8fCByZW5kZXJlci5pc1NoYXJlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKSB7Ci0JCXJldHVybiBzdXBlci5pc1NoYXJlZEZvcldyaXRlKCkgfHwgcmVuZGVyZXIuaXNTaGFyZWRGb3JXcml0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKGlzTG9hZGVkKQotCQkJCXJldHVybjsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIgotCQkJLy8gVHJhbnNsYXRvclJlc291cmNlLmxvYWQoKTogIiArIHRoaXMpOwotCQkJaWYgKHJlbmRlcmVyLnVzZVN0cmVhbXNGb3JJTygpKSB7Ci0JCQkJc3VwZXIubG9hZChvcHRpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFpc0xvYWRlZCkgewotCQkJCWxvYWQoKElucHV0U3RyZWFtKSBudWxsLCBvcHRpb25zKTsKLQkJCX0KLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVW5zdXBwb3J0ZWRGZWF0dXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9VbnN1cHBvcnRlZEZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNTg2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9VbnN1cHBvcnRlZEZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEzLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQXR0cmlidXRlSW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRGZWF0dXJlIGV4dGVuZHMgRUF0dHJpYnV0ZUltcGwgewotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBjYXB0dXJlIGZlYXR1cmVzIHRoYXQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbnN1cHBvcnRlZChFQ2xhc3MgYW5FQ2xhc3MsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCi0JCWlmIChmZWF0dXJlTmFtZS5lcXVhbHMoImlzWmVyb1BhcmFtcyIpICYmIGFuRUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoIk1ldGhvZEVsZW1lbnQiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBVbnN1cHBvcnRlZEZlYXR1cmUoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNGVlZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMjAsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IHsKLQkvKiogUmV0dXJucyB3aGV0aGVyIGEgVHJhbnNsYXRvciBzaG91bGQgYmUgY3JlYXRlZCBmb3IgdGhlIGdpdmVuIERPTSBuYW1lICovCi0JYm9vbGVhbiBhY2NlcHRzKFN0cmluZyBkb21OYW1lKTsKLQotCS8qKiBSZXR1cm5zIHdoZXRoZXIgYSBUcmFuc2xhdG9yIHNob3VsZCBiZSBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZSAqLwotCWJvb2xlYW4gYWNjZXB0cyhOb3RpZmljYXRpb24gbm90aWYpOwotCi0JVHJhbnNsYXRvciBjcmVhdGUoTm90aWZpY2F0aW9uIG5vdGlmKTsKLQotCS8qKiBDcmVhdGVzIGEgbmV3IFRyYW5zbGF0b3IgZm9yIHRoZSBET00gbmFtZSAqLwotCVRyYW5zbGF0b3IgY3JlYXRlKFN0cmluZyBkb21OYW1lKTsKLQotCS8qKiBDcmVhdGVzIHZhcmlhYmxlIHRyYW5zbGF0b3JzIGZvciBhbiBFTUYgb2JqZWN0IHRvIGJlIHJlbmRlcmVkICovCi0JTGlzdCBjcmVhdGUoTm90aWZpZXIgdGFyZ2V0KTsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvWE1MRW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1hNTEVuY29kZXJEZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YjdmM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvWE1MRW5jb2RlckRlY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDIwLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgWE1MRW5jb2RlckRlY29kZXIgewotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBYTUxFbmNvZGVyRGVjb2RlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIHRoZSBsYXN0IHByaW50YWJsZSBjaGFyYWN0ZXIgaW4gdGhlIFVuaWNvZGUgcmFuZ2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlCi0JICogZW5jb2RpbmcgdXNlZCB3aXRoIHRoaXMgc2VyaWFsaXplci4gRm9yIDgtYml0IGVuY29kaW5ncyB0aGlzIHdpbGwgYmUgZWl0aGVyIDB4N0Ugb3IgMHhGRi4gRm9yCi0JICogMTYtYml0IGVuY29kaW5ncyB0aGlzIHdpbGwgYmUgMHhGRkZGLiBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBwcmludGFibGUgd2lsbCBiZSBlc2NhcGVkIHVzaW5nCi0JICogY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSBpbnQgX2xhc3RQcmludGFibGUgPSAweEZGRkU7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFhNTEVuY29kZXJEZWNvZGVyIF9zaW5nbGV0b247Ci0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSkgewotCQkvLyBOT1RfSU1QTEVNRU5URUQKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCi0JLyoqCi0JICogRXNjYXBlcyBhIHN0cmluZyBzbyBpdCBtYXkgYmUgcHJpbnRlZCBhcyB0ZXh0IGNvbnRlbnQgb3IgYXR0cmlidXRlIHZhbHVlLiBOb24gcHJpbnRhYmxlCi0JICogY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gV2hlcmUgdGhlIGZvcm1hdCBzcGVjaWZpZXMgYSBkZWF1bHQgZW50aXR5Ci0JICogcmVmZXJlbmNlLCB0aGF0IHJlZmVyZW5jZSBpcyB1c2VkIChlLmcuIDx0dD4mYW1wO2x0OzwvdHQ+KS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICBUaGUgc3RyaW5nIHRvIGVzY2FwZQotCSAqLwotCXB1YmxpYyBjaGFyW10gZW5jb2RlKGNoYXJbXSB2YWx1ZSkgewotCQlib29sZWFuIHVubW9kaWZpZWQgPSB0cnVlOwotCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUubGVuZ3RoKTsKLQkJU3RyaW5nIGNoYXJSZWYgPSBudWxsOwotCQljaGFyIGNoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7Ci0JCQljaCA9IHZhbHVlW2ldOwotCQkJLy8gSWYgdGhlcmUgaXMgYSBzdWl0YWJsZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGlzCi0JCQkvLyBjaGFyYWN0ZXIsIHByaW50IGl0LiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgZW50aXR5Ci0JCQkvLyByZWZlcmVuY2VzIGlzIGFsbW9zdCBidXQgbm90IGlkZW50aWNhbCBiZXR3ZWVuCi0JCQkvLyBYTUwgYW5kIEhUTUwuCi0JCQljaGFyUmVmID0gZ2V0RW50aXR5UmVmKGNoKTsKLQkJCWlmIChjaGFyUmVmICE9IG51bGwpIHsKLQkJCQlzYnVmLmFwcGVuZCgnJicpOwotCQkJCXNidWYuYXBwZW5kKGNoYXJSZWYpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQkJdW5tb2RpZmllZCA9IGZhbHNlOwotCQkJfSBlbHNlIGlmICgoY2ggPj0gJyAnICYmIGNoIDw9IF9sYXN0UHJpbnRhYmxlICYmIGNoICE9IDB4RjcpIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXHQnKSB7Ci0JCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBub3QgcHJpbnRhYmxlLCBwcmludCBhcyBjaGFyYWN0ZXIKLQkJCQkvLyByZWZlcmVuY2UuCi0JCQkJLy8gTm9uIHByaW50YWJsZXMgYXJlIGJlbG93IEFTQ0lJIHNwYWNlIGJ1dCBub3QgdGFiIG9yIGxpbmUKLQkJCQkvLyB0ZXJtaW5hdG9yLCBBU0NJSSBkZWxldGUsIG9yIGFib3ZlIGEgY2VydGFpbiBVbmljb2RlCi0JCQkJLy8gdGhyZXNob2xkLgotCQkJCXNidWYuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2J1Zi5hcHBlbmQoIiYjIik7Ly8kTk9OLU5MUy0xJAotCQkJCXNidWYuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoY2gpKTsKLQkJCQlzYnVmLmFwcGVuZCgnOycpOwotCQkJCXVubW9kaWZpZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAodW5tb2RpZmllZCkKLQkJCXJldHVybiB2YWx1ZTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3NidWYubGVuZ3RoKCldOwotCQlzYnVmLmdldENoYXJzKDAsIHNidWYubGVuZ3RoKCksIHJlc3VsdCwgMCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRXNjYXBlcyBhIHN0cmluZyBzbyBpdCBtYXkgYmUgcHJpbnRlZCBhcyB0ZXh0IGNvbnRlbnQgb3IgYXR0cmlidXRlIHZhbHVlLiBOb24gcHJpbnRhYmxlCi0JICogY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gV2hlcmUgdGhlIGZvcm1hdCBzcGVjaWZpZXMgYSBkZWF1bHQgZW50aXR5Ci0JICogcmVmZXJlbmNlLCB0aGF0IHJlZmVyZW5jZSBpcyB1c2VkIChlLmcuIDx0dD4mYW1wO2x0OzwvdHQ+KS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICBUaGUgc3RyaW5nIHRvIGVzY2FwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUubGVuZ3RoKCkpOwotCQlTdHJpbmcgY2hhclJlZiA9IG51bGw7Ci0JCWNoYXIgY2g7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7ICsraSkgewotCQkJY2ggPSB2YWx1ZS5jaGFyQXQoaSk7Ci0JCQkvLyBJZiB0aGVyZSBpcyBhIHN1aXRhYmxlIGVudGl0eSByZWZlcmVuY2UgZm9yIHRoaXMKLQkJCS8vIGNoYXJhY3RlciwgcHJpbnQgaXQuIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBlbnRpdHkKLQkJCS8vIHJlZmVyZW5jZXMgaXMgYWxtb3N0IGJ1dCBub3QgaWRlbnRpY2FsIGJldHdlZW4KLQkJCS8vIFhNTCBhbmQgSFRNTC4KLQkJCWNoYXJSZWYgPSBnZXRFbnRpdHlSZWYoY2gpOwotCQkJaWYgKGNoYXJSZWYgIT0gbnVsbCkgewotCQkJCXNidWYuYXBwZW5kKCcmJyk7Ci0JCQkJc2J1Zi5hcHBlbmQoY2hhclJlZik7Ci0JCQkJc2J1Zi5hcHBlbmQoJzsnKTsKLQkJCX0gZWxzZSBpZiAoKGNoID49ICcgJyAmJiBjaCA8PSBfbGFzdFByaW50YWJsZSAmJiBjaCAhPSAweEY3KSB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccicgfHwgY2ggPT0gJ1x0JykgewotCQkJCS8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IHByaW50YWJsZSwgcHJpbnQgYXMgY2hhcmFjdGVyCi0JCQkJLy8gcmVmZXJlbmNlLgotCQkJCS8vIE5vbiBwcmludGFibGVzIGFyZSBiZWxvdyBBU0NJSSBzcGFjZSBidXQgbm90IHRhYiBvciBsaW5lCi0JCQkJLy8gdGVybWluYXRvciwgQVNDSUkgZGVsZXRlLCBvciBhYm92ZSBhIGNlcnRhaW4gVW5pY29kZQotCQkJCS8vIHRocmVzaG9sZC4KLQkJCQlzYnVmLmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCXNidWYuYXBwZW5kKCImIyIpOy8vJE5PTi1OTFMtMSQKLQkJCQlzYnVmLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGNoKSk7Ci0JCQkJc2J1Zi5hcHBlbmQoJzsnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2J1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKF9zaW5nbGV0b24gPT0gbnVsbCkgewotCQkJX3NpbmdsZXRvbiA9IG5ldyBYTUxFbmNvZGVyRGVjb2RlcigpOwotCQl9Ci0JCXJldHVybiBfc2luZ2xldG9uLmVuY29kZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcyBjaGFyYWN0ZXIgdmFsdWUsIG9yIG51bGwgaWYgbm8gc3VjaCBlbnRpdHkKLQkgKiBleGlzdHMuIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCA8dHQ+JyZhbXA7JzwvdHQ+IHdpbGwgcmV0dXJuIDx0dD4iJmFtcDthbXA7IjwvdHQ+LgotCSAqIAotCSAqIEBwYXJhbSBjaAotCSAqICAgICAgICAgICAgQ2hhcmFjdGVyIHZhbHVlCi0JICogQHJldHVybiBDaGFyYWN0ZXIgZW50aXR5IG5hbWUsIG9yIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVudGl0eVJlZihjaGFyIGNoKSB7Ci0JCS8vIEVuY29kZSBzcGVjaWFsIFhNTCBjaGFyYWN0ZXJzIGludG8gdGhlIGVxdWl2YWxlbnQgY2hhcmFjdGVyCi0JCS8vIHJlZmVyZW5jZXMuCi0JCS8vIFRoZXNlIGZpdmUgYXJlIGRlZmluZWQgYnkgZGVmYXVsdCBmb3IgYWxsIFhNTCBkb2N1bWVudHMuCi0JCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnIDoKLQkJCQlyZXR1cm4gImx0IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICc+JyA6Ci0JCQkJcmV0dXJuICJndCI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnIicgOgotCQkJCXJldHVybiAicXVvdCI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnXCcnIDoKLQkJCQlyZXR1cm4gImFwb3MiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyYnIDoKLQkJCQlyZXR1cm4gImFtcCI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlNTU5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIHsKLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQWRhcHRlckZhY3RvcnlVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQWRhcHRlckZhY3RvcnlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDkxNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVV0aWwgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFkYXB0ZXJGYWN0b3J5VXRpbC4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGFwdE5ldyhOb3RpZmllciBuZXdPYmplY3QsIExpc3QgZmFjdG9yaWVzKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlmYWN0ID0gKEFkYXB0ZXJGYWN0b3J5KSBmYWN0b3JpZXMuZ2V0KGkpOwotCQkJZmFjdC5hZGFwdE5ldyhuZXdPYmplY3QsIG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUFkYXB0ZXJGYWN0b3JpZXMoTGlzdCBkZXNjcmlwdG9ycywgTGlzdCBmYWN0b3JpZXMpIHsKLQkJQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2M7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQlkZXNjID0gKEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMuZ2V0KGkpOwotCQkJYWRhcHRlckZhY3QgPSBkZXNjLmNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3QgIT0gbnVsbCkKLQkJCQlmYWN0b3JpZXMuYWRkKGFkYXB0ZXJGYWN0KTsKLQkJfQotCQlkZXNjcmlwdG9ycy5jbGVhcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FycmF5VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FycmF5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdiODhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BcnJheVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLQotcHVibGljIGNsYXNzIEFycmF5VXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlDbGFzcyBjb21wb25lbnRUeXBlID0gbnVsbDsKLQkJaWYgKGFycmF5MS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSA9PSBhcnJheTIuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkpCi0JCQljb21wb25lbnRUeXBlID0gYXJyYXkxLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQllbHNlCi0JCQljb21wb25lbnRUeXBlID0gT2JqZWN0LmNsYXNzOwotCi0JCXJldHVybiBjb25jYXQoYXJyYXkxLCBhcnJheTIsIGNvbXBvbmVudFR5cGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29uY2F0KE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyLCBDbGFzcyBjb21wb25lbnRUeXBlKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IChPYmplY3RbXSkgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50VHlwZSwgYXJyYXkxLmxlbmd0aCArIGFycmF5Mi5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTEubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXRBbGwoamF2YS51dGlsLkxpc3QgYXJyYXlzLCBDbGFzcyBjb21wb25lbnRUeXBlKSB7Ci0JCWludCByZXN1bHRMZW5ndGggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5cy5zaXplKCk7IGkrKykgewotCQkJcmVzdWx0TGVuZ3RoICs9ICgoT2JqZWN0W10pIGFycmF5cy5nZXQoaSkpLmxlbmd0aDsKLQkJfQotCQlPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudFR5cGUsIHJlc3VsdExlbmd0aCk7Ci0JCWludCBwb3MgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0W10gYXJyYXkgPSAoT2JqZWN0W10pIGFycmF5cy5nZXQoaSk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIHBvcywgYXJyYXkubGVuZ3RoKTsKLQkJCXBvcyArPSBhcnJheS5sZW5ndGg7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ0NzUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0KLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MgaW4gY29kZS4gVGhlIHByZWRpY2F0ZQotICogbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZSB0eXBlIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdAotICogaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlIHRocm93biB3aGVuIHNvbWV0aGluZyBpcwotICogbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseSB1bnNwZWNpZmllZCBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZAotICogbmV2ZXIgcmVseSBvbiB0aGVzZSBiZWluZyB0aHJvd24gKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLS8vIFRoaXMgY2xhc3Mgd2FzLCBvcmlnaW5hbGx5LCBjb3BpZWQgZGlyZWN0bHkgZnJvbSBjb20uaWJtLml0cC5jb21tb24uCi0vLyBJdCB3YXMgY29waWVkIHRvIG91ciBvd24gcGFja2FnZSBqdXN0IHRvIG1pbmltaXplIG1pbm9yIGRlcGVuZGVuY2llcwotLy8gb24gb3RoZXIgcGFja2FnZXMgYW5kIGludGVybmFsIEFQSXMuCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQkvKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQuICovCi0KLQlwcml2YXRlIEFzc2VydCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdCA8Y29kZT50cnVlPC9jb2RlPiwgYW4KLQkgKiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc0xlZ2FsKGV4cHJlc3Npb24sICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuCi0JICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQKLQkgKiBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUgY2hlY2sgZmFpbHMpCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kCi0JICogb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QpIHsKLQkJaXNOb3ROdWxsKG9iamVjdCwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQKLQkgKiBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZAotCSAqIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJudWxsX2FyZ3VtZW50OiAiICsgbWVzc2FnZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mCi0JICogdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gaXNUcnVlKGV4cHJlc3Npb24sICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mCi0JICogdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJhc3NlcnRpb24gZmFpbGVkOiAiICsgbWVzc2FnZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0YzYwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLS8qKgotICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93biBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zIHRoYXQgY2F0Y2ggb3Igb3RoZXJ3aXNlCi0gKiBkZXBlbmQgb24gYXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBzdXNjZXB0aWJsZSB0byB1bmV4cGVjdGVkIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZQotICogYXJlIGFkZGVkIG9yIHJlbW92ZWQuCi0gKiA8L3A+Ci0gKi8KLS8vIFRoaXMgY2xhc3Mgd2FzLCBvcmlnaW5hbGx5LCBjb3BpZWQgZGlyZWN0bHkgZnJvbSBjb20uaWJtLml0cC5jb21tb24uCi0vLyBJdCB3YXMgY29waWVkIHRvIG91ciBvd24gcGFja2FnZSBqdXN0IHRvIG1pbmltaXplIG1pbm9yIGRlcGVuZGVuY2llcwotLy8gb24gb3RoZXIgcGFja2FnZXMgYW5kIGludGVybmFsIEFQSXMuCi1jbGFzcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsKSB7Ci0JCXN1cGVyKGRldGFpbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NvY2lhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NWQwYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDc6Mzg6MTUgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uIHsKLQlwcm90ZWN0ZWQgT2JqZWN0IGtleTsKLQlwcm90ZWN0ZWQgT2JqZWN0IHZhbHVlOwotCi0JLyoqCi0JICogQXNzb2NpYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb24oT2JqZWN0IGFLZXksIE9iamVjdCBhVmFsdWUpIHsKLQkJc2V0S2V5KGFLZXkpOwotCQlzZXRWYWx1ZShhVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODo0OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRLZXkoKSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA3OjM4OjQ4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA3OjM4OjQ4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdLZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoamF2YS5sYW5nLk9iamVjdCBuZXdLZXkpIHsKLQkJa2V5ID0gbmV3S2V5OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODo0OCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ2xvbmVhYmxlUHVibGljLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ2xvbmVhYmxlUHVibGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMzlmYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Nsb25lYWJsZVB1YmxpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyMiwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi0vKioKLSAqIEludGVyZmFjZSB0aGF0IGV4cG9zZXMgdGhlIGNsb25lIG1ldGhvZCwgZm9yIG9iamVjdHMgdGhhdCBuZWVkIHRvIGdlbmVyaWNhbGx5IGNvcHkgb3RoZXIKLSAqIGNsb25lYWJsZSBvYmplY3RzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xvbmVhYmxlUHVibGljIGV4dGVuZHMgQ2xvbmVhYmxlLCBBZGFwdGVyLkludGVybmFsIHsKLQlPYmplY3QgY2xvbmUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0NvbW1hbmRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29tbWFuZENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjYjg4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29tbWFuZENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjcsIDIwMDQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLQotCi0KLS8qKgotICogQGF1dGhvciBKb2huIE1vdXJyYQotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZENvbnRleHQgaW1wbGVtZW50cyBJQ29tbWFuZENvbnRleHQgewotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JcHJpdmF0ZSBNYXAgcHJvcGVydGllczsKLQlwcml2YXRlIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JLyoqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZENvbnRleHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMobW9uaXRvciwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvblByb3BlcnRpZXMKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZENvbnRleHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBNYXAgY29uZmlndXJhdGlvblByb3BlcnRpZXMsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCXRoaXMucHJvcGVydGllcyA9IGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwotCQl0aGlzLnJlc291cmNlU2V0ID0gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLndzLnJkLmNvbW1hbmQuZnJhbWV3b3JrLklDb21tYW5kQ29udGV4dCNnZXRQcm9ncmVzc01vbml0b3IoKQotCSAqLwotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3MucmQuY29tbWFuZC5mcmFtZXdvcmsuSUNvbW1hbmRDb250ZXh0I2dldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCkgewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53cy5yZC5jb21tYW5kLmZyYW1ld29yay5JQ29tbWFuZENvbnRleHQjZ2V0UmVzb3VyY2VTZXQoKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpCi0JCQlyZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db3B5R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db3B5R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzOTI4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29weUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb3B5IGEgZ3JvdXAgb2YgUmVmT2JqZWN0cyBhbmQvb3IgUmVzb3VyY2VzLiBUaGlzIGdyb3VwIHdpbGwgZW5zdXJlIHRoYXQKLSAqIGFsbCBub24tY29tcG9zaXRlIHJlbGF0aW9uc2hpcHMgYXJlIGRlZmVycmVkIHVudGlsIGFsbCBSZXNvdXJjZXMgYW5kIFJlZk9iamVjdHMgYXJlIGNvcGllZC4gVGhpcwotICogYWxsb3dzIHlvdSB0byBtYWtlIGNvcGllcyBvZiBhIGdyb3VwIG9mIG9iamVjdHMgdGhhdCBtYXkgaGF2ZSBub24tY29tcG9zaXRlIHJlbGF0aW9uc2hpcHMgYW5kCi0gKiBlbnN1cmUgdGhhdCB0aGVzZSByZWxhdGlvbnNoaXBzIGFyZSBwb2ludGluZyB0byB0aGUgY29waWVkIG9iamVjdCBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBncm91cAotICogKGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIGEgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwKS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyMToxNyBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ29weUdyb3VwIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRJZFN1ZmZpeDsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgY29weUNvbnRleHQ7Ci0JcHJvdGVjdGVkIExpc3QgcmVzb3VyY2VzOwotCXByb3RlY3RlZCBMaXN0IHJlZk9iamVjdHM7Ci0JcHJvdGVjdGVkIExpc3QgY29waWVkUmVzb3VyY2VzOwotCXByb3RlY3RlZCBMaXN0IGNvcGllZFJlZk9iamVjdHM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlc2VydmVJZHMgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvcHlHcm91cCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb3B5R3JvdXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZChFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJcmV0dXJuIGFkZChhUmVmT2JqZWN0LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCWlmIChhUmVmT2JqZWN0ICE9IG51bGwgJiYgIWNvbnRhaW5zUmVmT2JqZWN0KGFSZWZPYmplY3QpKSB7Ci0JCQlnZXRSZWZPYmplY3RzKCkuYWRkKGNyZWF0ZUFzc29jaWF0aW9uKGFSZWZPYmplY3QsIGlkU3VmZml4KSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI3OjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWFkZChhUmVzb3VyY2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNzozMiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlnZXRSZXNvdXJjZXMoKS5hZGQoY3JlYXRlQXNzb2NpYXRpb24oYVJlc291cmNlLCBuZXdVcmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ29waWVkKEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlpZiAoYVJlZk9iamVjdCAhPSBudWxsKQotCQkJZ2V0Q29waWVkUmVmT2JqZWN0cygpLmFkZChhUmVmT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjc6MzIgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvcGllZChSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlnZXRDb3BpZWRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKLQkJCWlmIChnZXRDb3B5Q29udGV4dCgpICE9IG51bGwpCi0JCQkJZ2V0Q29weUNvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zKExpc3QgYXNzb2NpYXRpb25zLCBPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKGFuT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBzaXplID0gYXNzb2NpYXRpb25zLnNpemUoKTsKLQkJQXNzb2NpYXRpb24gYXNzb2M7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlhc3NvYyA9IChBc3NvY2lhdGlvbikgYXNzb2NpYXRpb25zLmdldChpKTsKLQkJCWlmIChhc3NvYy5nZXRLZXkoKSA9PSBhbk9iamVjdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYKLQkgKiAKLQkgKiBAYVJlZk9iamVjdCBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIGdyb3VwLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUmVmT2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlyZXR1cm4gY29udGFpbnMoZ2V0UmVmT2JqZWN0cygpLCBhUmVmT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZgotCSAqIAotCSAqIEBhUmVzb3VyY2UgaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBncm91cC4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Jlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlyZXR1cm4gY29udGFpbnMoZ2V0UmVzb3VyY2VzKCksIGFSZXNvdXJjZSk7Ci0JfQotCi0JcHJpdmF0ZSBBc3NvY2lhdGlvbiBjcmVhdGVBc3NvY2lhdGlvbihPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbihrZXksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTGlzdCBvZiBSZWZPYmplY3RzIHRoYXQgd2VyZSBjb3BpZWQuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDb3BpZWRSZWZPYmplY3RzKCkgewotCQlpZiAoY29waWVkUmVmT2JqZWN0cyA9PSBudWxsKQotCQkJY29waWVkUmVmT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGNvcGllZFJlZk9iamVjdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgUmVzb3VyY2VzIHRoYXQgd2VyZSBjb3BpZWQuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDb3BpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjb3BpZWRSZXNvdXJjZXMgPT0gbnVsbCkKLQkJCWNvcGllZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGNvcGllZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29udGV4dCB0byBhZGQgYWxsIGNvcGllZCByZXNvdXJjZXMgaW50by4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgODowOTo0NSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQgZ2V0Q29weUNvbnRleHQoKSB7Ci0JCXJldHVybiBjb3B5Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6NDQ6NDMgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdElkU3VmZml4KCkgewotCQlyZXR1cm4gZGVmYXVsdElkU3VmZml4OwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgaWQgYmUgY29waWVkIGluIHRoZSBjYXNlIHdoZXJlIG5vIHN1ZmZpeCBpcyBzcGVjaWZpZWQ/IERlZmF1bHRzIHRvIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHJlc2VydmVJZHMoKSB7Ci0JCXJldHVybiBwcmVzZXJ2ZUlkczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSZWZPYmplY3RzKCkgewotCQlpZiAocmVmT2JqZWN0cyA9PSBudWxsKQotCQkJcmVmT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHJlZk9iamVjdHM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UmVzb3VyY2VzKCkgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgcHJpbUdldFJlZk9iamVjdHMoKSB7Ci0JCXJldHVybiByZWZPYmplY3RzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNTo0NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IHByaW1HZXRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJaWYgKGFSZWZPYmplY3QgIT0gbnVsbCAmJiBwcmltR2V0UmVmT2JqZWN0cygpICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gcHJpbUdldFJlZk9iamVjdHMoKS5pdGVyYXRvcigpOwotCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb247Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJYXNzb2NpYXRpb24gPSAoQXNzb2NpYXRpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAoYXNzb2NpYXRpb24uZ2V0S2V5KCkgPT0gYVJlZk9iamVjdCkKLQkJCQkJcmV0dXJuIHByaW1HZXRSZWZPYmplY3RzKCkucmVtb3ZlKGFzc29jaWF0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI3OjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBwcmltR2V0UmVzb3VyY2VzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBwcmltR2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWFzc29jaWF0aW9uID0gKEFzc29jaWF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGFzc29jaWF0aW9uLmdldEtleSgpID09IGFSZXNvdXJjZSkKLQkJCQkJcmV0dXJuIHByaW1HZXRSZXNvdXJjZXMoKS5yZW1vdmUoYXNzb2NpYXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGNvbnRleHQgdG8gYWRkIGFsbCBjb3BpZWQgcmVzb3VyY2VzIGludG8uIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDg6MDk6NDUgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0NvcHlDb250ZXh0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuQ29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlDb250ZXh0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCBuZXdDb3B5Q29udGV4dCkgewotCQljb3B5Q29udGV4dCA9IG5ld0NvcHlDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIElmIGFuIElEIHN1ZmZpeCBpcyBub3QgZGVmaW5lZCBmb3IgYSBFT2JqZWN0IHRoYXQgaXMgdG8gYmUgY29waWVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZC4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjQ0OjQzIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdEZWZhdWx0SWRTdWZmaXgKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0SWRTdWZmaXgoamF2YS5sYW5nLlN0cmluZyBuZXdEZWZhdWx0SWRTdWZmaXgpIHsKLQkJZGVmYXVsdElkU3VmZml4ID0gbmV3RGVmYXVsdElkU3VmZml4OwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgaWQgYmUgY29waWVkIGluIHRoZSBjYXNlIHdoZXJlIG5vIHN1ZmZpeCBpcyBzcGVjaWZpZWQ/Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VydmVJZHMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVzZXJ2ZUlkcyA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgcmVxdWlyZSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIGdyb3VwCi0JICogaGFzIGJlZW4gY29waWVkLgotCSAqIAotCSAqIEBwYXJhbSBjb3B5VXRpbAotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RDb3B5KEV0b29sc0NvcHlVdGlsaXR5IGNvcHlVdGlsKSB7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01Mb2FkT3B0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTUxvYWRPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWU4YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTUxvYWRPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBET01Mb2FkT3B0aW9ucyB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dKYXZhRW5jb2RpbmdzOwotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlczsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsb3dKYXZhRW5jb2RpbmdzKCkgewotCQlyZXR1cm4gYWxsb3dKYXZhRW5jb2RpbmdzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKCkgewotCQlyZXR1cm4gZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGUoKSB7Ci0JCXJldHVybiB2YWxpZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGxvd0phdmFFbmNvZGluZ3MuCi0JICogCi0JICogQHBhcmFtIGFsbG93SmF2YUVuY29kaW5ncwotCSAqICAgICAgICAgICAgVGhlIGFsbG93SmF2YUVuY29kaW5ncyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0phdmFFbmNvZGluZ3MoYm9vbGVhbiBhbGxvd0phdmFFbmNvZGluZ3MpIHsKLQkJdGhpcy5hbGxvd0phdmFFbmNvZGluZ3MgPSBhbGxvd0phdmFFbmNvZGluZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMKLQkgKiAgICAgICAgICAgIFRoZSBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKSB7Ci0JCXRoaXMuZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzID0gZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbGlkYXRlLgotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0ZQotCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKGJvb2xlYW4gdmFsaWRhdGUpIHsKLQkJdGhpcy52YWxpZGF0ZSA9IHZhbGlkYXRlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01VdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmOTY2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgY2xhc3MgY29udGFpbmluZyBjb21tb24gZG9tIG1hbmlwdWxhdGlvbiBhbmQgc2VhcmNoIGZ1bmN0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIERPTVV0aWxpdGllcyB7Ci0JLy8gSGFuZHkgQ29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UX1NUUklORyA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FX1NUUklORyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCS8vSGFjayB0byBiZSByZW1vdmVkIHdoZW4gdGhlIERPTSBhcGlzIGNoYW5nZSBzdWNoIHRoYXQgdGhlcmUgaXMgYW4gZWFzaWVyCi0JLy93YXkgdG8gZmx1ZmYgdXAgYW5kIHNldCB0aGUgZG9jdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1NWV9FTlRJVFlfU1RSSU5HID0gImR1bW15IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1NWV9FTlRJVFlfTk9ERV9TVFJJTkcgPSAiPGR1bW15Lz4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGRlZmF1bHREb2N1bWVudEJ1aWxkZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgZGVmYXVsdEVudGl0eVJlc29sdmVyOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIHN1YiBub2RlcyBvZiBhIHBhdGguCi0JICovCi0Jc3RhdGljIHB1YmxpYyBJdGVyYXRvciBjcmVhdGVQYXRoSXRlcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIHRQYXRoID0gcGF0aC5zdGFydHNXaXRoKCIvIikgPyBwYXRoLnN1YnN0cmluZygxKSA6IHBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRQYXRoLmxlbmd0aCgpID09IDApCi0JCQl0UGF0aCA9IG51bGw7Ci0JCWZpbmFsIFN0cmluZyBhUGF0aCA9IHRQYXRoOwotCi0JCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQlpbnQgcHJldkluZGV4ID0gMDsKLQkJCWludCBjdXJJbmRleCA9IDA7Ci0JCQlTdHJpbmcgcGF0aFN0cmluZyA9IGFQYXRoOwotCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCXJldHVybiBwYXRoU3RyaW5nICE9IG51bGwgJiYgcHJldkluZGV4ICE9IC0xOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJY3VySW5kZXggPSBwYXRoU3RyaW5nLmluZGV4T2YoJy8nLCBwcmV2SW5kZXgpOwotCQkJCVN0cmluZyBub2RlU3RyaW5nID0gbnVsbDsKLQkJCQlpZiAoY3VySW5kZXggIT0gLTEpCi0JCQkJCW5vZGVTdHJpbmcgPSBwYXRoU3RyaW5nLnN1YnN0cmluZyhwcmV2SW5kZXgsIGN1ckluZGV4KyspOwotCQkJCWVsc2UKLQkJCQkJbm9kZVN0cmluZyA9IHBhdGhTdHJpbmcuc3Vic3RyaW5nKHByZXZJbmRleCk7Ci0JCQkJcHJldkluZGV4ID0gY3VySW5kZXg7Ci0JCQkJcmV0dXJuIG5vZGVTdHJpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHRleHQgZm9yIHRoZSBwYXNzZWQgaW4gbm9kZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRDaGlsZFRleHQoTm9kZSBub2RlKSB7Ci0JCVRleHQgdGV4dE5vZGUgPSBnZXRDaGlsZFRleHROb2RlKG5vZGUpOwotCQlpZiAodGV4dE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiB0ZXh0Tm9kZS5nZXREYXRhKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGV4dCBmb3IgdGhlIHBhc3NlZCBpbiBub2RlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgVGV4dCBnZXRDaGlsZFRleHROb2RlKE5vZGUgbm9kZSkgewotCQlOb2RlIHRleHROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlICh0ZXh0Tm9kZSAhPSBudWxsICYmIERPTVV0aWxpdGllcy5pc1RleHROb2RlKHRleHROb2RlKSkgewotCQkJaWYgKCFpc1doaXRlc3BhY2UodGV4dE5vZGUpKQotCQkJCXJldHVybiAoVGV4dCkgdGV4dE5vZGU7Ci0JCQl0ZXh0Tm9kZSA9IHRleHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBvZiB0aGUgbm9kZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCVJldmlzaXQudG9EbygpOwotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxhc3Qgbm9uLXRleHQgY2hpbGQgb2YgYSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgbGFzdCBub24tdGV4dCBjaGlsZCBub2RlIG9mCi0JICogQG5vZGUuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgZ2V0TGFzdE5vZGVDaGlsZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlIGNoaWxkID0gbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCWNoaWxkID0gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5leHQgbm9uLXRleHQgc2libGluZyBhZnRlciBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBmaXJzdCBub24tdGV4dCBzaWJsaW5nIG5vZGUgYWZ0ZXIKLQkgKiBAbm9kZS4gSWYgdGhlcmUgaXMgbm8gbmV4dCBub24tdGV4dCBzaWJsaW5nLCBudWxsIGlzIHJldHVybmVkLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGdldE5leHROb2RlU2libGluZyhOb2RlIG5vZGUpIHsKLQkJTm9kZSBzaWJsaW5nID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7Ci0JCXJldHVybiBzaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlyc3QgY2hpbGQgTm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotCSAqLwotCXN0YXRpYyBwdWJsaWMgTm9kZSBnZXROb2RlQ2hpbGQoTm9kZSBub2RlLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJTm9kZSBjaGlsZCA9IG51bGw7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBuID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbi5nZXROb2RlTmFtZSgpLmVxdWFscyhub2RlTmFtZSkpIHsKLQkJCQljaGlsZCA9IG47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIFRyYXZlcnNlcyB0aGUgcGF0aCBwYXNzZWQgaW4gPHBhdGhOYW1lPi4gVGhlIHBhdGggaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm0KLQkgKiAnbm9kZTEvbm9kZTIvbm9kZTMnLiBUaGlzIG1ldGhvZCBzdGFydHMgYXQgbm9kZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIE5vZGUgZ2V0Tm9kZUNoaWxkRm9yUGF0aChOb2RlIHBhcmVudCwgU3RyaW5nIHBhdGhOYW1lKSB7Ci0KLQkJTm9kZSBjdXJOb2RlID0gcGFyZW50OwotCQlJdGVyYXRvciBpID0gRE9NVXRpbGl0aWVzLmNyZWF0ZVBhdGhJdGVyYXRvcihwYXRoTmFtZSk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGNoaWxkID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQljdXJOb2RlID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChjdXJOb2RlLCBjaGlsZCk7Ci0JCQlpZiAoY3VyTm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBjdXJOb2RlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgTm9kZSBjaGlsZHJlbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZXMKLQkgKi8KLQlzdGF0aWMgcHVibGljIExpc3QgZ2V0Tm9kZUNoaWxkcmVuKE5vZGUgbm9kZSwgU3RyaW5nW10gbm9kZU5hbWVzKSB7Ci0JCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBub2RlTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG5vZGVOYW1lc1tqXS5lcXVhbHMobi5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGZvdW5kKQotCQkJCQlyZXN1bHRzLmFkZChuKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIE5vZGUgY2hpbGRyZW4gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLQkgKi8KLQlzdGF0aWMgcHVibGljIExpc3QgZ2V0Tm9kZUNoaWxkcmVuKE5vZGUgbm9kZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbi5nZXROb2RlTmFtZSgpLmVxdWFscyhub2RlTmFtZSkpCi0JCQkJcmVzdWx0cy5hZGQobik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaXJzdCBub24tdGV4dCBzaWJsaW5nIGJlZm9yZSBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBmaXJzdCBub24tdGV4dCBzaWJsaW5nIG5vZGUgYmVmb3JlCi0JICogQG5vZGUuIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIG5vbi10ZXh0IHNpYmxpbmcsIG51bGwgaXMgcmV0dXJuZWQuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgZ2V0UHJldmlvdXNOb2RlU2libGluZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlIHNpYmxpbmcgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIERPTVV0aWxpdGllcy5pc1RleHROb2RlKHNpYmxpbmcpKQotCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCXJldHVybiBzaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlyc3QgdGV4dCBub2RlIGJlZm9yZSBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBmaXJzdCB0ZXh0IG5vZGUgYmVmb3JlCi0JICogQG5vZGUuIE51bGwgaWYgbm8gc3VjaCBub2RlIGV4aXN0LgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGdldFByZXZpb3VzVGV4dChOb2RlIG5vZGUpIHsKLQkJVGV4dCBzaWJsaW5nID0gZ2V0UHJldmlvdXNUZXh0U2libGluZyhub2RlKTsKLQotCQlpZiAoc2libGluZyA9PSBudWxsICYmIG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpCi0JCQlzaWJsaW5nID0gZ2V0UHJldmlvdXNUZXh0KG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLQotCQlyZXR1cm4gc2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpcnN0IHRleHQgc2libGluZyBiZWZvcmUgYSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgZmlyc3QgdGV4dCBzaWJsaW5nIG5vZGUgYmVmb3JlCi0JICogQG5vZGUuIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIHRleHQgc2libGluZywgbnVsbCBpcyByZXR1cm5lZC4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBnZXRQcmV2aW91c1RleHRTaWJsaW5nKE5vZGUgbm9kZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCU5vZGUgc2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCU5vZGUgbGFzdFRleHQgPSBudWxsOwotCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJbGFzdFRleHQgPSBzaWJsaW5nOwotCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIChUZXh0KSBsYXN0VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpcnN0IHRleHQgc2libGluZyBiZWZvcmUgYSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgZmlyc3QgdGV4dCBzaWJsaW5nIG5vZGUgYmVmb3JlCi0JICogQG5vZGUuIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIHRleHQgc2libGluZywgbnVsbCBpcyByZXR1cm5lZC4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRyYWlsaW5nV2hpdGVzcGFjZShUZXh0IG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0RGF0YSgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IGkgPSB0ZXh0Lmxlbmd0aCgpIC0gMTsKLQkJZm9yICg7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UodGV4dC5jaGFyQXQoaSkpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoKytpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIDxuZXdOb2RlPmludG8gPHBhcmVudD5hZnRlciA8cmVmTm9kZT4uIElmIDxyZWZOb2RlPmlzIG51bGwgdGhlbiB0aGUgbm9kZSBpcyBpbnNlcnRlZAotCSAqIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcmVudCdzIGNoaWxkIG5vZGVzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydEFmdGVyTm9kZShOb2RlIHBhcmVudCwgTm9kZSBuZXdOb2RlLCBOb2RlIHJlZk5vZGUpIHsKLQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gbnVsbDsKLQkJaWYgKHJlZk5vZGUgIT0gbnVsbCkgewotCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IHJlZk5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG5ld05vZGUsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotCQllbHNlCi0JCQlpbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbmV3Tm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IGEgPG5ld05vZGU+aW50byA8cGFyZW50PmJlZm9yZSA8cmVmTm9kZT4uIFRoaXMgdXRpbGl0eSBtZXRob2QgaXMgdXNlZCB0byBlbnN1cmUgdGhhdAotCSAqIHRoZSBpbnNlcnRpb24gZG9lcyBub3QgcmVzdWx0IGluIHR3byBhZGphY2VudCB0ZXh0IG5vZGVzLiBUaGUgRE9NIG1vZGVsIGRvZXMgbm90IGhhbmRsZQotCSAqIGFkamFjZW50IHRleHQgbm9kZXMuIFRoZXkgbXVzdCBiZSBqb2luZWQgdG9nZXRoZXIuCi0JICogCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGluc2VydEJlZm9yZU5vZGUoTm9kZSBwYXJlbnQsIE5vZGUgbmV3Tm9kZSwgTm9kZSByZWZOb2RlKSB7Ci0JCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHQgdGV4dE5ld05vZGUgPSAoVGV4dCkgbmV3Tm9kZTsKLQotCQkJLy8gSWYgdGhlIGluc2VydCBiZWZvcmUgbm9kZSBpcyB0ZXh0LCBqb2luIGl0IHdpdGggdGhlIG5ldyBub2RlLgotCQkJaWYgKHJlZk5vZGUgIT0gbnVsbCAmJiByZWZOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlUZXh0IHRleHRSZWZOb2RlID0gKFRleHQpIHJlZk5vZGU7Ci0JCQkJdGV4dFJlZk5vZGUuc2V0RGF0YSh0ZXh0TmV3Tm9kZS5nZXREYXRhKCkgKyB0ZXh0UmVmTm9kZS5nZXREYXRhKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIElmIHRoZSBub2RlIHdlIGFyZSBpbnNlcnRpbmcgYWZ0ZXIgaXMgdGV4dCwKLQkJCS8vIGpvaW4gaXQgd2l0aCB0aGUgbmV3IG5vZGUuCi0JCQlOb2RlIGluc2VydEFmdGVyTm9kZSA9IChyZWZOb2RlID09IG51bGwpID8gcGFyZW50LmdldExhc3RDaGlsZCgpIDogcmVmTm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmIChpbnNlcnRBZnRlck5vZGUgIT0gbnVsbCAmJiBpbnNlcnRBZnRlck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVRleHQgdGV4dEluc2VydEFmdGVyTm9kZSA9IChUZXh0KSBpbnNlcnRBZnRlck5vZGU7Ci0JCQkJdGV4dEluc2VydEFmdGVyTm9kZS5zZXREYXRhKHRleHRJbnNlcnRBZnRlck5vZGUuZ2V0RGF0YSgpICsgdGV4dE5ld05vZGUuZ2V0RGF0YSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLy8gVGhlcmUgaXMgbm8gdGV4dCBub2RlIHRvIGpvaW4gdG8sIHNpbXBsZSBpbnNlcnQgdGhlIG5vZGUuCi0JCXBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IGEgPG5ld05vZGU+aW50byA8cGFyZW50PmJlZm9yZSA8cmVmTm9kZT4uIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBpbnNlcnQgdGhlIG5vZGUgYmVmb3JlCi0JICogYW55IHdoaXRlc3BhY2Ugbm9kZXMgdGhhdCBhcHBlYXIgaW4gdGhlIHRyZWUgYmVmb3JlIDxyZWZOb2RlPi4gVGhpcyBtZXRob2Qgd2lsbCBhbHNvIGVuc3VyZQotCSAqIHRoYXQgdGhlIGluc2VydGlvbiBkb2VzIG5vdCByZXN1bHQgaW4gdHdvIGFkamFjZW50IHRleHQgbm9kZXMuIFRoZSBET00gbW9kZWwgZG9lcyBub3QgaGFuZGxlCi0JICogYWRqYWNlbnQgdGV4dCBub2Rlcy4gVGhleSBtdXN0IGJlIGpvaW5lZCB0b2dldGhlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZk5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UoTm9kZSBwYXJlbnQsIE5vZGUgbmV3Tm9kZSwgTm9kZSByZWZOb2RlKSB7Ci0JCU5vZGUgY3VyTm9kZSA9IChyZWZOb2RlID09IG51bGwpID8gcGFyZW50LmdldExhc3RDaGlsZCgpIDogcmVmTm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJTm9kZSBsYXN0Tm9kZSA9IHJlZk5vZGU7Ci0KLQkJd2hpbGUgKGN1ck5vZGUgIT0gbnVsbCAmJiAoRE9NVXRpbGl0aWVzLmlzV2hpdGVzcGFjZShjdXJOb2RlKSB8fCBET01VdGlsaXRpZXMuaXNDb21tZW50KGN1ck5vZGUpKSkgewotCQkJbGFzdE5vZGUgPSBjdXJOb2RlOwotCQkJY3VyTm9kZSA9IGN1ck5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLQotCQlpbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbmV3Tm9kZSwgbGFzdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgdGV4dCBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIHRleHQgbm9kZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNoZWNrCi0JICovCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGlzVGV4dE5vZGUoTm9kZSBub2RlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0JCXJldHVybiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB8fCAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBpcyBlbnRpcmVseSBjb21tZW50IG9yIG5vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gQW5zd2VyIHRydWUgaWYgdGhlIG5vZGUgaXMgd2hpdGVzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNoZWNrCi0JICovCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGlzQ29tbWVudChOb2RlIG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlyZXR1cm4gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGVudGlyZWx5IHdoaXRlcGFjZSBvciBub3QuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIEFuc3dlciB0cnVlIGlmIHRoZSBub2RlIGlzIHdoaXRlc3BhY2UsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjaGVjawotCSAqLwotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoTm9kZSBub2RlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlUZXh0IHRleHROb2RlID0gKFRleHQpIG5vZGU7Ci0JCVN0cmluZyB0ZXh0ID0gdGV4dE5vZGUuZ2V0RGF0YSgpOwotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UodGV4dC5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIDxub2RlPgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCByZW1vdmVBbGxDaGlsZHJlbihOb2RlIG5vZGUpIHsKLQkJTm9kZUxpc3QgbGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJbm9kZS5yZW1vdmVDaGlsZChsaXN0Lml0ZW0oaSkpOwotCQl9Ci0JfQotCi0JLy8gdHJhdmVyc2VzIHRoZSBET00gc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBub2RlIGFuZCByZXR1cm5zIGEgbGlzdAotCS8vIG9mIG5vZGVzIG1hdGNoaW5nIHRoZSBzZWFyY2ggc3RyaW5nCi0KLQlzdGF0aWMgcHVibGljIEFycmF5TGlzdCBnZXRBbGxOb2RlcyhOb2RlIG5vZGUsIFN0cmluZyBub2RlTmFtZSkgewotCQlBcnJheUxpc3Qgbm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJU3RyaW5nW10gbm9kZU5hbWVzID0ge25vZGVOYW1lfTsKLQkJZmluZEFsbE5vZGVzKG5vZGUsIG5vZGVOYW1lcywgbm9kZUxpc3QpOwotCi0JCXJldHVybiBub2RlTGlzdDsKLQl9Ci0KLQkvLyB0cmF2ZXJzZXMgdGhlIERPTSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIG5vZGUgYW5kIHJldHVybnMgYSBsaXN0Ci0JLy8gb2Ygbm9kZXMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBzdHJpbmdzCi0KLQlzdGF0aWMgcHVibGljIEFycmF5TGlzdCBnZXRBbGxOb2RlcyhOb2RlIG5vZGUsIFN0cmluZ1tdIG5vZGVOYW1lc0FycmF5KSB7Ci0JCUFycmF5TGlzdCBub2RlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmluZEFsbE5vZGVzKG5vZGUsIG5vZGVOYW1lc0FycmF5LCBub2RlTGlzdCk7Ci0KLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCS8vIHJlY3Vyc2l2ZSBoZWxwZXIgZm9yIGdldEFsbE5vZGVzCi0Jc3RhdGljIHByaXZhdGUgdm9pZCBmaW5kQWxsTm9kZXMoTm9kZSBub2RlLCBTdHJpbmdbXSBub2RlTmFtZXMsIEFycmF5TGlzdCByZXN1bHRzKSB7Ci0KLQkJTm9kZUxpc3Qgbm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbm9kZU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChub2Rlcy5pdGVtKGkpLmdldE5vZGVOYW1lKCkuZXF1YWxzKG5vZGVOYW1lc1tqXSkpIHsKLQkJCQkJCXJlc3VsdHMuYWRkKG5vZGVzLml0ZW0oaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmRBbGxOb2Rlcyhub2Rlcy5pdGVtKGkpLCBub2RlTmFtZXMsIHJlc3VsdHMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3lzdGVtIGRlZmluZWQgSkFYUCBkb2N1bWVudCBidWlsZGVyCi0JICovCi0Jc3RhdGljIHB1YmxpYyBEb2N1bWVudEJ1aWxkZXIgbmV3RGVmYXVsdERvY3VtZW50QnVpbGRlcihET01Mb2FkT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlkYmYuc2V0VmFsaWRhdGluZyhvcHRpb25zLmlzVmFsaWRhdGUoKSk7Ci0JCWRiZi5zZXROYW1lc3BhY2VBd2FyZShvcHRpb25zLmlzVmFsaWRhdGUoKSk7Ci0JCS8qCi0JCSAqIENhdXNlcyBlcnJvcnMgaW4gSUJNIEpESyB0cnkgeyBkYmYuc2V0QXR0cmlidXRlKFJlbmRlcmVyLkpBWFBfU0NIRU1BX0xBTkdVQUdFLAotCQkgKiBSZW53ZGVyZXIuVzNDX1hNTF9TQ0hFTUEpOyB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geCkgeyB9Ci0JCSAqLwotCQl0cnkgewotCQkJZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2FsbG93LWphdmEtZW5jb2RpbmdzIiwgbmV3IEJvb2xlYW4ob3B0aW9ucy5pc0FsbG93SmF2YUVuY29kaW5ncygpKSk7IC8vJE5PTi1OTFMtMSQJICAgICAgICAKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlnbm9yZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3NcIi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiLCBuZXcgQm9vbGVhbihvcHRpb25zLmlzVmFsaWRhdGUoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJCWRiZi5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coIldhcm5pbmc6IFBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IFwiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hXCIuIFZhbGlkYXRpb24gd2lsbCBiZSBkaXNhYmxlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWRiZi5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKG9wdGlvbnMuaXNFeHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMoKSk7Ci0JCURvY3VtZW50QnVpbGRlciByZXN1bHQgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCXJlc3VsdC5zZXRFcnJvckhhbmRsZXIobmV3IEVycm9ySGFuZGxlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQl0aHJvdyBhcmcwOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCXRocm93IGFyZzA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gYXJnMCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoYXJnMCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHN0dWIgZG9jdW1lbnQsIHdoZXJlIHRoZSBEb2N1bWVudFR5cGUgaXMgZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVycy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIERvY3VtZW50IGNyZWF0ZU5ld0RvY3VtZW50KFN0cmluZyBkb2N0eXBlLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGdldERlZmF1bHREb2N1bWVudEJ1aWxkZXIoKTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBjcmVhdGVIZWFkZXJJbnB1dFN0cmVhbShkb2N0eXBlLCBwdWJsaWNJZCwgc3lzdGVtSWQsIHRydWUpOwotCQlEb2N1bWVudCByZXN1bHQgPSBidWlsZGVyLnBhcnNlKGluKTsKLQkJcmVtb3ZlRHVtbXlFbnRpdHkocmVzdWx0KTsKLQkJcmVtb3ZlRXh0cmFuZW91c0NvbW1lbnRzKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBsb2FkRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4sIERPTUxvYWRPcHRpb25zIG9wdGlvbnMsIEVudGl0eVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gRE9NVXRpbGl0aWVzLm5ld0RlZmF1bHREb2N1bWVudEJ1aWxkZXIob3B0aW9ucyk7Ci0JCWJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIocmVzb2x2ZXIpOwotCQlEb2N1bWVudCByZXN1bHQgPSBidWlsZGVyLnBhcnNlKGluKTsKLQkJcmVtb3ZlRXh0cmFuZW91c0NvbW1lbnRzKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCB0aGUgRE9NIExldmVsIDIgQVBJcyBhcmUgbm90IGFkdmFuY2VkIGVub3VnaCBmb3Igc2V0dGluZyB0aGUKLQkgKiBkb2N1bWVudCB0eXBlOyBzbyB0aGUgb25seSBwYXJzZXIgaW5kZXBlbmRlbnQgd2F5IG9mIGFjY29tcGxpc2hpbmcgdGhpcyBpcyBieSBjcmVhdGluZyBhCi0JICogc3RyZWFtIGFuZCBwYXJzaW5nIGl0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0oU3RyaW5nIGRvY3R5cGUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCXJldHVybiBjcmVhdGVIZWFkZXJJbnB1dFN0cmVhbShkb2N0eXBlLCBwdWJsaWNJZCwgc3lzdGVtSWQsIGZhbHNlKTsKLQl9Ci0KLQotCQotCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGNyZWF0ZUhlYWRlcklucHV0U3RyZWFtKFN0cmluZyBkb2N0eXBlLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgYm9vbGVhbiBpbmNsdWRlRHVtbXkpIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotCQkvLyBUaGUgcHJpb3IgY29kZSAod2hpY2ggaXMgc3RpbGwgaW4gdGhlIGNhdGNoIGJsb2NrKSwgdXNlcwotCQkvLyB0aGUgc3lzdGVtIGRlZmF1bHQgZW5jb2RpbmcgW1N5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpXTsKLQkJLy8gb24gWi9PUyB0aGlzIGlzIENwMTA0Ny4gVGhlIGNvbWJpbmF0aW9uIG9mICJVVEYtOCIgaW4gdGhlIGhlYWRlcgotCQkvLyBhbmQgIkNwMTA0NyIgaW4gdGhlIHdyaXRlciBjcmVhdGUgYW4gdW51c2FibGUgaW5wdXQgc3RyZWFtLgotCi0JCVByaW50V3JpdGVyIHdyaXRlcjsKLQotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkJCXdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvdXRwdXRXcml0ZXIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNob3VsZCBuZXZlciBnZXQgaGVyZSAoZWFybGllciBjb2RlKQotCQkJd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dHB1dFN0cmVhbSk7IAotCQl9Ci0KLQkJd3JpdGVIZWFkZXIod3JpdGVyLCBkb2N0eXBlLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlpZiAoaW5jbHVkZUR1bW15KQotCQkJYWRkRHVtbXlFbnRpdHkod3JpdGVyKTsKLQkJd3JpdGVyLmZsdXNoKCk7Ci0JCXdyaXRlci5jbG9zZSgpOwotCi0JCWJ5dGVbXSBieXRlcyA9IG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOwotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVIZWFkZXIoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgZG9jdHlwZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJd3JpdGVyLndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKCIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUoIlwiIGVuY29kaW5nPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZSgiXCI/PiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCk7Ci0KLQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJd3JpdGVyLndyaXRlKCI8IURPQ1RZUEUgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZShkb2N0eXBlKTsKLQkJCXdyaXRlci53cml0ZSgiIFBVQkxJQyBcIiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUocHVibGljSWQpOwotCQkJd3JpdGVyLndyaXRlKCJcIiBcIiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUoc3lzdGVtSWQpOwotCQkJd3JpdGVyLndyaXRlKCJcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRHVtbXlFbnRpdHkoUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCVJldmlzaXQucmV2aXNpdCgpOwotCQl3cml0ZXIucHJpbnRsbihEVU1NWV9FTlRJVFlfTk9ERV9TVFJJTkcpOwotCQkvL01ham9yIGhhY2sgYmVjYXVzZSB3ZSBjYW4gbm90IHBhcnNlIGFuIGVtcHR5IGRvY3VtZW50Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVEdW1teUVudGl0eShEb2N1bWVudCBkb2MpIHsKLQkJZG9jLnJlbW92ZUNoaWxkKGdldE5vZGVDaGlsZChkb2MsIERVTU1ZX0VOVElUWV9TVFJJTkcpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUV4dHJhbmVvdXNDb21tZW50cyhEb2N1bWVudCBkb2MpIHsKLQkJLy9hbm90aGVyIG1ham9yIGhhY2sgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBYTUw0SiA0LjAuNyB0aGF0IGFkZGVkIGFsbCB0aGUKLQkJLy9jb21tZW50cyBmcm9tIHRoZSBkdGQgdG8gdGhlIGRvY3VtZW50LiBDYW4gYmUgcmVtb3ZlZCBhZnRlciB3ZSBtb3ZlIHVwCi0JCS8vWGVyY2VzIGxldmVscwotCQlOb2RlIGFOb2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCU5vZGUgbmV4dE5vZGUgPSBhTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJaWYgKGFOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpCi0JCQkJZG9jLnJlbW92ZUNoaWxkKGFOb2RlKTsKLQkJCWFOb2RlID0gbmV4dE5vZGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3IgcGVyZm9ybWFuY2UsIGNhY2hlIGEgc3RhdGljIGluc3RhbmNlIG9mIHRoZSBKQVhQIHJlZ2lzdGVyZWQgZG9jdW1lbnQgYnVpbGRlci4gVmFsaWRhdGlvbgotCSAqIGlzIGRpc2FibGVkIGZvciB0aGlzIGluc3RhbmNlLiBJZiB5b3UgbmVlZCB2YWxpZGF0aW9uLCB1c2UKLQkgKiB7QGxpbmsgI25ld0RlZmF1bHREb2N1bWVudEJ1aWxkZXIoYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbil9Ci0JICogCi0JICogQHJldHVybiBEb2N1bWVudEJ1aWxkZXIKLQkgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBKQVhQIGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERlZmF1bHREb2N1bWVudEJ1aWxkZXIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChkZWZhdWx0RG9jdW1lbnRCdWlsZGVyID09IG51bGwpIHsKLQkJCURPTUxvYWRPcHRpb25zIG9wdHMgPSBuZXcgRE9NTG9hZE9wdGlvbnMoKTsKLQkJCW9wdHMuc2V0QWxsb3dKYXZhRW5jb2RpbmdzKHRydWUpOwotCQkJb3B0cy5zZXRFeHBhbmRFbnRpdHlSZWZlcmVyZW5jZXModHJ1ZSk7Ci0JCQlvcHRzLnNldFZhbGlkYXRlKGZhbHNlKTsKLQkJCWRlZmF1bHREb2N1bWVudEJ1aWxkZXIgPSBuZXdEZWZhdWx0RG9jdW1lbnRCdWlsZGVyKG9wdHMpOwotCQkJZGVmYXVsdERvY3VtZW50QnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihkZWZhdWx0RW50aXR5UmVzb2x2ZXIpOwotCQkJZGVmYXVsdERvY3VtZW50QnVpbGRlci5zZXRFcnJvckhhbmRsZXIobmV3IEVycm9ySGFuZGxlcigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQotCQlyZXR1cm4gZGVmYXVsdERvY3VtZW50QnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnRpdHlSZXNvbHZlciBnZXREZWZhdWx0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBkZWZhdWx0RW50aXR5UmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc29sdmVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRFbnRpdHlSZXNvbHZlcihFbnRpdHlSZXNvbHZlciByZXNvbHZlcikgewotCQlkZWZhdWx0RW50aXR5UmVzb2x2ZXIgPSByZXNvbHZlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EYW5nbGluZ0hSRUZFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EYW5nbGluZ0hSRUZFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViZDAwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGFuZ2xpbmdIUkVGRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDEyLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotLyoqCi0gKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYSBwcm94eSBjYW4gbm90IGJlIHJlc29sdmVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEYW5nbGluZ0hSRUZFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0KLQlwdWJsaWMgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIERhbmdsaW5nSFJFRkV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTY2OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvMTAvMjAwMSAyOjQ5OjQ5IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyIGltcGxlbWVudHMgRmVhdHVyZVZhbHVlQ29udmVydGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTEVEX0NPTlZFUlNJT05fUEFUVEVSTiA9IFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkZhaWxlZF90b19jb252ZXJ0X18wX190b19fX0VSUk9SXzsKLQotCS8qKgotCSAqIERlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIEJvb2xlYW4uCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9Cb29sZWFuKE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuQm9vbGVhbl9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgQnl0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0J5dGUoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIEJ5dGUudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgQnl0ZSkKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5CeXRlX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBDaGFyYWN0ZXIuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9DaGFyYWN0ZXIoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKSBhVmFsdWUpLmxlbmd0aCgpID09IDEpCi0JCQlyZXR1cm4gbmV3IENoYXJhY3RlcigoKFN0cmluZykgYVZhbHVlKS5jaGFyQXQoMCkpOwotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkNoYXJhY3Rlcl9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgRG91YmxlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvRG91YmxlKE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gRG91YmxlLnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHREb3VibGUoKTsKLQkJCX0KLQkJfQotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgRG91YmxlKQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkRvdWJsZV9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgRUVudW1MaXRlcmFsLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvRW51bShPYmplY3QgYVZhbHVlLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJRUVudW1MaXRlcmFsIGxpdGVyYWwgPSBudWxsOwotCQlFRW51bSBlZW51bSA9IChFRW51bSkgYUZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCWxpdGVyYWwgPSBlZW51bS5nZXRFRW51bUxpdGVyYWwoKFN0cmluZykgYVZhbHVlKTsKLQkJZWxzZSBpZiAoYVZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikKLQkJCWxpdGVyYWwgPSBlZW51bS5nZXRFRW51bUxpdGVyYWwoKChJbnRlZ2VyKSBhVmFsdWUpLmludFZhbHVlKCkpOwotCQllbHNlIGlmIChhVmFsdWUgaW5zdGFuY2VvZiBFRW51bUxpdGVyYWwpCi0JCQlsaXRlcmFsID0gKEVFbnVtTGl0ZXJhbCkgYVZhbHVlOwotCi0JCWlmIChsaXRlcmFsID09IG51bGwpCi0JCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuRW51bWVyYXRpb25fVUlfKTsKLQotCQlyZXR1cm4gbGl0ZXJhbC5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgRmxvYXQuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9GbG9hdChPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEZsb2F0LnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRGbG9hdCgpOwotCQkJfQotCQl9Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5GbG9hdF9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgSW50ZWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0ludGVnZXIoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRJbnRlZ2VyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuSW50ZWdlcl9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgSmF2YSBPYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9KYXZhT2JqZWN0KE9iamVjdCBhVmFsdWUpIHsKLQkJcmV0dXJuIGFWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIExvbmcuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9Mb25nKE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTG9uZy52YWx1ZU9mKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBkZWZhdWx0TG9uZygpOwotCQkJfQotCQl9Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBMb25nKQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkxvbmdfVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIE1vZk9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb01vZk9iamVjdChPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLk1vZk9iamVjdF9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgU2hvcnQuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9TaG9ydChPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIFNob3J0LnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRTaG9ydCgpOwotCQkJfQotCQl9Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTaG9ydCkKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5TaG9ydF9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgU3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvU3RyaW5nKE9iamVjdCBhVmFsdWUpIHsKLQkJcmV0dXJuIGFWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIHRoZSB0eXBlIG9mCi0JICogQGFuQXR0cmlidXRlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFZhbHVlKE9iamVjdCBhVmFsdWUsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIGFuQXR0cmlidXRlKSB7Ci0KLQkJRUNsYXNzaWZpZXIgbWV0YSA9IGFuQXR0cmlidXRlLmdldEVUeXBlKCk7Ci0JCWlmIChtZXRhLmVDbGFzcygpID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUVudW0oKSkKLQkJCXJldHVybiBjb252ZXJ0VG9FbnVtKGFWYWx1ZSwgYW5BdHRyaWJ1dGUpOwotCQlpZiAobWV0YS5nZXRFUGFja2FnZSgpIGluc3RhbmNlb2YgRWNvcmVQYWNrYWdlKQotCQl7Ci0JCQlzd2l0Y2ggKG1ldGEuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FU1RSSU5HIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb1N0cmluZyhhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCT09MRUFOX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJPT0xFQU4gOgotCQkJCQlyZXR1cm4gY29udmVydFRvQm9vbGVhbihhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVJTlRFR0VSX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUlOVCA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9JbnRlZ2VyKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUZMT0FUX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUZMT0FUIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0Zsb2F0KGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUNIQVJBQ1RFUl9PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVDSEFSIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJhY3RlcihhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVMT05HX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUxPTkcgOgotCQkJCQlyZXR1cm4gY29udmVydFRvTG9uZyhhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCWVRFX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJZVEUgOgotCQkJCQlyZXR1cm4gY29udmVydFRvQnl0ZShhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVET1VCTEVfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FRE9VQkxFIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0RvdWJsZShhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTSE9SVF9PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTSE9SVCA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9TaG9ydChhVmFsdWUpOwotCQkJCS8vCQljYXNlIEVjb3JlUGFja2FnZS5FRU5VTToKLQkJCQkvLwkJCXJldHVybiBjb252ZXJ0VG9FbnVtKGFWYWx1ZSwgYW5BdHRyaWJ1dGUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVPQkpFQ1QgOgotCQkJCQlyZXR1cm4gY29udmVydFRvTW9mT2JqZWN0KGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUpBVkFfT0JKRUNUIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0phdmFPYmplY3QoYVZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtZXRhLmdldEVQYWNrYWdlKCkgaW5zdGFuY2VvZiBYTUxUeXBlUGFja2FnZSkKLQkJewotCQkJc3dpdGNoIChtZXRhLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLlNUUklORyA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb1N0cmluZyhhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5CT09MRUFOX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkJPT0xFQU4gOgotCQkJCXJldHVybiBjb252ZXJ0VG9Cb29sZWFuKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLklOVF9PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5JTlRFR0VSIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuSU5UIDoKLQkJCQlyZXR1cm4gY29udmVydFRvSW50ZWdlcihhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5GTE9BVF9PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5GTE9BVCA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb0Zsb2F0KGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkxPTkdfT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuTE9ORyA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb0xvbmcoYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuQllURV9PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5CWVRFIDoKLQkJCQlyZXR1cm4gY29udmVydFRvQnl0ZShhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5ET1VCTEVfT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuRE9VQkxFIDoKLQkJCQlyZXR1cm4gY29udmVydFRvRG91YmxlKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLlNIT1JUX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLlNIT1JUIDoKLQkJCQlyZXR1cm4gY29udmVydFRvU2hvcnQoYVZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYVZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIHRoZSB0eXBlIG9mCi0JICogQGFGZWF0dXJlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFZhbHVlKE9iamVjdCBhVmFsdWUsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJaWYgKGFWYWx1ZSA9PSBudWxsIHx8IGFGZWF0dXJlID09IG51bGwgfHwgIShhRmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpKQotCQkJcmV0dXJuIGFWYWx1ZTsgLy9ub3RoaW5nIHRvIGNvbnZlcnQKLQkJcmV0dXJuIGNvbnZlcnRWYWx1ZShhVmFsdWUsIChFQXR0cmlidXRlKSBhRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IERvdWJsZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIGRlZmF1bHREb3VibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBGbG9hdCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRmxvYXQgZGVmYXVsdEZsb2F0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgSW50ZWdlciB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBkZWZhdWx0SW50ZWdlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IExvbmcgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIExvbmcgZGVmYXVsdExvbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBTaG9ydCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU2hvcnQgZGVmYXVsdFNob3J0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGYWlsZWQgdG8gY29udmVydAotCSAqIAotCSAqIEBhVmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmYWlsZWRUb0NvbnZlcnQoT2JqZWN0IGFWYWx1ZSwgU3RyaW5nIGFTdHJpbmcpIHsKLQkJU3RyaW5nIGVycm9yU3RyaW5nID0gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KEZBSUxFRF9DT05WRVJTSU9OX1BBVFRFUk4sIG5ldyBTdHJpbmdbXXthVmFsdWUudG9TdHJpbmcoKSwgYVN0cmluZ30pOwotCQl0aHJvdyBuZXcgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihlcnJvclN0cmluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3YzBhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTQsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgR0xPQkFMX0ZBQ1RPUlkgPSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSShERUZBVUxUX0VYVEVOU0lPTikpOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBEZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkodXJpLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkKLQl7Ci0JCU9iamVjdCByZXNvdXJjZUZhY3RvcnkgPSBudWxsOwotCQlpZiAocmVzb3VyY2VGYWN0b3J5ID09IG51bGwpIHsKLQkJCVN0cmluZyBwcm90b2NvbCA9IHVyaS5zY2hlbWUoKTsKLQkJCXJlc291cmNlRmFjdG9yeSA9IHByb3RvY29sVG9GYWN0b3J5TWFwLmdldChwcm90b2NvbCk7Ci0JCQlpZiAocmVzb3VyY2VGYWN0b3J5ID09IG51bGwpIHsKLQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gdXJpLmZpbGVFeHRlbnNpb24oKTsKLQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBleHRlbnNpb25Ub0ZhY3RvcnlNYXAuZ2V0KGV4dGVuc2lvbik7Ci0JCQkJaWYgKHJlc291cmNlRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlRmFjdG9yeSA9IGRlbGVnYXRlZEdldEZhY3RvcnkodXJpKTsKLQkJCQkJaWYgKHJlc291cmNlRmFjdG9yeSA9PSBHTE9CQUxfRkFDVE9SWSkgewotCQkJCQkJcmVzb3VyY2VGYWN0b3J5ID0gZXh0ZW5zaW9uVG9GYWN0b3J5TWFwLmdldChSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJCQkJCWlmIChyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkKLQkJCQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBHTE9CQUxfRkFDVE9SWTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc291cmNlRmFjdG9yeSBpbnN0YW5jZW9mIFJlc291cmNlLkZhY3RvcnkuRGVzY3JpcHRvciA/ICgoUmVzb3VyY2UuRmFjdG9yeS5EZXNjcmlwdG9yKSByZXNvdXJjZUZhY3RvcnkpLmNyZWF0ZUZhY3RvcnkoKSA6IChSZXNvdXJjZS5GYWN0b3J5KSByZXNvdXJjZUZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUltcGwjZGVsZWdhdGVkR2V0RmFjdG9yeShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXByb3RlY3RlZCBGYWN0b3J5IGRlbGVnYXRlZEdldEZhY3RvcnkoVVJJIHVyaSkgewotCQlyZXR1cm4gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KHVyaSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFmNjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjI1OjQzIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24gewotCXByb3RlY3RlZCBFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQlwcm90ZWN0ZWQgT2JqZWN0IHJlZmVyZW5jZVZhbHVlOwotCXByb3RlY3RlZCBFT2JqZWN0IGNvcHlDb250YWluZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZFN1ZmZpeDsKLQotCS8qKgotCSAqIERlZmVycmVkQ29weSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24oRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBPYmplY3QgYVZhbHVlLCBTdHJpbmcgYVN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQlyZWZlcmVuY2UgPSBhUmVmZXJlbmNlOwotCQlyZWZlcmVuY2VWYWx1ZSA9IGFWYWx1ZTsKLQkJaWRTdWZmaXggPSBhU3VmZml4OwotCQljb3B5Q29udGFpbmVyID0gYUNvcHlDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTYvMjAwMCA5OjMyOjI4IEFNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgZ2V0Q29weUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGNvcHlDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjM0OjU2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkU3VmZml4KCkgewotCQlyZXR1cm4gaWRTdWZmaXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjM0OjU2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE2LzIwMDAgOTozMjoyOCBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZVZhbHVlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlVmFsdWU7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcGVyZm9ybUFjdGlvbigpOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWZlMDZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW50ZXJmYWNlIHRvIGFuIG9iamVjdCB3aGljaCBjYW4gZW5jb2RlIGFuZCBkZWNvZGUgdmFsdWVzLiBUaGlzIHR5cGljYWxseSBpbnZvbHZlcwotICogY3J5cHRvZ3JhcGh5IGFsZ29yaXRobXMuIFRoaXMgaW50ZXJmYWNlLCBhbG9uZyB3aXRoIHRoZSBzdXBwbGllZCBhZGFwdGVycyBwcm92aWRlIGFuIGV4dGVuc2lvbgotICogbWVjaGFuaXNtIGZvciBwbHVnZ2FibGUgY3J5dG9ncmFwaHkgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgYXR0cmlidXRlCi0gKiB2YWx1ZXMsIGFuZCBpcyB1c2VkIHByZXZhbGVudGx5IGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgcGFzc3dvcmQgdmFsdWVzIG9mIG1vZiBvYmplY3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVuY29kZXJEZWNvZGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODhiMzAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBBbiBhZGFwdGVyIGZvciBFbmNvZGVyRGVjb2RlciBpbXBsZW1lbnRhdGlvbnMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVuY29kZXJEZWNvZGVyQWRhcHRlciBpbXBsZW1lbnRzIEVuY29kZXJEZWNvZGVyIHsKLQotCS8qKgotCSAqIEVuY29kZXJEZWNvZGVyQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlckFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBkZWNvZGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGVuY29kZShTdHJpbmcgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjE1MTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBSZWdpc3RyeSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyB2YWx1ZSBkZWNvZGVycyBhbmQgZW5jb2RlcnMuIFVzYWdlIEV4YW1wbGU6Ci0gKiAKLSAqIDxwcmU+Ci0gKiAKLSAqIAotICogLy8gVXNlIHRoZSBzdGFuZGFyZCBXZWJTcGhlcmUgcGFzc3dvcmQgdmFsdWUgZW5jb2Rlci9kZWNvZGVyLgotICogRW5jb2RlckRlY29kZXJSZWdpc3RyeS5nZXREZWZhdWx0UmVnaXN0cnkoKS5zZXREZWZhdWx0RW5jb2RlckRlY29kZXIobmV3IGNvbS5pYm0uZWpzLnNlY3VyaXR5LnV0aWwuV0FTRW5jb2RlckRlY29kZXIoKSk7Ci0gKiAvLyBCZWdpbiB0cmFja2luZyBjaGFuZ2VzLi4uCi0gKiBXcml0ZUJhY2tIZWxwZXIuYmVnaW4oKTsKLSAqIC8vIExvYWQgYSByZXNvdXJjZSB3aGljaCBtYXkgaGF2ZSB1bi1lbmNvZGVkIHZhbHVlcy4uLgotICogLy8gTm90ZTogVGhlIFdDQ00gd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB1bi1lbmNvZGVkIHZhbHVlcy4gIElmIHVuZW5jb2RlZCB2YWx1ZXMKLSAqIC8vIGFyZSBmb3VuZCwgdGhlIHZhbHVlIHdpbGwgYmUgZW5jb2RlZCwgYW5kIHRoZSByZXNvdXJjZSB3aWxsIGJlIGFkZGVkIHRvIHRoZQotICogLy8gV3JpdGVCYWNrSGVscGVyLgotICogUmVzb3VyY2UgcmVzID0gcmVzb3VyY2VTZXQubG9hZCgmcXVvdDtteVJlc291cmNlJnF1b3Q7KTsKLSAqIC8vIEVuc3VyZSB0aGF0IGFueSBjaGFuZ2VzIGR1ZSB0byBlbmNvZGluZyBhcmUgd3JpdHRlbiBiYWNrIG91dC4KLSAqIFdyaXRlQmFja0hlbHBlci5lbmQoKTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgRW5jb2RlckRlY29kZXJSZWdpc3RyeSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IF9kZWZhdWx0SW5zdGFuY2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGVyRGVjb2RlciBJTklUSUFMX0RFRkFVTFRfRU5DT0RFUiA9IFBhc3N0aHJ1RW5jb2RlckRlY29kZXIuSU5TVEFOQ0U7Ci0JcHJvdGVjdGVkIE1hcCBlbmNvZGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIE9iamVjdCBkZWZhdWx0RW5jb2RlcktleTsKLQotCS8qKgotCSAqIEVuY29kZXJEZWNvZGVyUmVnaXN0cnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRW5jb2RlckRlY29kZXJSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRFbmNvZGVycygpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIvMi8yMDAxIDEyOjQzOjMxIEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVuY29kZXJEZWNvZGVyKEVuY29kZXJEZWNvZGVyIGVuY29kZXJEZWNvZGVyKSB7Ci0JCWVuY29kZXJzLnB1dChlbmNvZGVyRGVjb2Rlci5nZXRDbGFzcygpLmdldE5hbWUoKSwgZW5jb2RlckRlY29kZXIpOwotCQlpZiAoZGVmYXVsdEVuY29kZXJLZXkgPT0gbnVsbCkKLQkJCWRlZmF1bHRFbmNvZGVyS2V5ID0gZW5jb2RlckRlY29kZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVyL2RlY29kZXIgYnkga2V5LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlciBnZXREZWZhdWx0RW5jb2RlckRlY29kZXIoKSB7Ci0JCWlmIChkZWZhdWx0RW5jb2RlcktleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRW5jb2RlckRlY29kZXIpIGVuY29kZXJzLmdldChkZWZhdWx0RW5jb2RlcktleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCByZWdpc3RyeSB0byB1c2UgZm9yIHJldHJpZXZpbmcgdmFsdWUgZW5jb2RlcnMgYW5kIGRlY29kZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IGdldERlZmF1bHRSZWdpc3RyeSgpIHsKLQkJaWYgKF9kZWZhdWx0SW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2RlZmF1bHRJbnN0YW5jZSA9IG5ldyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIF9kZWZhdWx0SW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVyL2RlY29kZXIgYnkga2V5LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlciBnZXRFbmNvZGVyRGVjb2RlcihPYmplY3Qga2V5KSB7Ci0JCXJldHVybiAoRW5jb2RlckRlY29kZXIpIGVuY29kZXJzLmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGEgc3RhbmRhcmQgc2V0IG9mIGVuY29kZXIvZGVjb2RlcnMuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRFbmNvZGVycygpIHsKLQkJc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKElOSVRJQUxfREVGQVVMVF9FTkNPREVSKTsKLQkJYWRkRW5jb2RlckRlY29kZXIobmV3IFhNTFZhbHVlRW5jb2RlckRlY29kZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5jb2Rlci9kZWNvZGVyIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRW5jb2RlckRlY29kZXIoT2JqZWN0IGtleSkgewotCQlpZiAoZW5jb2RlcnMuY29udGFpbnNLZXkoa2V5KSkgewotCQkJZW5jb2RlcnMucmVtb3ZlKGtleSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVuY29kZXIvZGVjb2RlciBieSBrZXkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKEVuY29kZXJEZWNvZGVyIGVuY29kZXIpIHsKLQkJZGVmYXVsdEVuY29kZXJLZXkgPSBlbmNvZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlpZiAoIWVuY29kZXJzLmNvbnRhaW5zS2V5KGRlZmF1bHRFbmNvZGVyS2V5KSkgewotCQkJYWRkRW5jb2RlckRlY29kZXIoZW5jb2Rlcik7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlTZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwODA0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMDQvMDEgMTE6MjU6NTkgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEV0b29sc0NvcHlTZXNzaW9uIGV4dGVuZHMgRXRvb2xzQ29weVV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX0NPUElFRCA9IDUwMDsKLQlwcml2YXRlIEV0b29sc0NvcHlVdGlsaXR5IHBhcmVudENvcHlVdGlsaXR5OwotCXByaXZhdGUgWE1MUmVzb3VyY2UgY3VycmVudFJlc291cmNlOwotCXByaXZhdGUgWE1MUmVzb3VyY2UgY3VycmVudENvcHlSZXNvdXJjZTsKLQotCS8qKgotCSAqIEV0b29sc0NvcHlTZXNzaW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEV0b29sc0NvcHlTZXNzaW9uKEV0b29sc0NvcHlVdGlsaXR5IGFDb3B5VXRpbGl0eSkgewotCQlwYXJlbnRDb3B5VXRpbGl0eSA9IGFDb3B5VXRpbGl0eTsKLQkJc2V0UHJlc2VydmVJZHMoYUNvcHlVdGlsaXR5LnByZXNlcnZlSWRzKCkpOwotCQlzZXRDb3B5QWRhcHRlcnMoYUNvcHlVdGlsaXR5LmlzQ29weUFkYXB0ZXJzKCkpOwotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIFJlc291cmNlcyBhbmQgUmVmT2JqZWN0cyB3aXRoaW4gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZW0gdG8KLQkgKiA8Y29kZT5hR3JvdXA8L2NvZGU+LiBOb24gY29tcG9zaXRlIHJlZmVyZW5jZXMgd2lsbCBiZSBkZWZlcnJlZCB1bnRpbCBhbGwgb2JqZWN0cyBhcmUKLQkgKiBjb3BpZWQgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+LgotCSAqIAotCSAqIENvcHkgUmVzb3VyY2VzIGZpcnN0IGFuZCB0aGVuIGNvcHkgUmVmT2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5KENvcHlHcm91cCBhR3JvdXApIHsKLQkJaWYgKGFHcm91cCAhPSBudWxsKSB7Ci0JCQljb3B5UmVzb3VyY2VzKGFHcm91cCk7Ci0JCQljb3B5UmVmT2JqZWN0cyhhR3JvdXApOwotCQkJZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKTsKLQkJCWFHcm91cC5wb3N0Q29weSh0aGlzKTsKLQkJCW5vdGlmeU5ld1Jlc291cmNlc0NvcGllZChhR3JvdXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBjb250YWlubWVudENvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4gVGhpcyBtZXRob2Qgb25seSBjb3BpZXMgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gYXR0cmlidXRlcy4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjb3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUVPYmplY3QgY29waWVkID0gY29udGFpbm1lbnRDb3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4gVGhlIGNvcGllZCBSZXNvdXJjZSB3aWxsIGhhdmUgYSBVUkkgZXF1YWwgdG8gPGNvZGU+bmV3VXJpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJUmVzb3VyY2UgY29waWVkID0gY29udGFpbm1lbnRDb3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKTsKLQkJY29weU1vZGlmaWNhdGlvbkZsYWcoYVJlc291cmNlLCBjb3BpZWQpOwotCQlub3RpZnlOZXdSZXNvdXJjZUNvcGllZChjb3BpZWQpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU5ld1Jlc291cmNlc0NvcGllZChDb3B5R3JvdXAgZ3JvdXApIHsKLQkJTGlzdCBjb3BpZWQgPSBncm91cC5nZXRDb3BpZWRSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3BpZWQuc2l6ZSgpOyBpKyspIHsKLQkJCW5vdGlmeU5ld1Jlc291cmNlQ29waWVkKChSZXNvdXJjZSkgY29waWVkLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlOZXdSZXNvdXJjZUNvcGllZChSZXNvdXJjZSBjb3BpZWQpIHsKLQkJY29waWVkLmVOb3RpZnkobmV3IE5vdGlmaWNhdGlvbkltcGwoUkVTT1VSQ0VfQ09QSUVELCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYuZWNvcmUudXRpbGl0aWVzLmNvcHkuRXRvb2xzQ29weVV0aWxpdHkjcHJpbUNvcHlPYmplY3QoRU9iamVjdCwKLQkgKiAgICAgIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBwcmltQ29weU9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcHkgPSBzdXBlci5wcmltQ29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCWNvcHlJZElmTmVjZXNzYXJ5KGFSZWZPYmplY3QsIGNvcHksIGlkU3VmZml4KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUlkSWZOZWNlc3NhcnkoRU9iamVjdCBvYmosIEVPYmplY3QgY29weSwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCWlmICgoaWRTdWZmaXggPT0gbnVsbCAmJiAhcHJlc2VydmVJZHMpIHx8IGN1cnJlbnRSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgaWQgPSBjdXJyZW50UmVzb3VyY2UuZ2V0SUQob2JqKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlkID0gaWRTdWZmaXggPT0gbnVsbCA/IGlkIDogaWQgKyBpZFN1ZmZpeDsKLQkJY3VycmVudENvcHlSZXNvdXJjZS5zZXRJRChjb3B5LCBpZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgZGVsaXZlcnkgYmFjayBvbiBmb3IgYWxsIHRoZSBjYWNoZWQgb2JqZWN0cyBhbmQgcHVzaCB0aGVtIHRvIHRoZSBwYXJlbnRDb3B5VXRpbGl0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLQkJSXRlcmF0b3IgaXQgPSBnZXRDb3BpZWRPYmplY3RzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAgcGFyZW50Q29waWVzID0gZ2V0UGFyZW50Q29weVV0aWxpdHkoKS5nZXRDb3BpZWRPYmplY3RzKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJRU9iamVjdCBjb3B5OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWNvcHkgPSAoRU9iamVjdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWNvcHkuZVNldERlbGl2ZXIodHJ1ZSk7Ci0JCQlwYXJlbnRDb3BpZXMucHV0KGVudHJ5LmdldEtleSgpLCBjb3B5KTsKLQkJfQotCQljb3BpZWRPYmplY3RzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjYWNoZWQgY29weS4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5KEVPYmplY3QgYW5PYmplY3QpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBzdXBlci5nZXRDb3B5KGFuT2JqZWN0KTsKLQkJaWYgKGNvcGllZCA9PSBudWxsKQotCQkJY29waWVkID0gZ2V0UGFyZW50Q29weVV0aWxpdHkoKS5nZXRDb3B5KGFuT2JqZWN0KTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8wNC8wMSAxMToyODowNyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5VXRpbGl0eQotCSAqLwotCXByb3RlY3RlZCBFdG9vbHNDb3B5VXRpbGl0eSBnZXRQYXJlbnRDb3B5VXRpbGl0eSgpIHsKLQkJcmV0dXJuIHBhcmVudENvcHlVdGlsaXR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBFT2JqZWN0IHRoYXQgaXMgdGhlIHNhbWUgdHlwZSBhcyA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBuZXdJbnN0YW5jZShFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJRU9iamVjdCBuZXdUeXBlID0gc3VwZXIubmV3SW5zdGFuY2UoYVJlZk9iamVjdCk7Ci0JCW5ld1R5cGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQlyZXR1cm4gbmV3VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5VXRpbGl0eSNuZXdJbnN0YW5jZShSZXNvdXJjZSwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBuZXdJbnN0YW5jZShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJUmVzb3VyY2UgY29weSA9IHN1cGVyLm5ld0luc3RhbmNlKGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJaWYgKGFSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7Ci0JCQljdXJyZW50UmVzb3VyY2UgPSAoWE1MUmVzb3VyY2UpIGFSZXNvdXJjZTsKLQkJCWN1cnJlbnRDb3B5UmVzb3VyY2UgPSAoWE1MUmVzb3VyY2UpIGNvcHk7Ci0JCX0gZWxzZSB7Ci0JCQljdXJyZW50UmVzb3VyY2UgPSBudWxsOwotCQkJY3VycmVudENvcHlSZXNvdXJjZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FdG9vbHNDb3B5VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZDkxZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xMy8yMDAwIDk6MTA6NTUgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEV0b29sc0NvcHlVdGlsaXR5IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFTlVNTElURVJBTF9UWVBFX05BTUUgPSAiRUVudW1MaXRlcmFsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgRWNvcmVQYWNrYWdlIHBrZyA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQlwcml2YXRlIGZpbmFsIEVUeXBlZEVsZW1lbnQgTUVUQUVOQU1FID0gcGtnLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpOwotCi0JcHJvdGVjdGVkIEhhc2hNYXAgY29waWVkT2JqZWN0czsKLQlwcm90ZWN0ZWQgTGlzdCBkZWZlcnJlZFJlZmVyZW5jZUNvcGllczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVzZXJ2ZUlkcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGNvcHlBZGFwdGVycyA9IGZhbHNlOwotCXByb3RlY3RlZCBIYXNoTWFwIGNvcGllZEFkYXB0ZXJzOwotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weUFjdGlvbiBleHRlbmRzIERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbiB7Ci0JCXB1YmxpYyBEZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHlBY3Rpb24oRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBPYmplY3QgYVZhbHVlLCBTdHJpbmcgYVN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQkJc3VwZXIoYVJlZmVyZW5jZSwgYVZhbHVlLCBhU3VmZml4LCBhQ29weUNvbnRhaW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotCQkJRU9iamVjdCB2YWx1ZSA9IChFT2JqZWN0KSBnZXRSZWZlcmVuY2VWYWx1ZSgpOwotCQkJZ2V0Q29weUNvbnRhaW5lcigpLmVTZXQoZ2V0UmVmZXJlbmNlKCksIGdldENvcHlJZkZvdW5kKHZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weUFjdGlvbiBleHRlbmRzIERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbiB7Ci0JCXB1YmxpYyBEZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5QWN0aW9uKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgTGlzdCBhVmFsdWUsIFN0cmluZyBhU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCQlzdXBlcihhUmVmZXJlbmNlLCBhVmFsdWUsIGFTdWZmaXgsIGFDb3B5Q29udGFpbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm1BY3Rpb24oKSB7Ci0JCQlMaXN0IGNvcHlMaXN0ID0gKExpc3QpIGdldENvcHlDb250YWluZXIoKS5lR2V0KGdldFJlZmVyZW5jZSgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gKChMaXN0KSBnZXRSZWZlcmVuY2VWYWx1ZSgpKS5pdGVyYXRvcigpOwotCQkJRU9iamVjdCBuZXh0OwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCW5leHQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCWNvcHlMaXN0LmFkZChnZXRDb3B5SWZGb3VuZChuZXh0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xMy8yMDAwIDk6MTQ6MjYgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIEV0b29sc0NvcHlVdGlsaXR5KCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIDxjb2RlPkRlZmVycmVkTWFueVJlZmVyZW5jZUNvcHlBY3Rpb248L2NvZGU+IGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgZGVmZXJyZWQKLQkgKiBjb3B5IGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weShFUmVmZXJlbmNlIHJlZmVyZW5jZSwgTGlzdCBhVmFsdWUsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQlnZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpLmFkZChuZXcgRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weUFjdGlvbihyZWZlcmVuY2UsIGFWYWx1ZSwgaWRTdWZmaXgsIGFDb3B5Q29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+RGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5QWN0aW9uPC9jb2RlPiBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGRlZmVycmVkCi0JICogY29weSBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weShFUmVmZXJlbmNlIHJlZmVyZW5jZSwgRU9iamVjdCBhVmFsdWUsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQlnZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpLmFkZChuZXcgRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5QWN0aW9uKHJlZmVyZW5jZSwgYVZhbHVlLCBpZFN1ZmZpeCwgYUNvcHlDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW4gYWxyZWFkeSBjb3BpZWQgb2JqZWN0IGZpcnN0LgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGNvbnRhaW5tZW50Q29weShFT2JqZWN0IGFuT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBnZXRDb3B5KGFuT2JqZWN0KTsKLQkJaWYgKGNvcGllZCA9PSBudWxsKQotCQkJY29waWVkID0gcHJpbUNvcHkoYW5PYmplY3QsIGlkU3VmZml4KTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW4gYWxyZWFkeSBjb3BpZWQgb2JqZWN0IGZpcnN0LgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGNvbnRhaW5tZW50Q29weU9iamVjdChFT2JqZWN0IGFuT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBnZXRDb3B5KGFuT2JqZWN0KTsKLQkJaWYgKGNvcGllZCA9PSBudWxsKQotCQkJY29waWVkID0gcHJpbUNvcHlPYmplY3QoYW5PYmplY3QsIGlkU3VmZml4KTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgY29udGFpbm1lbnRDb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQkvKiBjb3BpZWQgcmVzb3VyY2VzIGFyZSBuZXZlciBjYWNoZWQgKi8KLQkJcmV0dXJuIHByaW1Db3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGFsbCBSZXNvdXJjZXMgYW5kIFJlZk9iamVjdHMgd2l0aGluIDxjb2RlPmFHcm91cDwvY29kZT4gYW5kIGFkZCB0aGVtIHRvCi0JICogPGNvZGU+YUdyb3VwPC9jb2RlPi4gTm9uIGNvbXBvc2l0ZSByZWZlcmVuY2VzIHdpbGwgYmUgZGVmZXJyZWQgdW50aWwgYWxsIG9iamVjdHMgYXJlCi0JICogY29waWVkIGZyb20gPGNvZGU+YUdyb3VwPC9jb2RlPi4KLQkgKiAKLQkgKiBDb3B5IFJlc291cmNlcyBmaXJzdCBhbmQgdGhlbiBjb3B5IFJlZk9iamVjdHMuCi0JICovCi0JcHVibGljIHZvaWQgY29weShDb3B5R3JvdXAgYUdyb3VwKSB7Ci0JCWlmIChhR3JvdXAgIT0gbnVsbCkgewotCQkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBFdG9vbHNDb3B5U2Vzc2lvbih0aGlzKTsKLQkJCXNlc3Npb24uc2V0UHJlc2VydmVJZHMoYUdyb3VwLmdldFByZXNlcnZlSWRzKCkpOwotCQkJc2Vzc2lvbi5jb3B5KGFHcm91cCk7Ci0JCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjb3B5KEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlyZXR1cm4gY29weShhUmVmT2JqZWN0LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiBpbiB0aGlzCi0JICogY29weSBleGVjdXRpb24uCi0JICovCi0JcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEV0b29sc0NvcHlTZXNzaW9uKHRoaXMpOwotCQlFT2JqZWN0IGNvcGllZCA9IHNlc3Npb24uY29weShhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCXNlc3Npb24uZmx1c2goKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiBpbiB0aGlzCi0JICogY29weSBleGVjdXRpb24uIFRoaXMgbWV0aG9kIG9ubHkgY29waWVzIDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IHdpdGggaXRzIHByb3BlcnRpZXMsIG5vdAotCSAqIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIEVPYmplY3QgY29weU9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEV0b29sc0NvcHlTZXNzaW9uKHRoaXMpOwotCQlFT2JqZWN0IGNvcGllZCA9IHNlc3Npb24uY29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCXNlc3Npb24uZmx1c2goKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4gVGhlIGNvcGllZCBSZXNvdXJjZSB3aWxsIGhhdmUgYSBVUkkgZXF1YWwgdG8gPGNvZGU+bmV3VXJpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBFdG9vbHNDb3B5U2Vzc2lvbih0aGlzKTsKLQkJUmVzb3VyY2UgY29waWVkID0gc2Vzc2lvbi5jb3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJc2Vzc2lvbi5mbHVzaCgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIElmIGFuIGF0dHJpYnV0ZSBpcyBzZXQgYW5kIGl0cyB2YWx1ZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gcGVyZm9ybSBjb3B5Ci0JICogPGNvZGU+YXR0cmlidXRlPC9jb2RlPiB2YWx1ZSBmcm9tIDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IHRvIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqIE51bGwgaXMgYSB2YWxpZCB2YWx1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHNldC4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJaWYgKCFhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkpCi0JCQlyZXR1cm47IC8vaWdub3JlCi0JCWlmIChhdHRyaWJ1dGUuaXNNYW55KCkpIHsKLQkJCUxpc3QgdmFsdWUgPSAoTGlzdCkgYVJlZk9iamVjdC5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQljb3B5TWFueUF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0gZWxzZSBpZiAoYVJlZk9iamVjdC5lSXNTZXQoYXR0cmlidXRlKSkgewotCQkJT2JqZWN0IHZhbHVlID0gYVJlZk9iamVjdC5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCQllbHNlCi0JCQkJY29weVNpbmdsZUF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0gZWxzZSBpZiAoYXR0cmlidXRlID09IE1FVEFFTkFNRSkgewotCQkJLy9zZXQgbmFtZSB0byB0aGUgSUQgKHRoaXMgaXMgY29tcHV0ZWQgYXMgYSBkZWZhdWx0KSwgb25seSBnZXQgaGVyZSBpZiBpc1NldE5hbWUgaXMKLQkJCS8vIGZhbHNlLgotCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgYVJlZk9iamVjdC5lR2V0KGF0dHJpYnV0ZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSBvdmVyIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWNlaXZlciBhbmQgY29weSBlYWNoIGF0dHJpYnV0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5Q3VycmVudEF0dHJpYnV0ZXMoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlMaXN0IGF0dHJpYnV0ZXMgPSBhUmVmT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotCQkJRUF0dHJpYnV0ZSByYTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyYSA9IChFQXR0cmlidXRlKSBpdC5uZXh0KCk7Ci0JCQkJY29weUF0dHJpYnV0ZShyYSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlY2VpdmVyLiBJZiBhIHJlZmVyZW5jZSdzIHZhbHVlIGlzIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGEgc2VyaWVzIG9mIHRlc3RzIGFyZSBkb25lIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZSB3aXRoIHRoZQotCSAqIGNvcGllZCBvYmplY3QsIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqIAotCSAqIFRlc3RzOiAxLiBEbyBub3RoaW5nIGlmIHRoZSByZWZlcmVuY2UgZXF1YWxzIHRoZSBtZXRhRUNvbnRhaW5lciBvciBtZXRhRUNvbnRhaW5zIHJlZmVyZW5jZXMuCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5Q3VycmVudFJlZmVyZW5jZXMoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlMaXN0IHJlZmVyZW5jZXMgPSBhUmVmT2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOwotCQkJRVJlZmVyZW5jZSBycjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyciA9IChFUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHNob3VsZENvcHlSZWZlcmVuY2UocnIpKQotCQkJCQljb3B5UmVmZXJlbmNlKHJyLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlIG92ZXIgPGNvZGU+YW5FeHRlbnQ8L2NvZGU+IGFuZCBjb3B5IGVhY2ggZWxlbWVudCB0byA8Y29kZT5jb3B5RXh0ZW50PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5RXh0ZW50KEVMaXN0IGFuRXh0ZW50LCBFTGlzdCBjb3B5RXh0ZW50KSB7Ci0JCUl0ZXJhdG9yIGl0ID0gYW5FeHRlbnQuaXRlcmF0b3IoKTsKLQkJRU9iamVjdCByZWZPYmplY3Q7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXJlZk9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQljb3B5RXh0ZW50LmFkZChjb250YWlubWVudENvcHkocmVmT2JqZWN0LCBudWxsKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgbWFueSB2YWx1ZSBhdHRyaWJ1dGUgd2hpY2ggaXMgdHJlYXRlZCBhcyBhIG1hbnkgdmFsdWVkIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBUZXN0czoKLQkgKiAKLQkgKiAxLiBJZiB0aGUgdHlwZSBpcyA8Ym9sZD5ub3QgPC9ib2xkPiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBzZXQgdGhlIHZhbHVlIG9uCi0JICogPGNvZGU+Y29weVJlZjwvY29kZT4gd2l0aG91dCBtYWtpbmcgYSBjb3B5LiAyLiBJZiB0aGUgdHlwZSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbgotCSAqIG9idGFpbiB0aGUgbGlzdCBmcm9tIDxjb2RlPmNvcHlSZWY8L2NvZGU+IGFuZCBhZGQgYSBjb3B5IG9mIGVhY2ggdmFsdWUgZnJvbSB0aGUgb3JpZ2luYWwKLQkgKiBsaXN0IHRvIGl0LgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weU1hbnlBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUsIExpc3QgYVZhbHVlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCWlmIChhdHRyaWJ1dGUuZ2V0RVR5cGUoKSA9PSBudWxsKQotCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgYVZhbHVlKTsKLQkJZWxzZSB7Ci0JCQlMaXN0IGNvcHlMaXN0ID0gKExpc3QpIGNvcHlSZWYuZUdldChhdHRyaWJ1dGUpOwotCQkJSXRlcmF0b3IgaXQgPSBhVmFsdWUuaXRlcmF0b3IoKTsKLQkJCU9iamVjdCBuZXh0OwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCW5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJCQljb3B5TGlzdC5hZGQoY29udGFpbm1lbnRDb3B5KChFT2JqZWN0KSBuZXh0LCBpZFN1ZmZpeCkpOwotCQkJCWVsc2UKLQkJCQkJY29weUxpc3QuYWRkKG5leHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlY2VpdmVyLiBJZiBhIHJlZmVyZW5jZSdzIHZhbHVlIGlzIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGEgc2VyaWVzIG9mIHRlc3RzIGFyZSBkb25lIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZSB3aXRoIHRoZQotCSAqIGNvcGllZCBvYmplY3QsIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqIAotCSAqIFRlc3RzOiAxLiBJZiB0aGUgcmVmZXJlbmNlIGlzIG1hbnksIG9idGFpbiB0aGUgbGlzdCBmcm9tIHRoZSByZWNlaXZpbmcgb2JqZWN0IGFuZCBtYWtlIGEgY29weQotCSAqIG9mIGVhY2ggdmFsdWUgaWYgdGhlIHJlZmVyZW5jZSBpcyBjb21wb3NpdGUgYmVmb3JlIGFkZGluZyB0byB0aGUgbGlzdDsgb3RoZXJ3aXNlLCBqdXN0IGFkZAotCSAqIGVhY2ggdmFsdWUgdG8gdGhlIG9mIHRoZSA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlNYW55UmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgTGlzdCBhTGlzdCwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoIWFMaXN0LmlzRW1wdHkoKSkgewotCQkJaWYgKGFSZWZlcmVuY2UuaXNDb250YWlubWVudCgpKSB7Ci0JCQkJTGlzdCBjb3B5TGlzdCA9IChMaXN0KSBjb3B5UmVmLmVHZXQoYVJlZmVyZW5jZSk7Ci0JCQkJSXRlcmF0b3IgaXQgPSBhTGlzdC5pdGVyYXRvcigpOwotCQkJCUVPYmplY3QgdGFyZ2V0VmFsdWU7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQl0YXJnZXRWYWx1ZSA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJCWNvcHlMaXN0LmFkZChjb250YWlubWVudENvcHkodGFyZ2V0VmFsdWUsIGlkU3VmZml4KSk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJYWRkRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weShhUmVmZXJlbmNlLCBhTGlzdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlY2VpdmVyLiBJZiBhIHJlZmVyZW5jZSdzIHZhbHVlIGlzIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHkuCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoYVJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJTGlzdCB2YWx1ZSA9IChMaXN0KSBhUmVmT2JqZWN0LmVHZXQoYVJlZmVyZW5jZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQljb3B5TWFueVJlZmVyZW5jZShhUmVmZXJlbmNlLCB2YWx1ZSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9IGVsc2UgaWYgKGFSZWZPYmplY3QuZUlzU2V0KGFSZWZlcmVuY2UpKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBhUmVmT2JqZWN0LmVHZXQoYVJlZmVyZW5jZSk7Ci0JCQljb3B5U2luZ2xlUmVmZXJlbmNlKGFSZWZlcmVuY2UsIChFT2JqZWN0KSB2YWx1ZSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgUmVmT2JqZWN0cyBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4gYW5kIGFkZCB0aGUgY29weSBiYWNrIHRvIDxjb2RlPmFHcm91cDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weVJlZk9iamVjdHMoQ29weUdyb3VwIGFHcm91cCkgewotCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjsKLQkJRU9iamVjdCByZWZPYmplY3Q7Ci0JCVN0cmluZyBpZFN1ZmZpeDsKLQkJaWYgKGFHcm91cC5wcmltR2V0UmVmT2JqZWN0cygpICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gYUdyb3VwLnByaW1HZXRSZWZPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlhc3NvY2lhdGlvbiA9IChBc3NvY2lhdGlvbikgaXQubmV4dCgpOwotCQkJCXJlZk9iamVjdCA9IChFT2JqZWN0KSBhc3NvY2lhdGlvbi5nZXRLZXkoKTsKLQkJCQlpZFN1ZmZpeCA9IChTdHJpbmcpIGFzc29jaWF0aW9uLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGlkU3VmZml4ID09IG51bGwpCi0JCQkJCWlkU3VmZml4ID0gYUdyb3VwLmdldERlZmF1bHRJZFN1ZmZpeCgpOwotCQkJCWFHcm91cC5hZGRDb3BpZWQoY29udGFpbm1lbnRDb3B5KHJlZk9iamVjdCwgaWRTdWZmaXgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIFJlc291cmNlcyBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4gYW5kIGFkZCB0aGUgY29weSBiYWNrIHRvIDxjb2RlPmFHcm91cDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weVJlc291cmNlcyhDb3B5R3JvdXAgYUdyb3VwKSB7Ci0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uOwotCQlSZXNvdXJjZSByZXNvdXJjZTsKLQkJU3RyaW5nIHVyaTsKLQkJaWYgKGFHcm91cC5wcmltR2V0UmVzb3VyY2VzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBhR3JvdXAucHJpbUdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJYXNzb2NpYXRpb24gPSAoQXNzb2NpYXRpb24pIGl0Lm5leHQoKTsKLQkJCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgYXNzb2NpYXRpb24uZ2V0S2V5KCk7Ci0JCQkJdXJpID0gKFN0cmluZykgYXNzb2NpYXRpb24uZ2V0VmFsdWUoKTsKLQkJCQlSZXNvdXJjZSBjb3BpZWQgPSBjb250YWlubWVudENvcHkocmVzb3VyY2UsIHVyaSk7Ci0JCQkJY29weU1vZGlmaWNhdGlvbkZsYWcocmVzb3VyY2UsIGNvcGllZCk7Ci0JCQkJYUdyb3VwLmFkZENvcGllZChjb3BpZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIHNpbmdsZSB2YWx1ZSBhdHRyaWJ1dGUuCi0JICogCi0JICogVGVzdHM6Ci0JICogCi0JICogMS4gSWYgYW4gYXR0cmlidXRlIHR5cGUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gaXQgaXMgYW4gb2JqZWN0IHR5cGUgYW5kIGl0IG11c3QgYmUKLQkgKiBjb3BpZWQuIERvIG5vdCBjb3B5IHRoZSB2YWx1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGFuIEVudW1lcmF0aW9uIHR5cGUuIDIuIElmIGFuIGF0dHJpYnV0ZQotCSAqIHR5cGUgaXMgPGJvbGQ+bm90IDwvYm9sZD4gPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBjb3B5IHRoZSB2YWx1ZSBiZWZvcmUgc2V0dGluZyBpdCBvbgotCSAqIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weVNpbmdsZUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dHJpYnV0ZSwgT2JqZWN0IGFWYWx1ZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoYXR0cmlidXRlLmdldEVUeXBlKCkgPT0gbnVsbCkgewotCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgYVZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCS8vTU9GMTA4Ci0JCQkvLyBpZiAoYXR0cmlidXRlLmlzT2JqZWN0VHlwZSgpKQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKQotCQkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIGNvbnRhaW5tZW50Q29weSgoRU9iamVjdCkgYVZhbHVlLCBpZFN1ZmZpeCkpOwotCQkJZWxzZQotCQkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIGFWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVjZWl2ZXIuIElmIGEgcmVmZXJlbmNlJ3MgdmFsdWUgaXMgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYSBzZXJpZXMgb2YgdGVzdHMgYXJlIGRvbmUgYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlIHdpdGggdGhlCi0JICogY29waWVkIG9iamVjdCwgPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICogCi0JICogVGVzdHM6IDEuIElmIHRoZSByZWZlcmVuY2UgaXMgPGJvbGQ+bm90IDwvYm9sZD4gbWFueSwgbWFrZSBhIGNvcHkgb2YgdGhlIHZhbHVlIGlmIHRoZQotCSAqIHJlZmVyZW5jZSBpcyBjb21wb3NpdGUgYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlIHdpdGggPGNvZGU+Y29weVJlZjwvY29kZT47IG90aGVyd2lzZSwganVzdAotCSAqIHNldCB0aGUgdmFsdWUgYXMgaXMuCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5U2luZ2xlUmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgRU9iamVjdCBhVmFsdWUsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJLy9FeGNlcHRpb25hbCBjYXNlOyB0aGUgcmVsYXRpb25zaGlwIGlzIG5vdCB0aGUgY29udGFpbmVyIHJlbGF0aW9uc2hpcAotCQkvL0FuZCBpcyBub3QgbmF2aWdhYmxlIGluIHRoZSBvdGhlciBkaXJlY3Rpb247IGdvIGFoZWFkIGFuZCBjb3B5Ci0JCWlmIChhVmFsdWUgIT0gYVJlZk9iamVjdC5lQ29udGFpbmVyKCkgfHwgYVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSA9PSBudWxsKSB7Ci0JCQlpZiAoYVJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkpCi0JCQkJY29weVJlZi5lU2V0KGFSZWZlcmVuY2UsIGNvbnRhaW5tZW50Q29weShhVmFsdWUsIGlkU3VmZml4KSk7Ci0JCQllbHNlCi0JCQkJYWRkRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5KGFSZWZlcmVuY2UsIGFWYWx1ZSwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgUmVzb3VyY2VzIGFuZCBSZWZPYmplY3RzIHdpdGhpbiA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlbSB0bwotCSAqIDxjb2RlPmFHcm91cDwvY29kZT4uIE5vbiBjb21wb3NpdGUgcmVmZXJlbmNlcyB3aWxsIGJlIGRlZmVycmVkIHVudGlsIGFsbCBvYmplY3RzIGFyZQotCSAqIGNvcGllZCBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4uCi0JICogCi0JICogQ29weSBSZXNvdXJjZXMgZmlyc3QgYW5kIHRoZW4gY29weSBSZWZPYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVDb3B5KENvcHlHcm91cCBhR3JvdXApIHsKLQkJRXRvb2xzQ29weVV0aWxpdHkgdXRpbGl0eSA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotCQl1dGlsaXR5LmNvcHkoYUdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVBdHRyaWJ1dGVDb3B5KEVPYmplY3QgYVJlZk9iamVjdCwgRU9iamVjdCBjb3B5T2JqZWN0KSB7Ci0JCUV0b29sc0NvcHlVdGlsaXR5IHV0aWxpdHkgPSBuZXcgRXRvb2xzQ29weVV0aWxpdHkoKTsKLQkJdXRpbGl0eS5jb3B5Q3VycmVudEF0dHJpYnV0ZXMoYVJlZk9iamVjdCwgbnVsbCwgY29weU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcKLQkgKiBJRHMgb2YgY29waWVkIG9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUNvcHkoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCXJldHVybiBjcmVhdGVDb3B5KGFSZWZPYmplY3QsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYW5kIHJlZmVyZW5jZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlCi0JICogY29udGFpbm1lbnQgdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nCi0JICogSURzIG9mIGNvcGllZCBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBjcmVhdGVDb3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUV0b29sc0NvcHlVdGlsaXR5IHV0aWxpdHkgPSBuZXcgRXRvb2xzQ29weVV0aWxpdHkoKTsKLQkJcmV0dXJuIHV0aWxpdHkuY29weShhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JfQotCi0JLyoqCi0JICogQ29weSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IHVzaW5nIDxjb2RlPm5ld1VyaTwvY29kZT4gZm9yIHRoZSBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBjcmVhdGVDb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlFdG9vbHNDb3B5VXRpbGl0eSB1dGlsaXR5ID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7Ci0JCXJldHVybiB1dGlsaXR5LmNvcHkoYVJlc291cmNlLCBuZXdVcmkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVEZWZlcnJlZENvcHlBY3Rpb25zKCkgewotCQlpZiAocHJpbUdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBwcmltR2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKS5pdGVyYXRvcigpOwotCQkJRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uIGFjdGlvbjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlhY3Rpb24gPSAoRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uLnBlcmZvcm1BY3Rpb24oKTsKLQkJCX0KLQkJCXByaW1HZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xMy8yMDAwIDk6MTc6MzUgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuSGFzaE1hcAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuSGFzaE1hcCBnZXRDb3BpZWRPYmplY3RzKCkgewotCQlpZiAoY29waWVkT2JqZWN0cyA9PSBudWxsKQotCQkJY29waWVkT2JqZWN0cyA9IG5ldyBIYXNoTWFwKDIwMCk7Ci0JCXJldHVybiBjb3BpZWRPYmplY3RzOwotCX0KLQotCXByb3RlY3RlZCBqYXZhLnV0aWwuSGFzaE1hcCBnZXRDb3BpZWRBZGFwdGVycygpIHsKLQkJaWYgKGNvcGllZEFkYXB0ZXJzID09IG51bGwpCi0JCQljb3BpZWRBZGFwdGVycyA9IG5ldyBIYXNoTWFwKDIwMCk7Ci0JCXJldHVybiBjb3BpZWRBZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjYWNoZWQgY29weS4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5KEVPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKGFuT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSBnZXRDb3BpZWRPYmplY3RzKCkuZ2V0KGFuT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjYWNoZWQgY29weSwgaWYgbm9uZSwgcmV0dXJuIHRoZSBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5SWZGb3VuZChFT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCUVPYmplY3QgY29waWVkID0gZ2V0Q29weShhbk9iamVjdCk7Ci0JCXJldHVybiBjb3BpZWQgPT0gbnVsbCA/IGFuT2JqZWN0IDogY29waWVkOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE2LzIwMDAgOToxMTozMiBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkgewotCQlpZiAoZGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMgPT0gbnVsbCkKLQkJCWRlZmVycmVkUmVmZXJlbmNlQ29waWVzID0gbmV3IEFycmF5TGlzdCgxMDApOwotCQlyZXR1cm4gZGVmZXJyZWRSZWZlcmVuY2VDb3BpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIEVPYmplY3QgdGhhdCBpcyB0aGUgc2FtZSB0eXBlIGFzIDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IG5ld0luc3RhbmNlKEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlpZiAoYVJlZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVQYWNrYWdlIGVwa2cgPSAoRVBhY2thZ2UpIGFSZWZPYmplY3QuZUNsYXNzKCkuZUNvbnRhaW5lcigpOwotCQlFRmFjdG9yeSBmYWN0b3J5ID0gZXBrZy5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCUVDbGFzcyByZWZPYmogPSBhUmVmT2JqZWN0LmVDbGFzcygpOwotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGUocmVmT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgUmVzb3VyY2UgdGhhdCB1c2VzIHRoZSBzYW1lIFJlc291cmNlRmFjdG9yeSBhcyB0aGUgb25lIHVzZWQgYnkKLQkgKiA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+LiBJZiA8Y29kZT5uZXdVcmk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdXNlIHRoZSBVUkkKLQkgKiBmcm9tIDxjb2RlPmFSZXNvdXJjZTwvY29kZT4uCi0JICovCi0JcHVibGljIFJlc291cmNlIG5ld0luc3RhbmNlKFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlpZiAoYVJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgbmV3UmVzb3VyY2U7Ci0JCVN0cmluZyBvcmlnaW5hbFVyaSA9IGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpOwotCQluZXdVcmkgPSBuZXdVcmkgPT0gbnVsbCA/IG9yaWdpbmFsVXJpIDogbmV3VXJpOwotCi0JCVJlc291cmNlLkZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsKQotCQkJZmFjdG9yeSA9IFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShVUkkuY3JlYXRlVVJJKG9yaWdpbmFsVXJpKSk7Ci0JCWVsc2UKLQkJCWZhY3RvcnkgPSBhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSShvcmlnaW5hbFVyaSkpOwotCi0KLQkJbmV3UmVzb3VyY2UgPSBmYWN0b3J5LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkobmV3VXJpKSk7Ci0JCXJldHVybiBuZXdSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIGlkIGJlIGNvcGllZCBpbiB0aGUgY2FzZSB3aGVyZSBubyBzdWZmaXggaXMgc3BlY2lmaWVkPyBEZWZhdWx0cyB0byBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHByZXNlcnZlSWRzKCkgewotCQlyZXR1cm4gcHJlc2VydmVJZHM7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcKLQkgKiBJRHMgb2YgY29waWVkIG9iamVjdHMuIElmIGFuIGlkU3VmZml4IGRvZXMgbm90IGV4aXN0LCBkbyBub3Qgc2V0IGFuIGlkIG9uIHRoZSBjb3BpZWQgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHByaW1Db3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCWlmIChhUmVmT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRU9iamVjdCBjb3B5UmVmID0gcHJpbUNvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCi0JCWNvcHlDdXJyZW50UmVmZXJlbmNlcyhhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCXJldHVybiBjb3B5UmVmOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlIGNvbnRhaW5tZW50Ci0JICogdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nIElEcyBvZgotCSAqIGNvcGllZCBvYmplY3RzLiBJZiBhbiBpZFN1ZmZpeCBkb2VzIG5vdCBleGlzdCwgZG8gbm90IHNldCBhbiBpZCBvbiB0aGUgY29waWVkIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBwcmltQ29weU9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlpZiAoYVJlZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVPYmplY3QgY29weVJlZiA9IG5ld0luc3RhbmNlKGFSZWZPYmplY3QpOwotCi0JCXJlY29yZENvcHkoYVJlZk9iamVjdCwgY29weVJlZik7Ci0JCWNvcHlDdXJyZW50QXR0cmlidXRlcyhhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCWlmIChpc0NvcHlBZGFwdGVycygpKQotCQkJY29weUFkYXB0ZXJzKGFSZWZPYmplY3QsIGNvcHlSZWYpOwotCQlyZXR1cm4gY29weVJlZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5QWRhcHRlcnMoRU9iamVjdCBhUmVmT2JqZWN0LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJTGlzdCBhZGFwdGVycyA9IGFSZWZPYmplY3QuZUFkYXB0ZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5nZXQoaSk7Ci0JCQljb3B5QWRhcHRlcihhUmVmT2JqZWN0LCBjb3B5UmVmLCBhZGFwdGVyKTsKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUFkYXB0ZXIoRU9iamVjdCBhUmVmT2JqZWN0LCBFT2JqZWN0IGNvcHlSZWYsIEFkYXB0ZXIgYWRhcHRlcikgewotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgQ2xvbmVhYmxlUHVibGljKSkKLQkJCXJldHVybjsKLQkJQ2xvbmVhYmxlUHVibGljIGNvcHlBZGFwdGVyID0gKENsb25lYWJsZVB1YmxpYykgZ2V0Q29waWVkQWRhcHRlcnMoKS5nZXQoYWRhcHRlcik7Ci0JCWlmIChjb3B5QWRhcHRlciA9PSBudWxsKSB7Ci0JCQljb3B5QWRhcHRlciA9IChDbG9uZWFibGVQdWJsaWMpICgoQ2xvbmVhYmxlUHVibGljKSBhZGFwdGVyKS5jbG9uZSgpOwotCQkJZ2V0Q29waWVkQWRhcHRlcnMoKS5wdXQoYWRhcHRlciwgY29weUFkYXB0ZXIpOwotCQl9Ci0JCWlmIChjb3B5QWRhcHRlciAhPSBudWxsKQotCQkJY29weVJlZi5lQWRhcHRlcnMoKS5hZGQoY29weUFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYW5kIHJlZmVyZW5jZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlCi0JICogY29udGFpbm1lbnQgdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nCi0JICogSURzIG9mIGNvcGllZCBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBwcmltQ29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJaWYgKGFSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlIGNvcHlSZXNvdXJjZSA9IG5ld0luc3RhbmNlKGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJY29weUV4dGVudChhUmVzb3VyY2UuZ2V0Q29udGVudHMoKSwgY29weVJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQlyZXR1cm4gY29weVJlc291cmNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlNb2RpZmljYXRpb25GbGFnKFJlc291cmNlIGFSZXNvdXJjZSwgUmVzb3VyY2UgY29waWVkKSB7Ci0JCWlmIChhUmVzb3VyY2UuaXNNb2RpZmllZCgpKQotCQkJY29waWVkLnNldE1vZGlmaWVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE2LzIwMDAgOToxMTozMiBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBwcmltR2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKSB7Ci0JCXJldHVybiBkZWZlcnJlZFJlZmVyZW5jZUNvcGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvcmRDb3B5KEVPYmplY3QgYVNvdXJjZSwgRU9iamVjdCBhQ29weSkgewotCQlnZXRDb3BpZWRPYmplY3RzKCkucHV0KGFTb3VyY2UsIGFDb3B5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvcmRDb3B5KEFkYXB0ZXIgYVNvdXJjZSwgQWRhcHRlciBhQ29weSkgewotCQlnZXRDb3BpZWRBZGFwdGVycygpLnB1dChhU291cmNlLCBhQ29weSk7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSBpZCBiZSBjb3BpZWQgaW4gdGhlIGNhc2Ugd2hlcmUgbm8gc3VmZml4IGlzIHNwZWNpZmllZD8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZUlkcyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZXNlcnZlSWRzID0gdmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQ29weVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UpIHsKLQkJcmV0dXJuIGFSZWZlcmVuY2UuaXNDaGFuZ2VhYmxlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29weUFkYXB0ZXJzKCkgewotCQlyZXR1cm4gY29weUFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIGFkYXB0ZXJzIHNob3VsZCBiZSBjb3BpZWQgYXMgd2VsbC4gSW4gb3JkZXIgZm9yIGFuIGFkYXB0ZXIgdG8KLQkgKiBiZSBjb3BpZWQsIGl0IG11c3QgaW1wbGVtZW50IHRoZSB7QGxpbmsgQ2xvbmVhYmxlUHVibGljfWludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5QWRhcHRlcnMoYm9vbGVhbiBiKSB7Ci0JCWNvcHlBZGFwdGVycyA9IGI7Ci0JfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4Y2VwdGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4Y2VwdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDYyOWFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeGNlcHRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLklXRlRXcmFwcGVkRXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGZhY3RvciBjb21tb24gY29kZSBmb3IgaW1wbGVtZW50ZXJzIG9mIElBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGVscGVyIHsKLQotCS8qKgotCSAqIFV0aWxpdHkgY2xhc3M7IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKLQkgKi8KLQlwcml2YXRlIEV4Y2VwdGlvbkhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGFuZAotCSAqICAgICAgICAgICAgICAgIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoSVdGVFdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KDQpOwotCQltZXNzYWdlcy5hZGQoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleGNlcHRpb24uZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCXdoaWxlIChuZXN0ZWQgIT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKG5lc3RlZC5nZXRNZXNzYWdlKCkpOwotCQkJaWYgKG5lc3RlZCBpbnN0YW5jZW9mIElXRlRXcmFwcGVkRXhjZXB0aW9uKQotCQkJCW5lc3RlZCA9ICgoSVdGVFdyYXBwZWRFeGNlcHRpb24pIG5lc3RlZCkuZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCQllbHNlCi0JCQkJbmVzdGVkID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBtZXNzYWdlcy50b0FycmF5KG5ldyBTdHJpbmdbbWVzc2FnZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tCi0JICogCi0JICogQGV4Y2VwdGlvbiBhbmQKLQkgKiAgICAgICAgICAgICAgICBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdCwgY29uY2F0ZW5hdGVkIGFzCi0JICogICAgICAgICAgICAgICAgb25lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoSVdGVFdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCVN0cmluZ1tdIG1lc3NhZ2VzID0gZ2V0QWxsTWVzc2FnZXMoZXhjZXB0aW9uKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigyNTYpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQobWVzc2FnZXNbaV0pOwotCQkJaWYgKGkgPCBtZXNzYWdlcy5sZW5ndGggLSAxKQotCQkJCXNiLmFwcGVuZCgnXG4nKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXh0ZW5kZWRFY29yZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeHRlbmRlZEVjb3JlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWNmOTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeHRlbmRlZEVjb3JlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQmFzaWNOb3RpZmllckltcGwuRUFkYXB0ZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRFY29yZVV0aWwgZXh0ZW5kcyBFY29yZVV0aWwgewotCXByaXZhdGUgc3RhdGljIEZpbGVOb3RGb3VuZERldGVjdG9yIEZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBOQU1FX0FUVFJJQlVURV9TVFJJTkcgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIGludGVyZmFjZSBGaWxlTm90Rm91bmREZXRlY3RvciB7Ci0JCWJvb2xlYW4gaXNGaWxlTm90Rm91bmQoV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWxlTm90Rm91bmREZXRlY3RvcihGaWxlTm90Rm91bmREZXRlY3RvciBkZXRlY3RvcikgewotCQlGSUxFX05PVF9GT1VORF9ERVRFQ1RPUiA9IGRldGVjdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZU5vdEZvdW5kRGV0ZWN0b3IgZ2V0RmlsZU5vdEZvdW5kRGV0ZWN0b3IoKSB7Ci0JCWlmIChGSUxFX05PVF9GT1VORF9ERVRFQ1RPUiA9PSBudWxsKSB7Ci0JCQlGSUxFX05PVF9GT1VORF9ERVRFQ1RPUiA9IG5ldyBGaWxlTm90Rm91bmREZXRlY3RvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0ZpbGVOb3RGb3VuZChXcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCkgewotCQkJCQlpZiAoZ2V0SW5uZXJGaWxlTm90Rm91bmRFeGNlcHRpb24od3JhcHBlZEV4KSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBGSUxFX05PVF9GT1VORF9ERVRFQ1RPUjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBnZXRJbm5lckZpbGVOb3RGb3VuZEV4Y2VwdGlvbihXcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCkgewotCQlpZiAod3JhcHBlZEV4LmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24pIHsKLQkJCXJldHVybiAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uKSB3cmFwcGVkRXguZXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAod3JhcHBlZEV4LmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJcmV0dXJuIGdldElubmVyRmlsZU5vdEZvdW5kRXhjZXB0aW9uKChXcmFwcGVkRXhjZXB0aW9uKSB3cmFwcGVkRXguZXhjZXB0aW9uKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlU2V0T3JBZGQoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJZVNldE9yQWRkKG9iaiwgZmVhdHVyZSwgdmFsdWUsIDApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlU2V0T3JBZGQoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBuZXdJbmRleCkgewotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAobmV3SW5kZXggPj0gMCkKLQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5hZGQobmV3SW5kZXgsIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5hZGQodmFsdWUpOwotCQl9IGVsc2UgewotCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVVbnNldE9yUmVtb3ZlKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwgfHwgZmVhdHVyZS5pc01hbnkoKSkKLQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLnJlbW92ZSh2YWx1ZSk7Ci0JCWVsc2UKLQkJCW9iai5lVW5zZXQoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVuZHNXaXRoKFVSSSBzb3VyY2VVcmksIFVSSSB0ZXN0VXJpKSB7Ci0JCS8vVE9ETyBXYWl0aW5nIG9uIG5ldyBlbWYgVVJJIEFQSQotCQlTdHJpbmdbXSBzb3VyY2VTZWdtZW50cyA9IHNvdXJjZVVyaS5zZWdtZW50cygpOwotCQlTdHJpbmdbXSB0ZXN0U2VnbWVudHMgPSB0ZXN0VXJpLnNlZ21lbnRzKCk7Ci0JCWludCBpID0gdGVzdFNlZ21lbnRzLmxlbmd0aDsKLQkJaW50IGogPSBzb3VyY2VTZWdtZW50cy5sZW5ndGg7Ci0JCWlmIChqID49IGkpIHsKLQkJCWJvb2xlYW4gdGVzdCA9IHRydWU7Ci0KLQkJCXdoaWxlICh0ZXN0ICYmIGkgPiAwKSB7Ci0JCQkJaS0tOwotCQkJCWotLTsKLQkJCQl0ZXN0ID0gdGVzdFNlZ21lbnRzW2ldLmVxdWFscyhzb3VyY2VTZWdtZW50c1tqXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGVzdDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVOYW1lZEVsZW1lbnQpCi0JCQlyZXR1cm4gKChFTmFtZWRFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJTGlzdCBhbGxBdHRzID0gb2JqLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCWludCBzaXplID0gYWxsQXR0cy5zaXplKCk7Ci0JCUVBdHRyaWJ1dGUgYXR0LCBuYW1lQXR0cmlidXRlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWF0dCA9IChFQXR0cmlidXRlKSBhbGxBdHRzLmdldChpKTsKLQkJCWlmIChOQU1FX0FUVFJJQlVURV9TVFJJTkcuZXF1YWxzKGF0dC5nZXROYW1lKCkpKSB7Ci0JCQkJbmFtZUF0dHJpYnV0ZSA9IGF0dDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobmFtZUF0dHJpYnV0ZSAhPSBudWxsKQotCQkJcmV0dXJuIChTdHJpbmcpIG9iai5lR2V0KG5hbWVBdHRyaWJ1dGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgbmVlZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRMb2FkaW5nVGFnKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vcmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKElzTG9hZGluZ0RldGVjdG9yLklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgbmVlZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMb2FkaW5nVGFnKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vcmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKElzTG9hZGluZ0RldGVjdG9yLklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaXMgY3VycmVudGx5IGJlaW5nIGxvYWRlZC4gVGhpcyBpcyBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIGZvciB0aGUKLQkgKiBJc0xvYWRpbmdEZWN0b3IgaW4gdGhlIGxpc3Qgb2YgZUFkYXB0ZXJzIG9uIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiAKLQkgKiBAc2VlIGFkZExvYWRpbmdUYWcoUmVzb3VyY2UpCi0JICogQHNlZSByZW1vdmVMb2FkaW5nVGFnKFJlc291cmNlKQotCSAqICBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFJlc291cmNlLkludGVybmFsI2lzTG9hZGluZygpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvYWRpbmcoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgPyAoKFJlc291cmNlLkludGVybmFsKXJlc291cmNlKS5pc0xvYWRpbmcoKSA6IGZhbHNlOyAKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckZvckxvYWRpbmcoQWRhcHRlciB0YXJnZXRBZGFwdGVyLCBFT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlSZXNvdXJjZSByZXMgPSB0YXJnZXRPYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCB8fCBpc0xvYWRpbmcocmVzKSkKLQkJCXJldHVybiBuZXcgSXNMb2FkaW5nUHJveHlBZGFwdGVyKHRhcmdldEFkYXB0ZXIsIHRhcmdldE9iamVjdCk7Ci0JCXJldHVybiB0YXJnZXRBZGFwdGVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmVSZWdpc3RlclBhY2thZ2UoU3RyaW5nIG5zUHJlZml4LCBFUGFja2FnZS5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKCFFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5jb250YWluc0tleShuc1ByZWZpeCkpCi0JCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQobnNQcmVmaXgsIGRlc2NyaXB0b3IpOwotCX0KLQkvKioKLQkgICAqIFJldHVybnMgdGhlIGFkYXB0ZXIgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIEBwYXJhbSBhbk9iamVjdCAKLQkgICAqIEBwYXJhbSBhZGFwdGVycyBsaXN0IG9mIGFkYXB0ZXJzIHRvIHNlYXJjaC4KLQkgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIGFkYXB0ZXIuCi0JICAgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZnJvbSB0aGUgbGlzdCBvciBudWxsLgotCSAgICovCi0JICBwdWJsaWMgc3RhdGljIEFkYXB0ZXIgZ2V0QWRhcHRlcihFT2JqZWN0IGFuT2JqZWN0LCBMaXN0IGFkYXB0ZXJzLCBPYmplY3QgdHlwZSkgewotCi0JCSAgCU9iamVjdCBbXSBhZGFwdEFycmF5ID0gKChFQWRhcHRlckxpc3QpYWRhcHRlcnMpLmRhdGEoKTsKLQkJICAJaWYgKGFkYXB0QXJyYXkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0QXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgYWRhcHRBcnJheVtpXTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSkgewotCQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhpcyBvYmplY3QgZnJvbSBpdCdzIGNvbnRhaW5lciwgYW5kIG1ha2UgaXQgYW5kIGFsbCBpdCdzIGNoaWxkcmVuCi0JICogcHJveGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmxvYWQoRU9iamVjdCByb290KSB7Ci0JCVJlc291cmNlIHJlcyA9IHJvb3QuZVJlc291cmNlKCk7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gcm9vdC5lQ29udGFpbmVyKCk7Ci0JCS8qIE1ha2luZyBzdXJlIHRoZSBwcm94eSBpcyBjcmVhdGVkIGZpcnN0IGJlZm9yZSB1bmxvYWRpbmcgKi8KLQkJaWYgKHJvb3QgIT0gbnVsbCAmJiByZXMgIT0gbnVsbCkKLQkJCWJlY29tZVByb3h5KHJvb3QsIHJlcyk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQlyZXMuZ2V0Q29udGVudHMoKS5yZW1vdmUocm9vdCk7Ci0JCQllbHNlIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHJvb3QuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQkJCWVVbnNldE9yUmVtb3ZlKGNvbnRhaW5lciwgZmVhdHVyZSwgcm9vdCk7Ci0JCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFR1cm5zIHRoaXMgb2JqZWN0IGFuZCBhbGwgaXQncyBjaGlsZHJlbiB0byBwcm94aWVzLCBhbmQgcmVtb3ZlcyBhZGFwdGVycyBwcmVjb25kaXRpb246IFRoZQotCSAqIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gaXQncyBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmVjb21lUHJveHkoRU9iamVjdCByb290LCBSZXNvdXJjZSByZXMpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHJvb3QuZUFsbENvbnRlbnRzKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJZG9CZWNvbWVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKSwgcmVzKTsKLQkJfQotCQlkb0JlY29tZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHJvb3QsIHJlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRvQmVjb21lUHJveHkoSW50ZXJuYWxFT2JqZWN0IHAsIFJlc291cmNlIHJlcykgewotCQlTdHJpbmcgaWQgPSByZXMuZ2V0VVJJRnJhZ21lbnQocCk7Ci0JCXAuZVNldFByb3h5VVJJKHJlcy5nZXRVUkkoKS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQlpZiAocmVzIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCSgoWE1MUmVzb3VyY2UpIHJlcykuc2V0SUQocCxudWxsKTsKLQkJfQotCQlwLmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByb3h5KEVPYmplY3Qgcm9vdCwgUmVzb3VyY2UgcmVzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByb290LmVBbGxDb250ZW50cygpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWRvUmVtb3ZlUHJveHkoKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCksIHJlcyk7Ci0JCX0KLQkJZG9SZW1vdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSByb290LCByZXMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkb1JlbW92ZVByb3h5KEludGVybmFsRU9iamVjdCBwLCBSZXNvdXJjZSByZXMpIHsKLQkJU3RyaW5nIGlkID0gcC5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwotCQlpZiAocmVzIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCSgoWE1MUmVzb3VyY2UpIHJlcykuc2V0SUQocCwgaWQpOwotCQl9Ci0JCXAuZVNldFByb3h5VVJJKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGUgcGFzc2VkIG9iamVjdCBpcyBub3QgYSBwcm94eTsgaWYgaXQgaXMsIHRocm93cyBhbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGUgYmFkCi0JICogSFJFRi4gSWYgdGhlIG9iamVjdCBpcyBudWxsLCBkb2VzIG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEB0aHJvd3MgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrUHJveHkoRU9iamVjdCBvYmplY3QpIHRocm93cyBEYW5nbGluZ0hSRUZFeGNlcHRpb24gewotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgIW9iamVjdC5lSXNQcm94eSgpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbXNnID0gV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkRBTkdMSU5HX0hSRUZfRVJST1JfLCBuZXcgT2JqZWN0W117KChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCkuZVByb3h5VVJJKCl9KTsKLQkJdGhyb3cgbmV3IERhbmdsaW5nSFJFRkV4Y2VwdGlvbihtc2cpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIG8xIGFuZCBvMiBhcmUgbm90IHRoZSBzYW1lIHZhbHVlcy4gVGhpcyBpbXBsZW1lbnRhdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgdGhhdAotCSAqIGVpdGhlciBwYXJhbWV0ZXIgY2FuIGJlIG51bGwuCi0JICogCi0JICogQHBhcmFtIG8xCi0JICogQHBhcmFtIG8yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWx1ZUNoYW5nZWQoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJcmV0dXJuIChvMSA9PSBudWxsIF4gbzIgPT0gbnVsbCkgfHwgKG8xID09IG51bGwgfHwgIW8xLmVxdWFscyhvMikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9GZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjVhMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uCi0JICovCi0JcHVibGljIEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmE2ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzEwLzIwMDEgMjo0Njo1NCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVWYWx1ZUNvbnZlcnRlciB7Ci0Jc3RhdGljIGZpbmFsIEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBERUZBVUxUID0gbmV3IERlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIHRoZSB0eXBlIG9mCi0JICogQGFGZWF0dXJlLgotCSAqLwotCU9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGFWYWx1ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ4MTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgSm9obiBNb3VycmEKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbWFuZCB7Ci0KLQkvKgotCSAqIFRoaXMgd2lsbCBjb250YWluIHRoZSBtdWx0aS1zZWxlY3Rpb24gb2Ygb2JqZWN0cyB0byBkZXBsb3kuIFRoaXMgc2VsZWN0aW9uIGNvdWxkIGJlIHVzZWQgdG8KLQkgKiBmaWx0ZXIgZWxlbWVudHMgd2l0aGluIGEgTW9kdWxlLiBBbnkgb3RoZXIgc2V0dXAgY29kZSBzaG91bGQgYmUgZG9uZSBoZXJlLi4uCi0JICovCi0Jdm9pZCBpbml0KE9iamVjdFtdIHNlbGVjdGlvbik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElSZXNvdXJjZSByZXNvdXJjZSwgSVJlc291cmNlRGVsdGEgZGVsdGEsIElDb21tYW5kQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjQyNzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogQGF1dGhvciBKb2huIE1vdXJyYQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tYW5kQ29udGV4dCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcCBnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lEVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lEVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODg5ODZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JRFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgSURVdGlsIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgdG8gYXNzaWduIGEgdW5pcXVlIElEIHRvIHRoZSBvYmplY3QuIFRoZSBvYmplY3QgbXVzdCBiZSBjb250YWluZWQgaW4gYQotCSAqIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NpZ25JRChFT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZSBhUmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkKLQkJCWFzc2lnbklEKG9iamVjdCwgKFhNTFJlc291cmNlKSBhUmVzb3VyY2UpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3JBc3NpZ25JRChFT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZSBhUmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkKLQkJCXJldHVybiBnZXRPckFzc2lnbklEKG9iamVjdCwgKFhNTFJlc291cmNlKSBhUmVzb3VyY2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPckFzc2lnbklEKEVPYmplY3Qgb2JqZWN0LCBYTUxSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJU3RyaW5nIGlkID0gYVJlc291cmNlLmdldElEKG9iamVjdCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIGFzc2lnbklEKG9iamVjdCwgYVJlc291cmNlKTsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzc2lnbklEKEVPYmplY3Qgb2JqZWN0LCBYTUxSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRCYXNlSURGb3JBc3NpZ25tZW50KG9iamVjdCk7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGlkID0gZW5zdXJlVW5pcXVlSUQoYVJlc291cmNlLCBuYW1lKTsKLQkJYVJlc291cmNlLnNldElEKG9iamVjdCwgaWQpOwotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZW5zdXJlVW5pcXVlSUQoWE1MUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgYmFzZUlETmFtZSkgewotCQliYXNlSUROYW1lICs9ICJfIjsgLy8kTk9OLU5MUy0xJAotCQkvL0NoYW5nZSB0byB1c2UgdGhlIGN1cnJlbnQgdGltZSBpbnN0ZWFkIG9mIGluY3JlbWVudGFsIG51bWJlcnMgdG8gaGVscAotCQkvL3N1cHBvcnQgdGVhbSBkZXZlbG9wbWVudC4KLQkJbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlTdHJpbmcgaWQgPSBiYXNlSUROYW1lICsgY3VycmVudFRpbWU7Ci0JCXdoaWxlIChhUmVzb3VyY2UuZ2V0RU9iamVjdChpZCkgIT0gbnVsbCkgewotCQkJKytjdXJyZW50VGltZTsKLQkJCWlkID0gYmFzZUlETmFtZSArIGN1cnJlbnRUaW1lOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRCYXNlSURGb3JBc3NpZ25tZW50KEVPYmplY3Qgb2JqZWN0KSB7Ci0JCUVDbGFzcyBtZXRhTyA9IG9iamVjdC5lQ2xhc3MoKTsKLQkJcmV0dXJuIG1ldGFPLmdldE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmNTEzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vc2VyRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTY4MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vc2VyRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24gZXh0ZW5kcyBVc2VyRXhjZXB0aW9uIHsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4ODJkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIFVzZXJFeGNlcHRpb24gewotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nRGV0ZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2QxMTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZQotICogYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLQotcHVibGljIGNsYXNzIElzTG9hZGluZ0RldGVjdG9yIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJc0xvYWRpbmdEZXRlY3RvciBJTlNUQU5DRSA9IG5ldyBJc0xvYWRpbmdEZXRlY3RvcigpOwotCi0JcHJpdmF0ZSBJc0xvYWRpbmdEZXRlY3RvcigpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQl9Ci0KLQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSB0aGlzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nUHJveHlBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nUHJveHlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NWI4NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lzTG9hZGluZ1Byb3h5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIElzTG9hZGluZ1Byb3h5QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgQWRhcHRlciB0YXJnZXRBZGFwdGVyOwotCXByaXZhdGUgRU9iamVjdCB0YXJnZXRPYmplY3Q7Ci0KLQlwdWJsaWMgSXNMb2FkaW5nUHJveHlBZGFwdGVyKEFkYXB0ZXIgYVRhcmdldEFkYXB0ZXIsIEVPYmplY3QgYVRhcmdldE9iamVjdCkgewotCQl0YXJnZXRBZGFwdGVyID0gYVRhcmdldEFkYXB0ZXI7Ci0JCXRhcmdldE9iamVjdCA9IGFUYXJnZXRPYmplY3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJLy9saXN0ZW4gZm9yIHRoZSByZW1vdmUgb2YgdGhlIGxvYWRpbmcgYWRhcHRlcgotCQkJaWYgKG1zZy5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCAmJiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCkgewotCQkJCXJlbW92ZVByb3h5U3VwcG9ydCgpOwotCQkJCXJlc2V0KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2FjaGVSZXNvdXJjZSgpKSB7Ci0JCQl0YXJnZXRBZGFwdGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCXJlc2V0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgcmVzb3VyY2UgdmFyaWFibGUgYW5kIHJldHVybiB0cnVlIGlmIHdlIHJlbW92ZWQgdGhlIHByb3h5IHN1cHBvcnQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhY2hlUmVzb3VyY2UoKSB7Ci0JCWlmIChnZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZ2V0VGFyZ2V0KCk7Ci0JCQlyZXNvdXJjZSA9IGVPYmouZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCWVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCWlmIChFeHRlbmRlZEVjb3JlVXRpbC5pc0xvYWRpbmcocmVzb3VyY2UpKQotCQkJCQlyZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXRhcmdldE9iamVjdC5lQWRhcHRlcnMoKS5hZGQodGFyZ2V0QWRhcHRlcik7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVQcm94eVN1cHBvcnQoKSB7Ci0JCWdldFRhcmdldCgpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJdGFyZ2V0T2JqZWN0LmVBZGFwdGVycygpLmFkZCh0YXJnZXRBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCXJlc291cmNlID0gbnVsbDsKLQkJdGFyZ2V0QWRhcHRlciA9IG51bGw7Ci0JCXRhcmdldE9iamVjdCA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNGE3MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDIwLCAyMDAzCi0gKiAgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2UgewotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7Ci0JcHJvdGVjdGVkIFN0cmluZyBuc1VSSTsKLQotCi0JcHVibGljIE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl0aGlzLm5zVVJJID0gdXJpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TnNVUkkoKSB7Ci0JCXJldHVybiBuc1VSSTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROc1VSSShTdHJpbmcgc3RyaW5nKSB7Ci0JCW5zVVJJID0gc3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgc3RyaW5nKSB7Ci0JCXByZWZpeCA9IHN0cmluZzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZGFjNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDIwLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJ1Y3R1cmFsRmVhdHVyZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MgdXNlZCB0byBob2xkIG5hbWVzcGFjZXMgcGFyc2VkIGZyb20gYW4gWE1MIGZpbGUgdXNpbmcgdGhlIHhtbG5zOnByZWZpeD0iYVVSSSIKLSAqIHN5bnRheAotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQ2xvbmVhYmxlUHVibGljIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFEQVBURVJfVFlQRSA9IE5hbWVzcGFjZUFkYXB0ZXIuY2xhc3MuZ2V0TmFtZSgpOwotCXByb3RlY3RlZCBNYXAgcHJlZml4ZXNUb05TOwotCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZXM7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBOT1RJRklDQVRJT05fRkVBVFVSRSA9IG5ldyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsKCkgewotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3RpZmljYXRpb24gZXh0ZW5kcyBOb3RpZmljYXRpb25JbXBsIHsKLQotCQkvKioKLQkJICogQHBhcmFtIGV2ZW50VHlwZQotCQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkJICogQHBhcmFtIG5ld1ZhbHVlCi0JCSAqLwotCQlwdWJsaWMgTm90aWZpY2F0aW9uKGludCBldmVudFR5cGUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcihldmVudFR5cGUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXRGZWF0dXJlKCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZSgpIHsKLQkJCXJldHVybiBOT1RJRklDQVRJT05fRkVBVFVSRTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBOYW1lc3BhY2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgRU9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOYW1lc3BhY2VBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iaik7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLmFkZE5hbWVzcGFjZShwcmVmaXgsIHVyaSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKG9iaik7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLnJlbW92ZU5hbWVzcGFjZShwcmVmaXgpOwotCX0KLQotCS8qKgotCSAqIEZhY2FkZSBtZXRob2QgZm9yIHJlc29sdmluZyBwcmVmaXhlcyB0byBhbiBhY3R1YWwgbmFtZXNwYWNlIFVSSS4gVXNlZCBmb3Igb2JqZWN0cyBjb250YWluZWQKLQkgKiBieSBpbnN0YW5jZXMgb2Yge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlfS4gV2Fsa3MgdXAgdGhlIG9iamVjdAotCSAqIGNvbnRhaW5tZW50IHBhdGggdW50aWwgYSBuYW1lc3BhY2UgaXMgZm91bmQsIG9yIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4LCBFT2JqZWN0IG9iaikgewotCQlpZiAocHJlZml4ID09IG51bGwgfHwgb2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRU9iamVjdCBjb250YWluZXIgPSBvYmo7Ci0JCVN0cmluZyBuc1VSSTsKLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQluc1VSSSA9IGdldE5hbWVzcGFjZVVSSUF0VGhpc0xldmVsKHByZWZpeCwgY29udGFpbmVyKTsKLQkJCWlmIChuc1VSSSAhPSBudWxsKQotCQkJCXJldHVybiBuc1VSSTsKLQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJQXRUaGlzTGV2ZWwoU3RyaW5nIHByZWZpeCwgRU9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKG9iaik7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBudWxsIDogYWRhcHRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TmFtZXNwYWNlcyhFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IG51bGwgOiBhZGFwdGVyLmdldE5hbWVzcGFjZXMoKTsKLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTmFtZXNwYWNlQWRhcHRlciByZXRyaWV2ZUV4aXN0aW5nQWRhcHRlcihFT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKE5hbWVzcGFjZUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIob2JqLCBBREFQVEVSX1RZUEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTmFtZXNwYWNlQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKG9iaik7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBjcmVhdGVBZGFwdGVyKG9iaikgOiBhZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTmFtZXNwYWNlQWRhcHRlciBjcmVhdGVBZGFwdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBOYW1lc3BhY2VBZGFwdGVyKCk7Ci0JCWFkYXB0ZXIuc2V0VGFyZ2V0KG9iaik7Ci0JCW9iai5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCU5hbWVzcGFjZSBucyA9IG5ldyBOYW1lc3BhY2UocHJlZml4LCB1cmkpOwotCQlpZiAobmFtZXNwYWNlcyA9PSBudWxsKQotCQkJbmFtZXNwYWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByZWZpeGVzVG9OUyA9PSBudWxsKQotCQkJcHJlZml4ZXNUb05TID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwcmVmaXhlc1RvTlMucHV0KHByZWZpeCwgbnMpOwotCQluYW1lc3BhY2VzLmFkZChucyk7Ci0JCWZpcmVOb3RpZmljYXRpb24ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLkFERCwgbnVsbCwgbnMpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpIHsKLQkJTmFtZXNwYWNlIG5zID0gbnVsbDsKLQkJaWYgKHByZWZpeGVzVG9OUyAhPSBudWxsKQotCQkJbnMgPSAoTmFtZXNwYWNlKSBwcmVmaXhlc1RvTlMuZ2V0KHByZWZpeCk7Ci0KLQkJaWYgKG5zICE9IG51bGwpCi0JCQluYW1lc3BhY2VzLnJlbW92ZShucyk7Ci0JCWZpcmVOb3RpZmljYXRpb24ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlJFTU9WRSwgbnMsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKHByZWZpeGVzVG9OUyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5hbWVzcGFjZSBucyA9IChOYW1lc3BhY2UpIHByZWZpeGVzVG9OUy5nZXQocHJlZml4KTsKLQkJaWYgKG5zICE9IG51bGwpCi0JCQlyZXR1cm4gbnMuZ2V0TnNVUkkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBBREFQVEVSX1RZUEUuZXF1YWxzKHR5cGUpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZXMoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VzID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuYW1lc3BhY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTm90aWZpY2F0aW9uKGludCB0eXBlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQl0YXJnZXQuZU5vdGlmeShuZXcgTm90aWZpY2F0aW9uKHR5cGUsIG9sZFZhbHVlLCBuZXdWYWx1ZSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05hbWVzcGFjZXMoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VzICE9IG51bGwgJiYgIW5hbWVzcGFjZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLmVjb3JlLnV0aWxpdGllcy5DbG9uZWFibGVQdWJsaWMjY2xvbmUoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgcmVzdWx0ID0gbmV3IE5hbWVzcGFjZUFkYXB0ZXIoKTsKLQkJaWYgKGhhc05hbWVzcGFjZXMoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJTmFtZXNwYWNlIG5zID0gKE5hbWVzcGFjZSkgbmFtZXNwYWNlcy5nZXQoaSk7Ci0JCQkJcmVzdWx0LmFkZE5hbWVzcGFjZShucy5nZXRQcmVmaXgoKSwgbnMuZ2V0TnNVUkkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzdGhydUVuY29kZXJEZWNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3RocnVFbmNvZGVyRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjg0MDU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzdGhydUVuY29kZXJEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLS8qKgotICogQSBwYXNzdGhydSBFbmNvZGVyRGVjb2RlciBpbXBsZW1lbnRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgUGFzc3RocnVFbmNvZGVyRGVjb2RlciBleHRlbmRzIEVuY29kZXJEZWNvZGVyQWRhcHRlciBpbXBsZW1lbnRzIEVuY29kZXJEZWNvZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhc3N0aHJ1RW5jb2RlckRlY29kZXIgSU5TVEFOQ0UgPSBuZXcgUGFzc3RocnVFbmNvZGVyRGVjb2RlcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IFBhc3N0aHJ1RW5jb2RlckRlY29kZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogRW5jb2RlckRlY29kZXJBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBQYXNzdGhydUVuY29kZXJEZWNvZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZENpcGhlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZENpcGhlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNzE1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRDaXBoZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIFBhc3N3b3JkQ2lwaGVyVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TW10gPSB7InhvciJ9OyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXNbXTsKLQotCXB1YmxpYyBQYXNzd29yZENpcGhlclV0aWwoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBieXRlW10gZGVjaXBoZXIoYnl0ZSBhYnl0ZTBbXSwgU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCQlieXRlIGFieXRlMVtdID0gbnVsbDsKLQkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1swXSkpCi0JCQlhYnl0ZTEgPSB4b3IoYWJ5dGUwKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGFieXRlMSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbigpOwotCi0JCXJldHVybiBhYnl0ZTE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBieXRlW10gZW5jaXBoZXIoYnl0ZSBhYnl0ZTBbXSwgU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCQlieXRlIGFieXRlMVtdID0gbnVsbDsKLQkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1swXSkpCi0JCQlhYnl0ZTEgPSB4b3IoYWJ5dGUwKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGFieXRlMSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbigpOwotCQlyZXR1cm4gYWJ5dGUxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtcygpIHsKLQkJcmV0dXJuIF9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHhvcihieXRlIGFieXRlMFtdKSB7Ci0JCWJ5dGUgYWJ5dGUxW10gPSBudWxsOwotCQlpZiAoYWJ5dGUwICE9IG51bGwpIHsKLQkJCWFieXRlMSA9IG5ldyBieXRlW2FieXRlMC5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhYnl0ZTAubGVuZ3RoOyBpKyspCi0JCQkJYWJ5dGUxW2ldID0gKGJ5dGUpICgweDVmIF4gYWJ5dGUwW2ldKTsKLQkJfQotCQlyZXR1cm4gYWJ5dGUxOwotCX0KLQotCXN0YXRpYyB7Ci0JCV9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXMgPSBudWxsOwotCQlpZiAoX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtcyA9PSBudWxsKQotCQkJX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtcyA9IERFRkFVTFRfU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRFbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkRW5jb2RlckRlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4MmNlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBQYXNzd29yZEVuY29kZXJEZWNvZGVyIGV4dGVuZHMgRW5jb2RlckRlY29kZXJBZGFwdGVyIGltcGxlbWVudHMgRW5jb2RlckRlY29kZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJwYXNzd29yZC1zZWN1cml0eS1jb2RlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBQYXNzd29yZEVuY29kZXJEZWNvZGVyKCkgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB7Ci0JCXJldHVybiBQYXNzd29yZFV0aWwucGFzc3dvcmREZWNvZGUocyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIFBhc3N3b3JkVXRpbC5wYXNzd29yZEVuY29kZShzKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJcmV0dXJuIEtFWTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTJmMmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUGFzc3dvcmRVdGlsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfQ09OVkVSU0lPTl9DT0RFID0gIlVURjgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWV9CWVRFX0FSUkFZID0gbmV3IGJ5dGVbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DUllQVE9fQUxHT1JJVEhNOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVNbXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEJBU0U2NF9FTkNPREVfTUFQW107Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBCQVNFNjRfREVDT0RFX01BUFtdOwotCi0JcHVibGljIFBhc3N3b3JkVXRpbCgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gewotCQlpZiAocyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uKCk7Ci0JCVN0cmluZyBzMSA9IGdldENyeXB0b0FsZ29yaXRobShzKTsKLQkJaWYgKHMxID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24oKTsKLQotCQlpZiAoIWlzVmFsaWRDcnlwdG9BbGdvcml0aG0oczEpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0KLQkJU3RyaW5nIHMyID0gZGVjb2RlX3Bhc3N3b3JkKHJlbW92ZUNyeXB0b0FsZ29yaXRobVRhZyhzKSwgczEpOwotCQlpZiAoczIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gczI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSB0aHJvd3MgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGVuY29kZShzLCBERUZBVUxUX0NSWVBUT19BTEdPUklUSE0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcywgU3RyaW5nIHMxKSB0aHJvd3MgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKHMxKSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCQlpZiAocyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGdldENyeXB0b0FsZ29yaXRobShzKSAhPSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uKCk7Ci0KLQkJU3RyaW5nIHMyID0gZW5jb2RlX3Bhc3N3b3JkKHMudHJpbSgpLCBzMS50cmltKCkpOwotCQlpZiAoczIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gczI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3J5cHRvQWxnb3JpdGhtKFN0cmluZyBzKSB7Ci0JCVN0cmluZyBzMSA9IG51bGw7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCXMgPSBzLnRyaW0oKTsKLQkJCWlmIChzLmxlbmd0aCgpID49IDIpIHsKLQkJCQlpbnQgaSA9IHMuaW5kZXhPZigieyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQlpbnQgaiA9IHMuaW5kZXhPZigifSIsICsraSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGogPiAwKQotCQkJCQkJaWYgKGkgPCBqKQotCQkJCQkJCXMxID0gcy5zdWJzdHJpbmcoaSwgaikudHJpbSgpOwotCQkJCQkJZWxzZQotCQkJCQkJCXMxID0gRU1QVFlfU1RSSU5HOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gczE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3J5cHRvQWxnb3JpdGhtVGFnKFN0cmluZyBzKSB7Ci0JCVN0cmluZyBzMSA9IG51bGw7Ci0JCVN0cmluZyBzMiA9IGdldENyeXB0b0FsZ29yaXRobShzKTsKLQkJaWYgKHMyICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJpbmdidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzMi5sZW5ndGgoKSA+IDApCi0JCQkJc3RyaW5nYnVmZmVyLmFwcGVuZChzMik7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXMxID0gc3RyaW5nYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHMxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKFN0cmluZyBzKSB7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCXMgPSBzLnRyaW0oKTsKLQkJCWlmIChzLmxlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IFNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNUy5sZW5ndGg7IGkrKykKLQkJCQlpZiAocy5lcXVhbHNJZ25vcmVDYXNlKFNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1tpXSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENyeXB0b0FsZ29yaXRobVRhZyhTdHJpbmcgcykgewotCQlyZXR1cm4gaXNWYWxpZENyeXB0b0FsZ29yaXRobShnZXRDcnlwdG9BbGdvcml0aG0ocykpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3N3b3JkRGVjb2RlKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHMxID0gZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpOwotCQlpZiAoczEgPT0gbnVsbCkKLQkJCXJldHVybiBzOwotCQlpZiAoIWlzVmFsaWRDcnlwdG9BbGdvcml0aG0oczEpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkZWNvZGVfcGFzc3dvcmQocmVtb3ZlQ3J5cHRvQWxnb3JpdGhtVGFnKHMpLCBzMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzc3dvcmRFbmNvZGUoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIHBhc3N3b3JkRW5jb2RlKHMsIERFRkFVTFRfQ1JZUFRPX0FMR09SSVRITSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzc3dvcmRFbmNvZGUoU3RyaW5nIHMsIFN0cmluZyBzMSkgewotCQlpZiAoIWlzVmFsaWRDcnlwdG9BbGdvcml0aG0oczEpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHMyID0gZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpOwotCQlpZiAoczIgIT0gbnVsbCkgewotCQkJaWYgKHMyLmVxdWFsc0lnbm9yZUNhc2UoczEudHJpbSgpKSkKLQkJCQlyZXR1cm4gcy50cmltKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jb2RlX3Bhc3N3b3JkKHMudHJpbSgpLCBzMS50cmltKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUNyeXB0b0FsZ29yaXRobVRhZyhTdHJpbmcgcykgewotCQlTdHJpbmcgczEgPSBudWxsOwotCQlpZiAocyAhPSBudWxsKSB7Ci0JCQlzID0gcy50cmltKCk7Ci0JCQlpZiAocy5sZW5ndGgoKSA+PSAyKSB7Ci0JCQkJaW50IGkgPSBzLmluZGV4T2YoInsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpID09IDApIHsKLQkJCQkJaW50IGogPSBzLmluZGV4T2YoIn0iLCArK2kpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChqID4gMCkKLQkJCQkJCWlmICgrK2ogPCBzLmxlbmd0aCgpKQotCQkJCQkJCXMxID0gcy5zdWJzdHJpbmcoaikudHJpbSgpOwotCQkJCQkJZWxzZQotCQkJCQkJCXMxID0gRU1QVFlfU1RSSU5HOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gczE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbnZlcnRfdG9fYnl0ZXMoU3RyaW5nIHMpIHsKLQkJYnl0ZSBhYnl0ZTBbXSA9IG51bGw7Ci0JCWlmIChzICE9IG51bGwpCi0JCQlpZiAocy5sZW5ndGgoKSA9PSAwKQotCQkJCWFieXRlMCA9IEVNUFRZX0JZVEVfQVJSQVk7Ci0JCQllbHNlCi0JCQkJdHJ5IHsKLQkJCQkJYWJ5dGUwID0gcy5nZXRCeXRlcyhTVFJJTkdfQ09OVkVSU0lPTl9DT0RFKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVuc3VwcG9ydGVkZW5jb2RpbmdleGNlcHRpb24pIHsKLQkJCQkJYWJ5dGUwID0gbnVsbDsKLQkJCQl9Ci0JCXJldHVybiBhYnl0ZTA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRfdG9fc3RyaW5nKGJ5dGUgYWJ5dGUwW10pIHsKLQkJU3RyaW5nIHMgPSBudWxsOwotCQlpZiAoYWJ5dGUwICE9IG51bGwpCi0JCQlpZiAoYWJ5dGUwLmxlbmd0aCA9PSAwKQotCQkJCXMgPSBFTVBUWV9TVFJJTkc7Ci0JCQllbHNlCi0JCQkJdHJ5IHsKLQkJCQkJcyA9IG5ldyBTdHJpbmcoYWJ5dGUwLCBTVFJJTkdfQ09OVkVSU0lPTl9DT0RFKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVuc3VwcG9ydGVkZW5jb2RpbmdleGNlcHRpb24pIHsKLQkJCQkJcyA9IG51bGw7Ci0JCQkJfQotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gY29udmVydF92aWV3YWJsZV90b19ieXRlcyhTdHJpbmcgcykgewotCQlieXRlIGFieXRlMFtdID0gbnVsbDsKLQkJaWYgKHMgIT0gbnVsbCkKLQkJCWlmIChzLmxlbmd0aCgpID09IDApCi0JCQkJYWJ5dGUwID0gRU1QVFlfQllURV9BUlJBWTsKLQkJCWVsc2UKLQkJCQl0cnkgewotCQkJCQlhYnl0ZTAgPSBiYXNlNjREZWNvZGUoY29udmVydF90b19ieXRlcyhzKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlhYnl0ZTAgPSBudWxsOwotCQkJCX0KLQkJcmV0dXJuIGFieXRlMDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYmFzZTY0RGVjb2RlKGJ5dGUgYWJ5dGUwW10pIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IGFieXRlMC5sZW5ndGg7IGFieXRlMFstLWldID09IDYxOyk7Ci0JCWJ5dGUgYWJ5dGUxW10gPSBuZXcgYnl0ZVsoaSArIDEpIC0gYWJ5dGUwLmxlbmd0aCAvIDRdOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGFieXRlMC5sZW5ndGg7IGorKykKLQkJCWFieXRlMFtqXSA9IEJBU0U2NF9ERUNPREVfTUFQW2FieXRlMFtqXV07Ci0JCWludCBrID0gYWJ5dGUxLmxlbmd0aCAtIDI7Ci0JCWludCBsID0gMDsKLQkJaW50IGkxOwotCQlmb3IgKGkxID0gMDsgbCA8IGs7IGkxICs9IDQpIHsKLQkJCWFieXRlMVtsXSA9IChieXRlKSAoYWJ5dGUwW2kxXSA8PCAyICYgMHhmZiB8IGFieXRlMFtpMSArIDFdID4+PiA0ICYgMHgzKTsKLQkJCWFieXRlMVtsICsgMV0gPSAoYnl0ZSkgKGFieXRlMFtpMSArIDFdIDw8IDQgJiAweGZmIHwgYWJ5dGUwW2kxICsgMl0gPj4+IDIgJiAweGYpOwotCQkJYWJ5dGUxW2wgKyAyXSA9IChieXRlKSAoYWJ5dGUwW2kxICsgMl0gPDwgNiAmIDB4ZmYgfCBhYnl0ZTBbaTEgKyAzXSAmIDB4M2YpOwotCQkJbCArPSAzOwotCQl9Ci0JCWlmIChsIDwgYWJ5dGUxLmxlbmd0aCkgewotCQkJYWJ5dGUxW2wrK10gPSAoYnl0ZSkgKGFieXRlMFtpMV0gPDwgMiAmIDB4ZmYgfCBhYnl0ZTBbaTEgKyAxXSA+Pj4gNCAmIDB4Myk7Ci0JCQlpZiAobCA8IGFieXRlMS5sZW5ndGgpCi0JCQkJYWJ5dGUxW2xdID0gKGJ5dGUpIChhYnl0ZTBbaTEgKyAxXSA8PCA0ICYgMHhmZiB8IGFieXRlMFtpMSArIDJdID4+PiAyICYgMHhmKTsKLQkJfQotCQlyZXR1cm4gYWJ5dGUxOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0X3ZpZXdhYmxlX3RvX3N0cmluZyhieXRlIGFieXRlMFtdKSB7Ci0JCVN0cmluZyBzID0gbnVsbDsKLQkJaWYgKGFieXRlMCAhPSBudWxsKQotCQkJaWYgKGFieXRlMC5sZW5ndGggPT0gMCkKLQkJCQlzID0gRU1QVFlfU1RSSU5HOwotCQkJZWxzZQotCQkJCXRyeSB7Ci0JCQkJCXMgPSBjb252ZXJ0X3RvX3N0cmluZyhiYXNlNjRFbmNvZGUoYWJ5dGUwKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlzID0gbnVsbDsKLQkJCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiYXNlNjRFbmNvZGUoYnl0ZSBhYnl0ZTBbXSkgewotCQlieXRlIGFieXRlMVtdID0gbmV3IGJ5dGVbKChhYnl0ZTAubGVuZ3RoICsgMikgLyAzKSAqIDRdOwotCQlpbnQgaSA9IDA7Ci0JCWludCBqID0gMDsKLQkJZm9yICg7IGkgPCBhYnl0ZTAubGVuZ3RoIC0gMjsgaSArPSAzKSB7Ci0JCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpXSA+Pj4gMiAmIDB4M2ZdOwotCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDFdID4+PiA0ICYgMHhmIHwgYWJ5dGUwW2ldIDw8IDQgJiAweDNmXTsKLQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2kgKyAyXSA+Pj4gNiAmIDB4MyB8IGFieXRlMFtpICsgMV0gPDwgMiAmIDB4M2ZdOwotCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDJdICYgMHgzZl07Ci0JCX0KLQkJaWYgKGkgPCBhYnl0ZTAubGVuZ3RoKSB7Ci0JCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpXSA+Pj4gMiAmIDB4M2ZdOwotCQkJaWYgKGkgPCBhYnl0ZTAubGVuZ3RoIC0gMSkgewotCQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2kgKyAxXSA+Pj4gNCAmIDB4ZiB8IGFieXRlMFtpXSA8PCA0ICYgMHgzZl07Ci0JCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDFdIDw8IDIgJiAweDNmXTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaV0gPDwgNCAmIDB4M2ZdOwotCQkJfQotCQl9Ci0JCWZvciAoOyBqIDwgYWJ5dGUxLmxlbmd0aDsgaisrKQotCQkJYWJ5dGUxW2pdID0gNjE7Ci0JCXJldHVybiBhYnl0ZTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZV9wYXNzd29yZChTdHJpbmcgcywgU3RyaW5nIHMxKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJpbmdidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChzMS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIHMyID0gbnVsbDsKLQkJCWlmIChzLmxlbmd0aCgpID4gMCkgewotCQkJCWJ5dGUgYWJ5dGUwW10gPSBjb252ZXJ0X3ZpZXdhYmxlX3RvX2J5dGVzKHMpOwotCQkJCWlmIChhYnl0ZTAgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJaWYgKGFieXRlMC5sZW5ndGggPiAwKSB7Ci0JCQkJCWJ5dGUgYWJ5dGUxW10gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJYWJ5dGUxID0gUGFzc3dvcmRDaXBoZXJVdGlsLmRlY2lwaGVyKGFieXRlMCwgczEpOwotCQkJCQl9IGNhdGNoIChJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24gaW52YWxpZHBhc3N3b3JkY2lwaGVyZXhjZXB0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gdW5zdXBwb3J0ZWRjcnlwdG9hbGdvcml0aG1leGNlcHRpb24pIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCWlmIChhYnl0ZTEgIT0gbnVsbCAmJiBhYnl0ZTEubGVuZ3RoID4gMCkKLQkJCQkJCXMyID0gY29udmVydF90b19zdHJpbmcoYWJ5dGUxKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoczIgIT0gbnVsbCAmJiBzMi5sZW5ndGgoKSA+IDApCi0JCQkJc3RyaW5nYnVmZmVyLmFwcGVuZChzMik7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ2J1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGVfcGFzc3dvcmQoU3RyaW5nIHMsIFN0cmluZyBzMSkgewotCQlTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigieyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzMS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKCJ9IikuYXBwZW5kKHMpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMxKS5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHMyID0gbnVsbDsKLQkJCWlmIChzLmxlbmd0aCgpID4gMCkgewotCQkJCWJ5dGUgYWJ5dGUwW10gPSBjb252ZXJ0X3RvX2J5dGVzKHMpOwotCQkJCWlmIChhYnl0ZTAubGVuZ3RoID4gMCkgewotCQkJCQlieXRlIGFieXRlMVtdID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFieXRlMSA9IFBhc3N3b3JkQ2lwaGVyVXRpbC5lbmNpcGhlcihhYnl0ZTAsIHMxKTsKLQkJCQkJfSBjYXRjaCAoSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uIGludmFsaWRwYXNzd29yZGNpcGhlcmV4Y2VwdGlvbikgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHVuc3VwcG9ydGVkY3J5cHRvYWxnb3JpdGhtZXhjZXB0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQlpZiAoYWJ5dGUxICE9IG51bGwgJiYgYWJ5dGUxLmxlbmd0aCA+IDApIHsKLQkJCQkJCXMyID0gY29udmVydF92aWV3YWJsZV90b19zdHJpbmcoYWJ5dGUxKTsKLQkJCQkJCWlmIChzMiA9PSBudWxsKQotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHMyICE9IG51bGwgJiYgczIubGVuZ3RoKCkgPiAwKQotCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoczIpOwotCQl9Ci0JCXJldHVybiBzdHJpbmdidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlzdGF0aWMgewotCQlTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVMgPSBQYXNzd29yZENpcGhlclV0aWwuZ2V0U3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtcygpOwotCQlERUZBVUxUX0NSWVBUT19BTEdPUklUSE0gPSBTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVNbMF07Ci0JCWJ5dGUgYWJ5dGUwW10gPSB7NjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDQzLCA0N307Ci0JCUJBU0U2NF9FTkNPREVfTUFQID0gYWJ5dGUwOwotCQlCQVNFNjRfREVDT0RFX01BUCA9IG5ldyBieXRlWzEyOF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgQkFTRTY0X0RFQ09ERV9NQVAubGVuZ3RoOyBpKyspCi0JCQlCQVNFNjRfREVDT0RFX01BUFtpXSA9IC0xOwotCQlmb3IgKGludCBqID0gMDsgaiA8IEJBU0U2NF9FTkNPREVfTUFQLmxlbmd0aDsgaisrKQotCQkJQkFTRTY0X0RFQ09ERV9NQVBbQkFTRTY0X0VOQ09ERV9NQVBbal1dID0gKGJ5dGUpIGo7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1BsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTQ4ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1BsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IgZXh0ZW5kcyBFcnJvciB7Ci0KLQkvL1RPRE8gRGVsZXRlIG1lCi0JcHVibGljIFBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yKCkgewotCQlzdXBlcihXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcl9FUlJPUl8wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZmNjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIgewotCXByb3RlY3RlZCBzdGF0aWMgTWFwIEdMT0JBTF9ERVBFTkRFTkNJRVMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9ERVBFTkRFTkNZX1RZUEUgPSAiUmVzb3VyY2VEZXBlbmRlbmN5QWRhcHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgTWFwIGxvY2FsRGVwZW5kZW5jaWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCWNsYXNzIFJlc291cmNlRGVwZW5kZW5jeUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCVJlc291cmNlIGRlcGVuZGVudFJlc291cmNlOwotCi0JCVJlc291cmNlRGVwZW5kZW5jeUFkYXB0ZXIoUmVzb3VyY2UgYURlcGVuZGVudFJlc291cmNlKSB7Ci0JCQlkZXBlbmRlbnRSZXNvdXJjZSA9IGFEZXBlbmRlbnRSZXNvdXJjZTsKLQkJCWRlcGVuZGVudFJlc291cmNlLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfREVQRU5ERU5DWV9UWVBFLmVxdWFscyh0eXBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJLy9MaXN0ZW4gZm9yIHVubG9hZHMgYW5kIHJlbW92ZXMKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChudWxsKSkgewotCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCA6Ci0JCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSAhPSBkZXBlbmRlbnRSZXNvdXJjZSAmJiBtc2cuZ2V0T2xkQm9vbGVhblZhbHVlKCkgJiYgIW1zZy5nZXROZXdCb29sZWFuVmFsdWUoKSkKLQkJCQkJCWRlcGVuZGVudFJlc291cmNlLnVubG9hZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19SRVNPVVJDRV9TRVQgOgotCQkJCQlpZiAobXNnLmdldE9sZFZhbHVlKCkgIT0gbnVsbCAmJiBtc2cuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSB7Ci0JCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gZGVwZW5kZW50UmVzb3VyY2UpCi0JCQkJCQkJKChSZXNvdXJjZSkgZ2V0VGFyZ2V0KCkpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCVJlc291cmNlU2V0IHNldCA9IGRlcGVuZGVudFJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCQkJaWYgKHNldCAhPSBudWxsKQotCQkJCQkJCQlzZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGRlcGVuZGVudFJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlU2V0TGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREKQotCQkJCXByb2NjZXNzQWRkZWRSZXNvdXJjZSgoUmVzb3VyY2VTZXQpIG1zZy5nZXROb3RpZmllcigpLCAoUmVzb3VyY2UpIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBVUklzLiBUaGUgZmlyc3QgcGFyYW1ldGVyLCBhVVJJU3RyaW5nLCBpcyB0aGUgb25lIHRoYXQKLQkgKiBkZXBlbmRlbnRVcmlTdHJpbmcgZGVwZW5kcyBvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYVVyaVN0cmluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXBlbmRlbnRVcmlTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEZXBlbmRlbmN5KFVSSSB0YXJnZXRVUkksIFVSSSBkZXBlbmRlbnRVUkkpIHsKLQkJaWYgKHRhcmdldFVSSSAhPSBudWxsICYmIGRlcGVuZGVudFVSSSAhPSBudWxsKSB7Ci0JCQlHTE9CQUxfREVQRU5ERU5DSUVTLnB1dChkZXBlbmRlbnRVUkksIHRhcmdldFVSSSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWluaXRpYWxpemUoYVJlc291cmNlU2V0KTsKLQl9Ci0KLQotCVJlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpZiAoYVJlc291cmNlU2V0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBSZXNvdXJjZVNldCBjYW5ub3QgYmUgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0aWFsaXplTG9jYWxEZXBlbmRlbmNpZXMoYVJlc291cmNlU2V0KTsKLQkJc2V0dXBEZXBlbmRlbmN5QWRhcHRlcnMoYVJlc291cmNlU2V0KTsKLQkJc2V0dXBSZXNvdXJjZVNldExpc3RlbmVyKGFSZXNvdXJjZVNldCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwUmVzb3VyY2VTZXRMaXN0ZW5lcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJYVJlc291cmNlU2V0LmVBZGFwdGVycygpLmFkZChuZXcgUmVzb3VyY2VTZXRMaXN0ZW5lcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwRGVwZW5kZW5jeUFkYXB0ZXJzKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpZiAoIWFSZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gbG9jYWxEZXBlbmRlbmNpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJTWFwLkVudHJ5IGVudHJ5OwotCQkJVVJJIGRlcGVuZGVudFVSSSwgdGFyZ2V0VVJJOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCWRlcGVuZGVudFVSSSA9IChVUkkpIGVudHJ5LmdldEtleSgpOwotCQkJCXRhcmdldFVSSSA9IChVUkkpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJc2V0dXBEZXBlbmRlbmN5QWRhcHRlcihhUmVzb3VyY2VTZXQsIGRlcGVuZGVudFVSSSwgdGFyZ2V0VVJJKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gZGVwZW5kZW50VVJJCi0JICogQHBhcmFtIHRhcmdldFVSSQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlcGVuZGVuY3lBZGFwdGVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgVVJJIGRlcGVuZGVudFVSSSwgVVJJIHRhcmdldFVSSSkgewotCQlSZXNvdXJjZSBkZXBlbmRlbnQgPSBhUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZGVwZW5kZW50VVJJLCBmYWxzZSk7Ci0JCWlmIChkZXBlbmRlbnQgIT0gbnVsbCkKLQkJCXNldHVwRGVwZW5kZW5jeUFkYXB0ZXIoZGVwZW5kZW50LCB0YXJnZXRVUkksIGFSZXNvdXJjZVNldCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZXBlbmRlbmN5QWRhcHRlcihSZXNvdXJjZSBkZXBlbmRlbnQsIFVSSSB0YXJnZXRVUkksIFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlSZXNvdXJjZSB0YXJnZXQgPSBhUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodGFyZ2V0VVJJLCBmYWxzZSk7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXRhcmdldCA9IGFSZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZSh0YXJnZXRVUkkpOwotCQl0YXJnZXQuZUFkYXB0ZXJzKCkuYWRkKG5ldyBSZXNvdXJjZURlcGVuZGVuY3lBZGFwdGVyKGRlcGVuZGVudCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTG9jYWxEZXBlbmRlbmNpZXMoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBhUmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCWluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhjb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTG9jYWxEZXBlbmRlbmNpZXMoVVJJQ29udmVydGVyIGFDb252ZXJ0ZXIpIHsKLQkJSXRlcmF0b3IgaXQgPSBHTE9CQUxfREVQRU5ERU5DSUVTLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTWFwIHJlc29sdmVkID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQlVUkkga2V5LCB2YWx1ZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlrZXkgPSAoVVJJKSBlbnRyeS5nZXRLZXkoKTsKLQkJCXZhbHVlID0gKFVSSSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWtleSA9IG5vcm1hbGl6ZShrZXksIGFDb252ZXJ0ZXIsIHJlc29sdmVkKTsKLQkJCXZhbHVlID0gbm9ybWFsaXplKHZhbHVlLCBhQ29udmVydGVyLCByZXNvbHZlZCk7Ci0JCQlsb2NhbERlcGVuZGVuY2llcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVsYXRpdmVVUkkKLQkgKiBAcGFyYW0gY29udmVydGVyCi0JICogQHBhcmFtIHJlc29sdmVkCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBVUkkgbm9ybWFsaXplKFVSSSByZWxhdGl2ZVVSSSwgVVJJQ29udmVydGVyIGNvbnZlcnRlciwgTWFwIHJlc29sdmVkKSB7Ci0JCVVSSSByZXN1bHQgPSAoVVJJKSByZXNvbHZlZC5nZXQocmVsYXRpdmVVUkkpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbnZlcnRlci5ub3JtYWxpemUocmVsYXRpdmVVUkkpOwotCQkJcmVzb2x2ZWQucHV0KHJlbGF0aXZlVVJJLCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNldAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2NjZXNzQWRkZWRSZXNvdXJjZShSZXNvdXJjZVNldCBzZXQsIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVVSSSB0YXJnZXRVUkkgPSAoVVJJKSBsb2NhbERlcGVuZGVuY2llcy5nZXQocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQlpZiAodGFyZ2V0VVJJICE9IG51bGwpCi0JCQlzZXR1cERlcGVuZGVuY3lBZGFwdGVyKHJlc291cmNlLCB0YXJnZXRVUkksIHNldCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmMWYzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQWRhcHRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBSRVNPVVJDRV9JU19MT0FESU5HX0FEQVBURVJfQ0xBU1MgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuY2xhc3M7Ci0KLSAgICBwdWJsaWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGZpbmRBZGFwdGVyKFJlc291cmNlIGFSZXNvdXJjZSkgewotICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgU3luY2hyb25pemluZyBvbiAiICsgYVJlc291cmNlKTsKLSAgICAgICAgCi0gICAgICAgIC8qIFN5bmNocm9uaXplIG9uIHRoZSBSZXNvdXJjZSAod2hpY2ggd2lsbCBiZSB0aGUgdGFyZ2V0IG9mIAotICAgICAgICAgKiB0aGUgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMpLgotICAgICAgICAgKiAKLSAgICAgICAgICogcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpIHdpbGwgY29vcmRpbmF0ZSB3aXRoIHRoaXMgCi0gICAgICAgICAqIHN5bmNocm9uaXphdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHN5bmNocm9uaXplZCAoYVJlc291cmNlKSB7Ci0gICAgICAgICAgICBhZGFwdGVyID0gKFJlc291cmNlSXNMb2FkaW5nQWRhcHRlcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIoYVJlc291cmNlLmVBZGFwdGVycygpLCBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhZGFwdGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQotICAgICAgICBpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIHRoZSByZW1vdmUgb2YgdGhlIGxvYWRpbmcgYWRhcHRlcgotICAgICAgICAgICAgaWYgKGlzU2V0TG9hZGVkUmVzb3VyY2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSkgcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JSZXNvdXJjZVRvTG9hZCgpIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBub3RpZmljYXRpb24KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXRMb2FkZWRSZXNvdXJjZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQgJiYgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpIHsKLQotICAgICAgICAvKiBTeW5jaHJvbml6ZSBvbiB0aGUgdGFyZ2V0IG9mIHRoZSBBZGFwdGVyLiBJZiAKLSAgICAgICAgICogdGhlIGxpc3Qgb2YgYWRhcHRlcnMgaXMgc2VhcmNoZWQgZm9yIGEgCi0gICAgICAgICAqIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciB1c2luZyB0aGUgCi0gICAgICAgICAqIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcigpIEFQSSwgdGhlbgotICAgICAgICAgKiB0aGUgYWNjZXNzIHRvIHJlbW92ZSB0aGUgQWRhcHRlciB1c2luZyB0aGlzIG1ldGhvZCAKLSAgICAgICAgICogd2lsbCBiZSBjb29yZGluYXRlZC4gIAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGdldFRhcmdldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgU3luY2hyb25pemluZyBvbiAiICsgZ2V0VGFyZ2V0KCkpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChnZXRUYXJnZXQoKSkgewotICAgICAgICAgICAgICAgIGdldFRhcmdldCgpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotICAgICAgICByZXR1cm4gdHlwZSA9PSBSRVNPVVJDRV9JU19MT0FESU5HX0FEQVBURVJfQ0xBU1M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZm9yY2VSZWxlYXNlKCkgewotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5OWY1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgICAgICAKLSAgICBwdWJsaWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGNyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmV2aXNpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1JldmlzaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjNjdkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmV2aXNpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotcHVibGljIGNsYXNzIFJldmlzaXQgewotCi0JLyoqCi0JICogUmV2aXNpdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXZpc2l0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXZpc2l0KCkgewotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuQ29tbWVudCgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdG9EbygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmYWN0b3IoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZURlcHJlY2F0ZWRNZXRob2QoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZU1lKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXZpZXdEZXNpZ24oKSB7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvU3RyaW5nVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1N0cmluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmMjMwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvU3RyaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nVXRpbCB7Ci0JLyoqCi0JICogRW5oYW5jZWQgZXF1YWxpdHkgY2hlY2sgZm9yIHR3byBzdHJpbmcgcGFyYW1ldGVycywgdGhhdCB0YWtlcyBpbnRvIGNvbnNpZGVyYXRpb24gbnVsbCB2YWx1ZXMuCi0JICogSWYgYm90aCB2YWx1ZXMgYXJlIG51bGwsIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gczEKLQkgKiBAcGFyYW0gczIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0VxdWFsKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCWlmIChzMSA9PSBudWxsKQotCQkJcmV0dXJuIHMyID09IG51bGw7Ci0JCXJldHVybiBzMS5lcXVhbHMoczIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZWU4YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbi5FY29yZVV0aWxpdGllc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIFRyYW5zbGF0b3JNYW5hZ2VyIGNsYXNzIHVzZWQgYnkgdGhlIFRyYW5zbGF0b3JTZXJ2aWNlIGluIG9yZGVyIHRvIGRpc2NvdmVyCi0gKiBhbmQgY2FjaGUgYWxsIG9mIHRoZSBleHRlbmRlZCBUcmFuc2xhdG9ycyB0byBiZSB1c2VkIGJ5IEVNRjJET01BZGFwdGVySW1wbC4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zbGF0b3JNYW5hZ2VyIHsKLQkKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIFRyYW5zbGF0b3JNYW5hZ2VyIGluc3RhbmNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgVHJhbnNsYXRvck1hbmFnZXIoKTsKLQkKLQkvKioKLQkgKiBDYWNoZSBvZiBhbGwgdGhlIFRyYW5zbGF0b3JEZXNjcmlwdG9ycwotCSAqLwotCXByaXZhdGUgZmluYWwgU2V0IHRyYW5zbGF0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IHN0YXRpYyBlbXB0eSBhcnJheSB1c2VkIHdoZW4gbm8gZGVzY3JpcHRvcnMgZm91bmQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yRGVzY3JpcHRvcltdIE5PX0VYVEVOREVEX1RSQU5TTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JEZXNjcmlwdG9yWzBdOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgVHJhbnNsYXRvck1hbmFnZXIKLQkgKiBAcmV0dXJuIFRyYW5zbGF0b3JNYW5hZ2VyIElOU1RBTkNFCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIFRyYW5zbGF0b3JNYW5hZ2VyKCkgewotCQluZXcgVHJhbnNsYXRvclJlZ2lzdHJ5KCkucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIFNpbXBsZSBSZWdpc3RyeSBSZWFkZXIgdXNlZCBieSBUcmFuc2xhdG9yIE1hbmFnZXIgdG8gcmVjb2duaXplIHRoZSBUcmFuc2xhdG9yIGV4dGVuc2lvbnMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRyYW5zbGF0b3JSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQkJCi0JCS8qKgotCQkgKiBUaGUgVHJhbnNsYXRvciBlbGVtZW50IG9mIHRoZSBleHRlbnNpb24gcG9pbnQuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0xBVE9SID0gInRyYW5zbGF0b3IiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKioKLQkJICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCQkgKi8KLQkJcHVibGljIFRyYW5zbGF0b3JSZWdpc3RyeSgpIHsKLQkJCXN1cGVyKEVjb3JlVXRpbGl0aWVzUGx1Z2luLklELCBFY29yZVV0aWxpdGllc1BsdWdpbi5UUkFOU0xBVE9SX0VYVEVOU1RJT05fUE9JTlQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlmIGl0IG1hdGNocyB0aGUgZXhwZWN0ZWQgdHJhbnNsYXRvciBlbGVtZW50IG5hbWUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKFRSQU5TTEFUT1IuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCWFkZFRyYW5zbGF0b3JEZXNjcmlwdG9yKG5ldyBUcmFuc2xhdG9yRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVzY3JpYmVzIGEgVHJhbnNsYXRvciBleHRlbnNpb24gcG9pbnQgZWxlbWVudAotCSAqLwotCXB1YmxpYyBjbGFzcyBUcmFuc2xhdG9yRGVzY3JpcHRvciB7Ci0JCi0JCS8qKgotCQkgKiBRdWFsaWZpZWQgY2xhc3MgbmFtZSBhdHRyaWJ1dGUKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKioKLQkJICogVGhlIGNvbmZpZyBlbGVtZW50IGZvciB0aGlzIERlc2NyaXB0b3IKLQkJICovCi0JCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQ7Ci0JCQotCQkvKioKLQkJICogdGhlIGNhY2hlZCBxdWFsaWZpZWQgY2xhc3NOYW1lIHZhbHVlIG9mIHRoaXMgZGVzY3JpcHRvcgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCQotCQkvKioKLQkJICogQ29uc3RydWN0b3IKLQkJICogQHBhcmFtIGFDb25maWdFbGVtZW50Ci0JCSAqLwotCQlwdWJsaWMgVHJhbnNsYXRvckRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWdFbGVtZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJY29uZmlnRWxlbWVudCA9IGFDb25maWdFbGVtZW50OwotCQkJY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQ0xBU1NOQU1FKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHJpZXZlIHRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBleHRlbmRlZCBUcmFuc2xhdG9yCi0JCSAqIEByZXR1cm4gU3RyaW5nIGNsYXNzbmFtZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBDcmVhdGUgdGhlIGFjdHVhbCBUcmFuc2xhdG9yIGluc3RhbmNlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkJICogQHJldHVybiBUcmFuc2xhdG9yCi0JCSAqLwotCQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVUcmFuc2xhdG9yKCkgewotCQkJVHJhbnNsYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWluc3RhbmNlID0gKFRyYW5zbGF0b3IpIGNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU05BTUUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgVHJhbnNsYXRvckRlc2NyaXB0b3IgdG8gdGhlIGNhY2hlIG9mIGRlc2NyaXB0b3IgZXh0ZW5zaW9ucy4KLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUcmFuc2xhdG9yRGVzY3JpcHRvcihUcmFuc2xhdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZGVzY3JpcHRvcik7Ci0JCXRyYW5zbGF0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogRmluZCBhbGwgdGhlIGFzc29jaWF0ZWQgVHJhbnNsYXRvckRlc2NyaXB0b3JzIGZvciB0aGUgVHJhc2xhdG9yIGV4dGVuc2lvbnMgZGVmaW5lZC4KLQkgKiBAcmV0dXJuIFRyYW5zbGF0b3JEZXNjcmlwdG9yW10KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvckRlc2NyaXB0b3JbXSBmaW5kVHJhbnNsYXRvcnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlUcmFuc2xhdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciB0cmFuc2xhdG9yc0l0ciA9IHRyYW5zbGF0b3JzLml0ZXJhdG9yKCk7IHRyYW5zbGF0b3JzSXRyLmhhc05leHQoKTspIHsKLQkJCWRlc2NyaXB0b3IgPSAoVHJhbnNsYXRvckRlc2NyaXB0b3IpIHRyYW5zbGF0b3JzSXRyLm5leHQoKTsKLQkJCXJlc3VsdC5hZGQoZGVzY3JpcHRvcik7Ci0JCX0KLQkJaWYgKHJlc3VsdC5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIE5PX0VYVEVOREVEX1RSQU5TTEFUT1JTOwotCQl9Ci0JCXJldHVybiAoVHJhbnNsYXRvckRlc2NyaXB0b3JbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFRyYW5zbGF0b3JEZXNjcmlwdG9yW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvclNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDEyYTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuVHJhbnNsYXRvck1hbmFnZXIuVHJhbnNsYXRvckRlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgc2VydmljZSBjbGFzcyB0byBkZWxpdmVyIEFQSSB0byB1c2UgdG8gcmV0cmlldmUgVHJhbnNsYXRvciBleHRlbnNpb25zIGZyb20KLSAqIHRoZSBUcmFuc2xhdG9yTWFuYWdlciBhbmQgaXRzIFJlZ2lzdHJ5UmVhZGVyLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNsYXRvclNlcnZpY2UgewotCi0JLyoqCi0JICogU3RhdGljIEtleSB2YWx1ZSBwYWlyIG9mIGRlc2NyaXB0b3JzIGFzIGtleXMgYW5kIFRyYW5zbGF0b3IgaW5zdGFuY2VzIGFzIHZhbHVlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCB0cmFuc2xhdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogU3RhdGljIGVtcHR5IGFycmF5IHVzZWQgd2hlbiBubyBleHRlbnNpb25zIGZvdW5kCi0JICovCi0JLy8gbmV2ZXIgdXNlZAotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIE5PX1RSQU5TTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbMF07Ci0JCi0JLyoqCi0JICogU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBUcmFuc2xhdG9yIHNlcnZpY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yU2VydmljZSBJTlNUQU5DRSA9IG5ldyBUcmFuc2xhdG9yU2VydmljZSgpOwotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIFRyYW5zbGF0b3JTZXJ2aWNlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3JTZXJ2aWNlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZXh0ZW5zaW9uIHBvaW50IFRyYW5zbGF0b3JEZXNjcmlwdG9yIG9iamVjdHMgZnJvbSB0aGUgbWFuYWdlcgotCSAqIEByZXR1cm4gVHJhbnNsYXRvckRlc2NyaXB0b3JbXQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yRGVzY3JpcHRvcltdIGdldFRyYW5zbGF0b3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIFRyYW5zbGF0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZmluZFRyYW5zbGF0b3JzKCk7Ci0JfQotCQotCS8qKgotICAgICAqIFRoaXMgcmV0cmlldmVzIHRoZSBleHRlbmRlZCBUcmFuc2xhdG9ycyB1c2luZyB0aGUgZXh0ZW5zaW9uIHBvaW50IG1hbmFnZXIgYW5kIGRlc2NyaXB0b3JzCi0gICAgICogQHJldHVybiBUcmFuc2xhdG9yW10gKE5vdGUsIHRoZSByZXR1cm4gdmFsdWUgbWF5IGNvbnRhaW4gbnVsbCBlbnRyaWVzLikKLSAgICAgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldFRyYW5zbGF0b3JzKCkgewotCQlUcmFuc2xhdG9yRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZ2V0VHJhbnNsYXRvckRlc2NyaXB0b3JzKCk7Ci0JCVRyYW5zbGF0b3JbXSByZXN1bHQgPSBuZXcgVHJhbnNsYXRvcltkZXNjcmlwdG9ycy5sZW5ndGhdOwotCQkvL1RoZSByZXN1bHQgaW5kZXggY291bGQgZGlmZmVyIGZyb20gdGhlIGRlc2NyaXB0b3JzIGluZGV4LgotCQlpbnQgcmVzdWx0SW5kZXggPSAwOwotCQlmb3IgKGludCBpPTA7IGk8ZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCVRyYW5zbGF0b3IgaW5zdGFuY2UgPSBnZXRUcmFuc2xhdG9yKGRlc2NyaXB0b3JzW2ldKTsKLQkJCWlmIChpbnN0YW5jZSE9bnVsbCkgewotCQkJCXJlc3VsdFtyZXN1bHRJbmRleF0gPSBpbnN0YW5jZTsKLQkJCQlyZXN1bHRJbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7ICAKLSAgICB9Ci0JCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIGV4aXN0aW5nIGFzc29jaWF0ZWQgVHJhbnNsYXRvciBpbnN0YW5jZSBmb3IgdGhlIGRlc2NyaXB0b3IsIG9yIGNyZWF0ZSBhIG5ldwotCSAqIG9uZSBhbmQgY2FjaGUgb24gdGhlIFNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhbnNsYXRvckRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIFRyYW5zbGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0VHJhbnNsYXRvcihUcmFuc2xhdG9yRGVzY3JpcHRvciB0cmFuc2xhdG9yRGVzY3JpcHRvcikgewotCQlUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSAoVHJhbnNsYXRvcikgdHJhbnNsYXRvcnMuZ2V0KHRyYW5zbGF0b3JEZXNjcmlwdG9yKTsKLQkJaWYgKHRyYW5zbGF0b3IgIT0gbnVsbCkKLQkJCXJldHVybiB0cmFuc2xhdG9yOwotCQkKLQkJc3luY2hyb25pemVkICh0cmFuc2xhdG9ycykgewotCQkJdHJhbnNsYXRvciA9IHRyYW5zbGF0b3JEZXNjcmlwdG9yLmNyZWF0ZVRyYW5zbGF0b3IoKTsKLQkJCWlmICh0cmFuc2xhdG9yICE9IG51bGwpCi0JCQkJdHJhbnNsYXRvcnMucHV0KHRyYW5zbGF0b3JEZXNjcmlwdG9yLCB0cmFuc2xhdG9yKTsKLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9VbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzFjNjZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9VbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVXNlckV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9XRlRVdGlsc1Jlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDYzMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJ3ZnR1dGlscyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXRlRVdGlsc1Jlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREFOR0xJTkdfSFJFRl9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW50ZWdlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmFpbGVkX3RvX2NvbnZlcnRfXzBfX3RvX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1lcmF0aW9uX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG9ydF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hhcmFjdGVyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb25nX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3VibGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyX0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmxvYXRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ5dGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdhcm5pbmdfX0NvdWxkX25vdF93cml0ZV9iX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2ZPYmplY3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yX0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU1GMkRPTUFkYXB0ZXJJbXBsX0VSUk9SXzA7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dyaXRlQmFja0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dyaXRlQmFja0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTBhYTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Xcml0ZUJhY2tIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3Mgd2lsbCBiZSBkZWxldGVkLiBJZiB5b3Ugc3RpbGwgbmVlZCB0byB1c2UgdGhpcyBjbGFzcywgcGxlYXNlIGNvbnRhY3QgdGhlCi0gKiAgICAgICAgICAgICBXQ0NNIHRlYW0uIEEgY2xhc3Mgd2hpY2ggY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBFbmNvZGVyL0RlY29kZXJzIHRvIHNhdmUKLSAqICAgICAgICAgICAgIHJlc291cmNlcyBpZiB0aGV5IGFyZSBtYWRlIGRpcnR5IGJ5IGF1dG9tYXRpYyBlbmNvZGluZyBzdXBwb3J0LiBVc2FnZSBFeGFtcGxlOgotICogCi0gKiA8cHJlPgotICogCi0gKiAKLSAqIC8vIFVzZSB0aGUgc3RhbmRhcmQgV2ViU3BoZXJlIHBhc3N3b3JkIHZhbHVlIGVuY29kZXIvZGVjb2Rlci4KLSAqIEVuY29kZXJEZWNvZGVyUmVnaXN0cnkuZ2V0RGVmYXVsdFJlZ2lzdHJ5KCkuc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKG5ldyBjb20uaWJtLmVqcy5zZWN1cml0eS51dGlsLldBU0VuY29kZXJEZWNvZGVyKCkpOwotICogLy8gQmVnaW4gdHJhY2tpbmcgY2hhbmdlcy4uLgotICogV3JpdGVCYWNrSGVscGVyLmJlZ2luKCk7Ci0gKiAvLyBMb2FkIGEgcmVzb3VyY2Ugd2hpY2ggbWF5IGhhdmUgdW4tZW5jb2RlZCB2YWx1ZXMuLi4KLSAqIC8vIE5vdGU6IFRoZSBXQ0NNIHdpbGwgYXR0ZW1wdCB0byBkZXRlY3QgdW4tZW5jb2RlZCB2YWx1ZXMuICBJZiB1bmVuY29kZWQgdmFsdWVzCi0gKiAvLyBhcmUgZm91bmQsIHRoZSB2YWx1ZSB3aWxsIGJlIGVuY29kZWQsIGFuZCB0aGUgcmVzb3VyY2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUKLSAqIC8vIFdyaXRlQmFja0hlbHBlci4KLSAqIFJlc291cmNlIHJlcyA9IHJlc291cmNlU2V0LmxvYWQoJnF1b3Q7bXlSZXNvdXJjZSZxdW90Oyk7Ci0gKiAvLyBFbnN1cmUgdGhhdCBhbnkgY2hhbmdlcyBkdWUgdG8gZW5jb2RpbmcgYXJlIHdyaXR0ZW4gYmFjayBvdXQuCi0gKiBXcml0ZUJhY2tIZWxwZXIuZW5kKCk7Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIFdyaXRlQmFja0hlbHBlciB7Ci0JcHJpdmF0ZSBTZXQgZGlydHlPYmplY3RzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIGJvb2xlYW4gdHJhY2tpbmdDaGFuZ2VzID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgV3JpdGVCYWNrSGVscGVyIF9pbnN0YW5jZTsKLQlzdGF0aWMgewotCQkvL0RlcHJlY2F0ZWQgY2xhc3MKLQkJUmV2aXNpdC5kZWxldGVNZSgpOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgZW5zdXJlcyBwcm9wZXIgdXNhZ2UgdGhyb3VnaCBzaW5nbGV0b24uCi0JICovCi0JcHJpdmF0ZSBXcml0ZUJhY2tIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHJlc291cmNlIHdoaWNoIGlzIGRpcnR5LCBhbmQgbmVlZHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlydHlPYmplY3QoRU9iamVjdCBkaXJ0eU9iamVjdCkgewotCQlkaXJ0eU9iamVjdHMuYWRkKGRpcnR5T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBCZWdpbiBjb2xsZWN0aW5nIG9iamVjdHMgd2hpY2ggaGF2ZSBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luKCkgewotCQl0cmFja2luZ0NoYW5nZXMgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIHNhdmUgYWxsIGRpcnR5IHJlc291cmNlcyAoaWYgcG9zc2libGUpLCB0aGVuIG1hcmtzIHRoZSByZXNvdXJjZXMgYXMgbm9uLWRpcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZCgpIHsKLQkJc2F2ZURpcnR5UmVzb3VyY2VzKCk7Ci0JCXJlc2V0KCk7Ci0JCXRyYWNraW5nQ2hhbmdlcyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBjaGFuZ2VzIHRvIG1vZiBvYmplY3RzIGFyZSBjdXJyZW50bHkgYmVpbmcgdHJhY2tlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIHRyYWNraW5nQ2hhbmdlczsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGxpc3Qgb2YgZGlydHkgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0KCkgewotCQlkaXJ0eU9iamVjdHMuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0cyB0byBzYXZlIGFsbCBkaXJ0eSByZXNvdXJjZXMgKGlmIHBvc3NpYmxlKSwgdGhlbiBtYXJrcyB0aGUgcmVzb3VyY2VzIGFzIG5vbi1kaXJ0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGlydHlSZXNvdXJjZXMoKSB7Ci0JCVNldCBkaXJ0eVJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIGRpcnR5T2JqSXRlciA9IGRpcnR5T2JqZWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZGlydHlPYmpJdGVyLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBkaXJ0eU9iamVjdCA9IChFT2JqZWN0KSBkaXJ0eU9iakl0ZXIubmV4dCgpOwotCQkJaWYgKGRpcnR5T2JqZWN0LmVSZXNvdXJjZSgpICE9IG51bGwgJiYgIWRpcnR5UmVzb3VyY2VzLmNvbnRhaW5zKGRpcnR5T2JqZWN0KSkgewotCQkJCWRpcnR5UmVzb3VyY2VzLmFkZChkaXJ0eU9iamVjdC5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJSXRlcmF0b3IgZGlydHlJdGVyID0gZGlydHlSZXNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGRpcnR5SXRlci5oYXNOZXh0KCkpIHsKLQkJCVJlc291cmNlIGRpcnR5UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGRpcnR5SXRlci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCWRpcnR5UmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl3YXJuKGRpcnR5UmVzb3VyY2UsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHJlc291cmNlIHdoaWNoIGlzIGRpcnR5LCBhbmQgbmVlZHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBXcml0ZUJhY2tIZWxwZXIgc2luZ2xldG9uKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBXcml0ZUJhY2tIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFdhcm4gdGhlIHVzZXIgb2YgcHJvYmxlbXMgZHVyaW5nIHNhdmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgd2FybihSZXNvdXJjZSByZXMsIEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbihXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuV2FybmluZ19fQ291bGRfbm90X3dyaXRlX2JfV0FSTl8sIG5ldyBPYmplY3RbXXtyZXMuZ2V0VVJJKCl9KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1hNTFZhbHVlRW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9YTUxWYWx1ZUVuY29kZXJEZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTFkMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1hNTFZhbHVlRW5jb2RlckRlY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLS8qKgotICogQW4gWE1MIHZhbHVlIGVzY2FwaW5nIEVuY29kZXJEZWNvZGVyIGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWx1ZUVuY29kZXJEZWNvZGVyIGV4dGVuZHMgRW5jb2RlckRlY29kZXJBZGFwdGVyIGltcGxlbWVudHMgRW5jb2RlckRlY29kZXIgewotCS8qKgotCSAqIElkZW50aWZpZXMgdGhlIGxhc3QgcHJpbnRhYmxlIGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZSByYW5nZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGUKLQkgKiBlbmNvZGluZyB1c2VkIHdpdGggdGhpcyBzZXJpYWxpemVyLiBGb3IgOC1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSBlaXRoZXIgMHg3RSBvciAweEZGLiBGb3IKLQkgKiAxNi1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSAweEZGRkYuIENoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHByaW50YWJsZSB3aWxsIGJlIGVzY2FwZWQgdXNpbmcKLQkgKiBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIGludCBfbGFzdFByaW50YWJsZSA9IDB4N0U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBYTUxWYWx1ZUVuY29kZXJEZWNvZGVyIF9zaW5nbGV0b247Ci0KLQkvKioKLQkgKiBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MVmFsdWVFbmNvZGVyRGVjb2RlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gTk9UX0lNUExFTUVOVEVECi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIGEgc3RyaW5nIHNvIGl0IG1heSBiZSBwcmludGVkIGFzIHRleHQgY29udGVudCBvciBhdHRyaWJ1dGUgdmFsdWUuIE5vbiBwcmludGFibGUKLQkgKiBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLiBXaGVyZSB0aGUgZm9ybWF0IHNwZWNpZmllcyBhIGRlYXVsdCBlbnRpdHkKLQkgKiByZWZlcmVuY2UsIHRoYXQgcmVmZXJlbmNlIGlzIHVzZWQgKGUuZy4gPHR0PiZhbXA7bHQ7PC90dD4pLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgdG8gZXNjYXBlCi0JICovCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5sZW5ndGgoKSk7Ci0JCVN0cmluZyBjaGFyUmVmID0gbnVsbDsKLQkJY2hhciBjaDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgKytpKSB7Ci0JCQljaCA9IHZhbHVlLmNoYXJBdChpKTsKLQkJCS8vIElmIHRoZXJlIGlzIGEgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcwotCQkJLy8gY2hhcmFjdGVyLCBwcmludCBpdC4gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGVudGl0eQotCQkJLy8gcmVmZXJlbmNlcyBpcyBhbG1vc3QgYnV0IG5vdCBpZGVudGljYWwgYmV0d2VlbgotCQkJLy8gWE1MIGFuZCBIVE1MLgotCQkJY2hhclJlZiA9IGdldEVudGl0eVJlZihjaCk7Ci0JCQlpZiAoY2hhclJlZiAhPSBudWxsKSB7Ci0JCQkJc2J1Zi5hcHBlbmQoJyYnKTsKLQkJCQlzYnVmLmFwcGVuZChjaGFyUmVmKTsKLQkJCQlzYnVmLmFwcGVuZCgnOycpOwotCQkJfSBlbHNlIGlmICgoY2ggPj0gJyAnICYmIGNoIDw9IF9sYXN0UHJpbnRhYmxlICYmIGNoICE9IDB4RjcpIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXHQnKSB7Ci0JCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBub3QgcHJpbnRhYmxlLCBwcmludCBhcyBjaGFyYWN0ZXIgcmVmZXJlbmNlLgotCQkJCS8vIE5vbiBwcmludGFibGVzIGFyZSBiZWxvdyBBU0NJSSBzcGFjZSBidXQgbm90IHRhYiBvciBsaW5lCi0JCQkJLy8gdGVybWluYXRvciwgQVNDSUkgZGVsZXRlLCBvciBhYm92ZSBhIGNlcnRhaW4gVW5pY29kZSB0aHJlc2hvbGQuCi0JCQkJc2J1Zi5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlzYnVmLmFwcGVuZCgiJiMiKTsvLyROT04tTkxTLTEkCi0JCQkJc2J1Zi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhjaCkpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChfc2luZ2xldG9uID09IG51bGwpIHsKLQkJCV9zaW5nbGV0b24gPSBuZXcgWE1MVmFsdWVFbmNvZGVyRGVjb2RlcigpOwotCQl9Ci0JCXJldHVybiBfc2luZ2xldG9uLmVuY29kZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcyBjaGFyYWN0ZXIgdmFsdWUsIG9yIG51bGwgaWYgbm8gc3VjaCBlbnRpdHkKLQkgKiBleGlzdHMuIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCA8dHQ+JyZhbXA7JzwvdHQ+IHdpbGwgcmV0dXJuIDx0dD4iJmFtcDthbXA7IjwvdHQ+LgotCSAqIAotCSAqIEBwYXJhbSBjaAotCSAqICAgICAgICAgICAgQ2hhcmFjdGVyIHZhbHVlCi0JICogQHJldHVybiBDaGFyYWN0ZXIgZW50aXR5IG5hbWUsIG9yIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVudGl0eVJlZihjaGFyIGNoKSB7Ci0JCS8vIEVuY29kZSBzcGVjaWFsIFhNTCBjaGFyYWN0ZXJzIGludG8gdGhlIGVxdWl2YWxlbnQgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JCS8vIFRoZXNlIGZpdmUgYXJlIGRlZmluZWQgYnkgZGVmYXVsdCBmb3IgYWxsIFhNTCBkb2N1bWVudHMuCi0JCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnIDoKLQkJCQlyZXR1cm4gImx0IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICc+JyA6Ci0JCQkJcmV0dXJuICJndCI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnIicgOgotCQkJCXJldHVybiAicXVvdCI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnXCcnIDoKLQkJCQlyZXR1cm4gImFwb3MiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyYnIDoKLQkJCQlyZXR1cm4gImFtcCI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi93ZnR1dGlscy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvd2Z0dXRpbHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyZTJhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi93ZnR1dGlscy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XYXJuaW5nX19Db3VsZF9ub3Rfd3JpdGVfYl9XQVJOXz1JV0FFMDAwOFcgV2FybmluZzogQ291bGQgbm90IHdyaXRlIGJhY2sgezB9Ci1TdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FUlJPUl89SVdBRTAwMDlFIFN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Ci1FbnVtZXJhdGlvbl9VSV89RW51bWVyYXRpb24KLURvdWJsZV9VSV89RG91YmxlCi1GbG9hdF9VSV89RmxvYXQKLUxvbmdfVUlfPUxvbmcKLVNob3J0X1VJXz1TaG9ydAotQm9vbGVhbl9VSV89Qm9vbGVhbgotSW50ZWdlcl9VSV89SW50ZWdlcgotQ2hhcmFjdGVyX1VJXz1DaGFyYWN0ZXIKLUJ5dGVfVUlfPUJ5dGUKLUZhaWxlZF90b19jb252ZXJ0X18wX190b19fX0VSUk9SXz1JV0FFMDAxNEUgRmFpbGVkIHRvIGNvbnZlcnQgezB9IHRvIHsxfS4KLURBTkdMSU5HX0hSRUZfRVJST1JfPUlXQUUwMDAxRSBVbmFibGUgdG8gcmVzb2x2ZSBIUkVGIHswfS4gQ2hlY2sgdGhlIGRlc2NyaXB0b3IgZmlsZXMgYW5kIGVuc3VyZSB0aGUgaWRzIGFyZSB2YWxpZC4KLU1vZk9iamVjdF9VSV89TW9mT2JqZWN0X1VJXwotUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3JfRVJST1JfMD1QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcl9FUlJPUl8wCi1FTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMD1FTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMAotCi1SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlcl9FUlJPUl8wPUlXQUUwMDAyRSBUaGUgUmVzb3VyY2VTZXQgY2Fubm90IGJlIG51bGwuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNDUxNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvamVtLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2U0NjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1lbWZ3b3JrYmVuY2hlZGl0LmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZWYwMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDY4ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jU2F0IE1hciAyNCAwMjowNjo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJlYzdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4yMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luVmVuZG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjEwMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LAotIEoyU0UtMS41Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjg4YWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGUvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gc2NoZW1hLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYzFjZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVNRl9SZXNvdXJjZV9FZGl0X01vZGVsPUVNRiBSZXNvdXJjZSBFZGl0IE1vZGVsCi1FZGl0X01vZGVsX0V4dGVuc2lvbnM9RWRpdCBNb2RlbCBFeHRlbnNpb25zCi1BZGFwdGVyX0ZhY3RvcnlfRXh0ZW5zaW9uPUFkYXB0ZXIgRmFjdG9yeSBFeHRlbnNpb24KLU1vZGlmaWVySGVscGVyRmFjdG9yeT1Nb2RpZmllckhlbHBlckZhY3RvcnkKLXBsdWdpbk5hbWU9RU1GIFdvcmtiZW5jaCBFZGl0IFBsdWctaW4KLXBsdWdpblZlbmRvcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjczYjU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRNb2RlbCIgbmFtZT0iJUVNRl9SZXNvdXJjZV9FZGl0X01vZGVsIiBzY2hlbWE9InNjaGVtYS9lZGl0TW9kZWwuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZWRpdE1vZGVsRXh0ZW5zaW9uIiBuYW1lPSIlRWRpdF9Nb2RlbF9FeHRlbnNpb25zIiBzY2hlbWE9InNjaGVtYS9lZGl0TW9kZWxFeHRlbnNpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYWRhcHRlckZhY3RvcnkiIG5hbWU9IiVBZGFwdGVyX0ZhY3RvcnlfRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS9hZGFwdGVyRmFjdG9yeS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJNb2RpZmllckhlbHBlckZhY3RvcnkiIG5hbWU9IiVNb2RpZmllckhlbHBlckZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL21vZGlmaWVySGVscGVyRmFjdG9yeS5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC5pbnRlcm5hbFdvcmtiZW5jaENvbnRleHRGYWN0b3J5Ij4KLSAgICAgIDxmYWN0b3J5Q2xhc3MKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5Ij4KLSAgICAgIDwvZmFjdG9yeUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgaWQ9ImVtZlZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBuYW1lPSJlbWZWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIj4KLSAgICAgIDx2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcgotICAgICAgICBpZD0iZW1mVmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIGhhbmRsZXJDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRW1mVmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIHNlbGVjdGlvblR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVtZlBhY2thZ2VQcm9wZXJ0eVRlc3RlciIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IgotICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIKLSAgICAgIHByb3BlcnRpZXM9ImVtZlBhY2thZ2UiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRW1mUGFja2FnZVByb3BlcnR5VGVzdGVyIj4KLSAgICA8L3Byb3BlcnR5VGVzdGVyPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICBrZXk9IlZhbGlkYXRlRWRpdENvbnRleHQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuVmFsaWRhdGVFZGl0SGVhZGxlc3NDb250ZXh0IgotICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkMWQ0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuZW1mLndvcmtiZW5jaC5lZGl0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vcHJvcGVydHlfZmlsZSIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGUiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ0b3NlZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcm9wZXJ0eV9maWxlL2VtZnRvc2VkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDg0ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcm9wZXJ0eV9maWxlL2VtZnRvc2VkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1VbmV4cGVjdGVkX0lPX2V4Y2VwdGlvbl9vY2N1cnJlZF9jcmVhdGluZ194bWxfZG9jdW1lbnRfMV9FWENfPUlXQUUwMDE3RSBVbmV4cGVjdGVkIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBjcmVhdGluZyB4bWwgZG9jdW1lbnQKLUVNRjJET01TZWRSZW5kZXJlcl9VSV8wPXswfSBzaG91bGQgbm90IHVzZSBhbiBPdXRwdXRTdHJlYW0gZm9yIGxvYWRpbmcKLUVNRjJET01TZWRSZW5kZXJlcl9VSV8xPXswfSBzaG91bGQgbm90IHVzZSBhbiBJbnB1dFN0cmVhbSBmb3IgbG9hZGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcm9wZXJ0eV9maWxlL2VtZndvcmtiZW5jaGVkaXQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ3b3JrYmVuY2hlZGl0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMWQxYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcm9wZXJ0eV9maWxlL2VtZndvcmtiZW5jaGVkaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRHluYW1pY0FkYXB0ZXJGYWN0b3J5X0VSUk9SXzA9SVdBRTAwMTBFIEEgbnVsbCBFUGFja2FnZSB3aWxsIG5vdCBiZSB0aWVkIHRvIGFueSBBZGFwdGVyIEZhY3RvcnkuCi1DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8wPVRoZXJlIGFyZSBhdCBsZWFzdCB7MH0gaW1wcm9wZXJseSByZWxlYXNlZCBlZGl0IG1vZGVscy4KLUNsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uX1VJXzE9VGhpcyBleGNlcHRpb24gd2FzIGdlbmVyYXRlZCB0byBpbmRpY2F0ZSBhbiBpbnZhbGlkIHVzYWdlIG9mIHJlZmVyZW5jZSBjb3VudHMuXG4gVHlwaWNhbGx5LCB0aGlzIG9jY3VycyBvbiBhdHRlbXB0cyB0byBvcGVuIGFuIGFscmVhZHkgb3BlbiBhcnRpZmFjdCBlZGl0LlxuIE1ha2Ugc3VyZSB0aGUgZGlzcG9zZSBtZXRob2QgaXMgY2FsbGVkIHdoZW4gZG9uZSBhY2Nlc3NpbmcuXG4gUGxlYXNlIGV4YW1pbmUgdGhlIHN0YWNrIHRyYWNlLlxuIENsaWVudCBBY2Nlc3MgRXhjZXB0aW9uIG9mIHR5cGUgezB9IFxuCi1DbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wPUlXQUUwMDExRSBLZXkgYWxyZWFkeSB1c2VkIHRvIGFjY2VzcyBSZXNvdXJjZQotQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMT1JV0FFMDAxMkUgS2V5IGhhcyBub3QgcHJvcGVybHkgYWNjZXNzZWQgUmVzb3VyY2UuCi1FZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8wPUlXQUUwMDEzRSBUaGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGZvciB0aGUgRWRpdCBNb2RlbCBcInswfVwiIGNvbnRhaW5zIGEgY3ljbGUuIFBsZWFzZSBjb3JyZWN0IHRoZSBlbnRyaWVzIGluIHlvdXIgcGx1Z2luLnhtbCBmaWxlcy4KLUVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzE9SVdBRTAwMTRFIENvdWxkIG5vdCBjcmVhdGUgZmFjdG9yeSBiZWNhdXNlIElDb25maWd1cmF0aW9uRWxlbWVudCBpcyBudWxsLgotRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMj1JV0FFMDAxNUUgTm8gRWRpdE1vZGVsRmFjdG9yeSBmb3Iga2V5IFwiezB9XCIKLVNuYXBzaG90X0VSUk9SXzA9SVdBRTAwMTZFIExvY2tpbmcgSW5zdXJhbmNlIFN0YWNrIFRyYWNlCi1BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3JfRVJST1JfMD1JV0FFMDAxN0UgQSBwYWNrYWdlVVJJIGlzIHJlcXVpcmVkIGZvciBhbGwgQWRhcHRlciBGYWN0b3JpZXMKLUFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcl9FUlJPUl8xPUlXQUUwMDE4RSBBbiBpZCBpcyByZXF1aXJlZCBmb3IgYWxsIEFkYXB0ZXIgRmFjdG9yaWVzLiBDaGVjayBhbGwgYWRhcHRlciBmYWN0b3JpZXMgZGVmaW5lZCBpbiBcInswfVwiLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL01vZHVsZUNvcmUuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvTW9kdWxlQ29yZS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2YmRkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvTW9kdWxlQ29yZS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iIHJ1bnRpbWVKYXI9InRydWUiCi0gICAgbW9kZWxOYW1lPSJQcm9qZWN0TW9kdWxlIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5wcm9qZWN0bW9kdWxlLnByb3ZpZGVyLk1vZHVsZUNvcmVFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QucHJvamVjdG1vZHVsZS5wcmVzZW50YXRpb24uTW9kdWxlQ29yZUVkaXRvclBsdWdpbiIKLSAgICBydW50aW1lQ29tcGF0aWJpbGl0eT0iZmFsc2UiPgotICA8Zm9yZWlnbk1vZGVsPm1vZHVsZUNvcmUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+V09SS1NQQUNFX1JPT1Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5EOlx3b3JrXFdUUDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNb2R1bGVDb3JlIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbiIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0ibW9kdWxlQ29yZS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW5jeVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW5jeVR5cGUvdXNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW5jeVR5cGUvY29uc3VtZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibW9kdWxlQ29yZS5lY29yZSMvL1VSSSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlL2hhbmRsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGUvZGVwbG95ZWROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZS9yZXNvdXJjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlL21vZHVsZVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlL21vZHVsZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2Uvc291cmNlUGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGVSZXNvdXJjZS9kZXBsb3llZFBhdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UvZXhjbHVzaW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UvbW9kdWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZHVsZUNvcmUuZWNvcmUjLy9Nb2R1bGVUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vTW9kdWxlVHlwZS9tZXRhZGF0YVJlc291cmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Nb2R1bGVUeXBlL21vZHVsZVR5cGVJZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVDb3JlLmVjb3JlIy8vUHJvamVjdE1vZHVsZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Qcm9qZWN0TW9kdWxlcy9wcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVDb3JlLmVjb3JlIy8vUHJvamVjdE1vZHVsZXMvd29ya2JlbmNoTW9kdWxlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW50TW9kdWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW50TW9kdWxlL2hhbmRsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9EZXBlbmRlbnRNb2R1bGUvZGVwbG95ZWRQYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVudE1vZHVsZS9kZXBlbmRlbmN5VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMGY1YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsMTA2NSArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAibW9kdWxlQ29yZSINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIk1vZHVsZUNvcmUiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJtb2R1bGVjb3JlLnhtaSIpKSkNCi0gICAgcXVpZCAgICAgICAJIjNBMERCNjhCMDA0NiINCi0gICAgdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0DQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNUEiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamJleHQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlBQTg2NjYwMTkwIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI1QiINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGV4dCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI1MzRGRDAyNEMiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjVDIg0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiYm5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MEZDMDNDQSIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjQiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBibmQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCOTYxMDYwMTA3IikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI2NSINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNsaWVudGJuZCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI5NjE0RjAzMUYiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY2Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb25leHQiDQotCSAgICBxdWlkdSAgICAgIAkiM0EyMkU2MDgwMzAzIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI2NyINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uYm5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MTE1MDJBNCIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjgiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqMmNibmQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCOTYzMkUwMzhDIikpDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIldvcmtiZW5jaE1vZHVsZSINCi0JICAgIHF1aWQgICAgICAgCSI0MUUzREY1ODAxRkEiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaGFuZGxlIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUVDMUQ3MTAxNUQiDQotCQkgICAgdHlwZSAgICAgICAJIlVSSSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFQzI2REEwMjdBIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVwbG95ZWROYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MjAxNDcxRDAyMDgiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSINCi0JICAgIHF1aWQgICAgICAgCSI0MUUzREY2NzAwMzkiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic291cmNlUGF0aCINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFM0RGOTcwMTI4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJVUkkiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcGxveWVkUGF0aCINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFRUM2NDAwMjVCIg0KLQkJICAgIHR5cGUgICAgICAgCSJVUkkiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2lvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRTNERjlFMDExRSINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTW9kdWxlVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSI0MUVDMUQ1MTAzRTIiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWV0YWRhdGFSZXNvdXJjZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRUMxREYwMDIxRSINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtb2R1bGVUeXBlSWQiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRUMyMTM0MDM1NyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlVSSSINCi0JICAgIHF1aWQgICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFQzI3MDgwM0FDIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUHJvamVjdE1vZHVsZXMiDQotCSAgICBxdWlkICAgICAgIAkiNDFGNTY2REIwMjUxIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2plY3ROYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUY1NjdGRDAyM0EiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEZXBlbmRlbnRNb2R1bGUiDQotCSAgICBxdWlkICAgICAgIAkiNDFGNkMyNEIwMjNEIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImhhbmRsZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMTQ1RjAwMUM5Ig0KLQkJICAgIHR5cGUgICAgICAgCSJVUkkiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcGxveWVkUGF0aCINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMTQ1RkEwMDE1Ig0KLQkJICAgIHR5cGUgICAgICAgCSJVUkkiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcGVuZGVuY3lUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MjAzOTI0MzAxNkUiDQotCQkgICAgdHlwZSAgICAgICAJIkRlcGVuZGVuY3lUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MjAzOTRGNTAxODUiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRGVwZW5kZW5jeVR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiNDIwMzk0RjUwMTg1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfHVzZXM9MA0KLXxjb25zdW1lcz0xDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MjAzOTkzODAxOEQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdW1lcyINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMzlBNkUwMTM5Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBxdWlkICAgICAgIAkiNDFFM0UxNEIwMUUzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInJlc291cmNlcyINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFM0UxNEQwMzFEIg0KLQkJICAgIGxhYmVsICAgICAgCSJyZXNvdXJjZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjY3MDAzOSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uKiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIm1vZHVsZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFM0UxNEQwMzFGIg0KLQkJICAgIGxhYmVsICAgICAgCSJtb2R1bGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY1ODAxRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIg0KLQkgICAgcXVpZCAgICAgICAJIjQxRUMxRDk4MDJDMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtb2R1bGVUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUVDMUQ5OTAyNDEiDQotCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZVR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6TW9kdWxlVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFQzFENTEwM0UyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRUMxRDk5MDI0MyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpXb3JrYmVuY2hNb2R1bGUiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjU4MDFGQSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyINCi0JICAgIHF1aWQgICAgICAgCSI0MUY1NjcyMDAwRTgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAid29ya2JlbmNoTW9kdWxlcyINCi0JCSAgICBxdWlkICAgICAgIAkiNDFGNTY3MjEwMTExIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3b3JrYmVuY2hNb2R1bGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFM0RGNTgwMUZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4qIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNCINCi0JCSAgICBxdWlkICAgICAgIAkiNDFGNTY3MjEwMTEzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OlByb2plY3RNb2R1bGVzIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjZEQjAyNTEiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiDQotCSAgICBxdWlkICAgICAgIAkiNDIwMTQ2QTUwMkUyIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm1vZHVsZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjQyMDE0NkE2MDI3RiINCi0JCSAgICBsYWJlbCAgICAgIAkibW9kdWxlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpEZXBlbmRlbnRNb2R1bGUiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRjZDMjRCMDIzRCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uKiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2Ig0KLQkJICAgIHF1aWQgICAgICAgCSI0MjAxNDZBNjAyODEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY1ODAxRkEiKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCSAgICBxdWlkICAgICAgIAkiNDFFM0RGMDYwMjEwIg0KLQkgICAgdGl0bGUgICAgICAJIk1haW4iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMTAwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpVUkkiIEAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTIwLCAxNjQ4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMTQ2MCwgMTU4OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk5MjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlVSSSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMTQ2MCwgMTUzOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTkyMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFQzI2REEwMjdBIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDE0NjAsIDE2NTApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk5MjUpDQotCQkgICAgd2lkdGggICAgICAJOTM4DQotCQkgICAgaGVpZ2h0ICAgICAJMjQyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAyDQotCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgMTI2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDE3NiwgMTA1NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTgNCi0JCQltYXhfd2lkdGggIAk1MDgNCi0JCQlsYWJlbCAgICAgIAkNCi18VGhlIG1vZHVsZSAiaGFuZGxlIiBVUkkgd2lsbCBjb250YWluIHRoZSBzcGVjaWFsIE1vZHVsZSBwcm90b2NvbCwgcHJvamVjdCBuYW1lLCBhbmQgbW9kdWxlIGlkZW50aWZpZXIsIGFuZCB3aWxsIGJlIGZ1bGx5IHJlc29sdmVkIHRvIGEgZnVsbCBwbGF0Zm9ybSBVUkkNCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJNTY4DQotCQkgICAgaGVpZ2h0ICAgICAJNDMxKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk5MiwgMTc0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDcxNCwgMTYxMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldvcmtiZW5jaE1vZHVsZVJlc291cmNlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFM0RGNjcwMDM5Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDcxNCwgMTY3NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTUzMSkNCi0JCSAgICB3aWR0aCAgICAgIAk1NzQNCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6TW9kdWxlVHlwZSIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4NTYsIDExMzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgxNTA5LCAxMDMwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTW9kdWxlVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMxRDUxMDNFMiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgxNTA5LCAxMDkxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNzAwKQ0KLQkJICAgIHdpZHRoICAgICAgCTcxMg0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpQcm9qZWN0TW9kdWxlcyIgQDUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQxNiwgMzY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUNCi0JCQlsb2NhdGlvbiAgIAkoMjA0LCAyODcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDI0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQcm9qZWN0TW9kdWxlcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRjU2NkRCMDI1MSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANQ0KLQkJCWxvY2F0aW9uICAgCSgyMDQsIDM0OCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQzMSkNCi0JCSAgICB3aWR0aCAgICAgIAk0NDINCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6RGVwZW5kZW50TW9kdWxlIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgNDgwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoMTQ3MCwgMzQ5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTcwOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVwZW5kZW50TW9kdWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDFGNkMyNEIwMjNEIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDE0NzAsIDQxMCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTcxNSkNCi0JCSAgICB3aWR0aCAgICAgIAk3MjYNCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlIiBANw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCA3NTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSg3MTIsIDY0NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldvcmtiZW5jaE1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjU4MDFGQSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSg3MTIsIDcwNykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTQ3MSkNCi0JCSAgICB3aWR0aCAgICAgIAk0ODINCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAOA0KLQkJICAgIGxvY2F0aW9uICAgCSg5NDAsIDEyMzUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzRTE0QjAxRTMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVzb3VyY2VzIiBAOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ2MCwgMzU1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwDQotCQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3NSwgMTUwMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIxNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVzb3VyY2VzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyNjc3Ng0KLQkJCQloZWlnaHQgICAgIAkxMzUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDFFM0UxNEQwMzFEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk0MCwgMTIzNSkNCi0JCQkJKDk0MCwgMTYwMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NDAsIDEyMzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NDAsIDE2MDEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExDQotCQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCQlsb2NhdGlvbiAgIAkoODYxLCAxNDk1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43MTAzODMNCi0JCQkJaGVpZ2h0ICAgICAJNzkNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1vZHVsZSIgQDEyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDYwLCAzNTUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTA0MywgOTcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittb2R1bGUiDQotCQkJCXBjdERpc3QgICAgCTAuNzIwODI0DQotCQkJCWhlaWdodCAgICAgCTEwMw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUUzRTE0RDAzMUYiDQotCQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTQwLCAxMjM1KQ0KLQkJCQkoOTQwLCA4NzApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQwLCAxMjM1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTQwLCA4NzApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0DQotCQkJCVBhcmVudF9WaWV3IAlAMTINCi0JCQkJbG9jYXRpb24gICAJKDg2OCwgOTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43MDkzODINCi0JCQkJaGVpZ2h0ICAgICAJNzMNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMSIgQDE1DQotCQkgICAgbG9jYXRpb24gICAJKDE2MzQsIDc5MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMxRDk4MDJDMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGVUeXBlIiBAMTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgLTEzNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNw0KLQkJCQlQYXJlbnRfVmlldyAJQDE2DQotCQkJCWxvY2F0aW9uICAgCSgyMDEwLCA5NzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21vZHVsZVR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuOTExNTczDQotCQkJCWhlaWdodCAgICAgCTE1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ5OTAyNDEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNQ0KLQkJCSAgICBzdXBwbGllciAgIAlANA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2MzQsIDc5MSkNCi0JCQkJKDE4NTcsIDc5MSkNCi0JCQkJKDE4NTcsIDEwMTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYzNCwgNzkxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg1NywgMTAxOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTgwNCwgOTcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIiIEAxOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjk4LCAtMTM3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQxRUMxRDk5MDI0MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE1DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTYzNCwgNzkxKQ0KLQkJCQkoMTE4NSwgNzkxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MzQsIDc5MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExODUsIDc5MSkpKSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMjANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAyDQotCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNjU3LCAxMDQ4KQ0KLQkJCSg4MjksIDg3MCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAMjENCi0JCSAgICBsb2NhdGlvbiAgIAkoMzk5LCA2OTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjcyMDAwRTgiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAid29ya2JlbmNoTW9kdWxlcyIgQDIyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjENCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMywgNDAzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzDQotCQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQkJbG9jYXRpb24gICAJKDQ3NiwgNzQ3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzczDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3b3JrYmVuY2hNb2R1bGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjI1MzI4OQ0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjcyMTAxMTEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMQ0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM5OSwgNjkxKQ0KLQkJCQkoNzAzLCA2OTEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzk5LCA2OTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDMsIDY5MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA2MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5Mjc2Mw0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDI1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjENCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMywgNDAzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQxRjU2NzIxMDExMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDIxDQotCQkJICAgIHN1cHBsaWVyICAgCUA1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzk5LCA2OTEpDQotCQkJCSgzMjUsIDY5MSkNCi0JCQkJKDMyNSwgNDYxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM5OSwgNjkxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzI1LCA0NjEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDI2DQotCQkgICAgbG9jYXRpb24gICAJKDEzMjIsIDYzMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjQyMDE0NkE1MDJFMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGVzIiBAMjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDkwLCAtNzExKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4DQotCQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQkJbG9jYXRpb24gICAJKDEzNjcsIDU0NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbW9kdWxlcyINCi0JCQkJcGN0RGlzdCAgICAJMC40NzU3MzYNCi0JCQkJaGVpZ2h0ICAgICAJNzINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDIwMTQ2QTYwMjdGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzIyLCA2MzMpDQotCQkJCSgxNDYwLCA1ODkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5DQotCQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQkJbG9jYXRpb24gICAJKDE0MjcsIDY2MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNjM2MDc3DQotCQkJCWhlaWdodCAgICAgCTU5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2IiBAMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDkwLCAtNzExKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQyMDE0NkE2MDI4MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI2DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMyMiwgNjMzKQ0KLQkJCQkoMTE4NSwgNjc1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMzENCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc4NCwgNDE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxDQotCQkJbG9jYXRpb24gICAJKDIzODcsIDE2NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTEwDQotCQkJbWF4X3dpZHRoICAJNzU5DQotCQkJbGFiZWwgICAgICAJDQotfFRoZSBkZXBlbmRlbnQgbW9kdWxlICJoYW5kbGUiIG11c3QgYmUgcmVzb2x2YWJsZSB0byBhIFdvcmtiZW5jaE1vZHVsZS4NCi18DQotfFRoZSBEZXBsb3llZFBhdGggc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVmZXJlbmNlZCBtb2R1bGUgaW4gdGhpcyBkZXBsb3ltZW50IHN0cnVjdHVyZS4NCi18DQotfFRoZSBkZXBlbmRlbmN5VHlwZSBzcGVjaWZpZXMgaG93IHRoZSBkZXBlbmRlbnQgbW9kdWxlIGlzIGFzc2VtYmxlZC4NCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJODE5DQotCQkgICAgaGVpZ2h0ICAgICAJNTEzKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpEZXBlbmRlbmN5VHlwZSIgQDMyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNTYwLCA5NDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQlsb2NhdGlvbiAgIAkoMjM4NywgODYwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM0Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVwZW5kZW5jeVR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMg0KLQkJCWxvY2F0aW9uICAgCSgyMzg3LCA4MTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQyMDM5NEY1MDE4NSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQlsb2NhdGlvbiAgIAkoMjM4NywgOTIxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjM3KQ0KLQkJICAgIHdpZHRoICAgICAgCTM2NA0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAzMw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDYNCi0JCSAgICBzdXBwbGllciAgIAlAMzENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjE4NywgNDU1KQ0KLQkJCSgyMzc0LCA0NDMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzIzZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtb2R1bGVjb3JlIgotICAgIG5zVVJJPSJtb2R1bGVjb3JlLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2JlbmNoTW9kdWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFuZGxlIiBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlcGxveWVkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlL21vZHVsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTW9kdWxlVHlwZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RlcGVuZGVudE1vZHVsZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvdXJjZVBhdGgiIGVUeXBlPSIjLy9VUkkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwbG95ZWRQYXRoIiBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1c2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZHVsZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtiZW5jaE1vZHVsZSIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dvcmtiZW5jaE1vZHVsZS9yZXNvdXJjZXMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTW9kdWxlVHlwZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGFkYXRhUmVzb3VyY2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1VSSSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb2R1bGVUeXBlSWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVVJJIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2plY3RNb2R1bGVzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2JlbmNoTW9kdWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrYmVuY2hNb2R1bGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlcGVuZGVudE1vZHVsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhhbmRsZSIgZVR5cGU9IiMvL1VSSSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXBsb3llZFBhdGgiIGVUeXBlPSIjLy9VUkkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwZW5kZW5jeVR5cGUiIGVUeXBlPSIjLy9EZXBlbmRlbmN5VHlwZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRlcGVuZGVuY3lUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJ1c2VzPTAmI3hEOyYjeEE7Y29uc3VtZXM9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0idXNlcyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29uc3VtZXMiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLm1kbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5YjRjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4ODM5ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNTANCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4zLjA0MDcuMjgwMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3Ig0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiSURFIg0KLQkgICAgdmFsdWUgICAgICAJIkludGVybmFsIEVkaXRvciIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIg0KLQkgICAgdmFsdWUgICAgICAJIiIpKQ0KLSAgICBxdWlkICAgICAgIAkiM0EwQjI0NzQwMjVGIg0KLSAgICBlbmZvcmNlQ2xvc3VyZUF1dG9Mb2FkIAlGQUxTRQ0KLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzDQotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMA0KLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMA0KLQl0b3BNYXJnaW4gIAkwLjI1MDAwMA0KLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwDQotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMA0KLQljbGlwSWNvbkxhYmVscyAJVFJVRQ0KLQlhdXRvUmVzaXplIAlUUlVFDQotCXNuYXBUb0dyaWQgCVRSVUUNCi0JZ3JpZFggICAgICAJMTYNCi0JZ3JpZFkgICAgICAJMTYNCi0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udA0KLQkgICAgc2l6ZSAgICAgICAJMTANCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JICAgIGJvbGQgICAgICAgCUZBTFNFDQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCSAgICBjb2xvciAgICAgIAkwDQotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQlzaG93TWVzc2FnZU51bSAJMQ0KLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQ0KLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpDQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjZBIg0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQjI0NzkwMzM5Ig0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI2OSINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciDQotCXF1aWR1ICAgICAgCSIzQTBCMjQ3NDAyN0QiDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJtb2R1bGVDb3JlIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uXFxyb3NlXFxtb2R1bGVDb3JlLmNhdCINCi0JCXF1aWQgICAgICAgCSIzQTBEQjY4QjAwNDYiKSkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiUGFja2FnZVZpZXciDQotCQlxdWlkICAgICAgIAkiM0EwQjI0NzkwMzYwIg0KLQkJdGl0bGUgICAgICAJIlBhY2thZ2VWaWV3Ig0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTY1MA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlIiBAMQ0KLQkJCWxvY2F0aW9uICAgCSgzNTIsIDMyMCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxDQotCQkJICAgIGxvY2F0aW9uICAgCSgyMDgsIDIzNikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkibW9kdWxlQ29yZSIpDQotCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzQTBEQjY4QjAwNDYiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkNCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI3RCINCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc5MDMzOCINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpDQotCWNhdGVnb3J5ICAgCSJMb2dpY2FsIFZpZXciDQotCXF1aWR1ICAgICAgCSI0MUVDMUMzQjAwQTQiKQ0KLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMNCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI3RSINCi0JUHJvY3NORGV2cyAJKGxpc3QNCi0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciDQotCQlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjkxIg0KLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzDQotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkicm9zZUlkIg0KLQkJdmFsdWUgICAgICAJIjc1MzExNzU0MCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJLTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIg0KLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIxIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMyINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjUiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVCYWNrdXBGaWxlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIHN5bmNocm9uaXplIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJSZXZlcnNlIGVuZ2luZWVyaW5nIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOZXZlciBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5Ig0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkhlYWRlclNvdXJjZUZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5U291cmNlRmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFOU0kgQysrIEV2ZW50IFdhdGNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBTlNJQ29udmVydCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBODNfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQWNjZXNzIg0KLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQb2x5bW9ycGhpY1VuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUFjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJBXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJUaGVfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUVxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkxpbWl0ZWRQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiDQotCQkJCXZhbHVlICAgICAgCTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvblJldHVybiINCi0JCQkJdmFsdWUgICAgICAJMjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBOTVfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJUeXBlSW1wbGVtZW50YXRpb25TZXQiIDIwOCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUNvbnRyb2xTZXQiIDIyNSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29udHJvbGxlZF8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZURlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IiAyMDkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRLaW5kUGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7Y2xhc3N9X1JlY29yZF9LaW5kcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzTGltaXRlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGUiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQ2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk1heWJlQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IiAxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudENsYXNzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU3VwZXJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheUluZGV4RGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiUG9zaXRpdmUgcmFuZ2UgPD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRoaXMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvcHkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJGcmVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUeXBlRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVFcXVhbGl0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cXVvdGV9PSR7cXVvdGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFnZ2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMjEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNaXhpbiINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUYXNrIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVUeXBlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk11bHRpcGxlVHlwZXMiDQotCQkJCXZhbHVlICAgICAgCTIxMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVW5jb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJMjE0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTIyNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5pdGlhbGl6YXRpb25Pbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRGaW5hbGl6YXRpb25Pbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMjI4KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyINCi0JCQkJdmFsdWUgICAgICAJMjI5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBdXRvIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5jb21wbGV0ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmNvbXBsZXRlVHlwZVNldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluY29tcGxldGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJOb0Rpc2NyaW1pbmFudFBhcnQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlVua25vd25EaXNjcmltaW5hbnRQYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJLbm93bkRpc2NyaW1pbmFudFBhcnQiDQotCQkJCXZhbHVlICAgICAgCTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNQcml2YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGluZyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlckNsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUJhcnJpZXJDb25kaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlRydWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmdBc0JvZHkiDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Q2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTIxNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJwcm9qZWN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSm9pbkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFyZ2V0RGF0YWJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWF1bHQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJCdWZmZXJQb29sIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZW50U2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIg0KLQkJCXZhbHVlICAgICAgCTEpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTWFuYWdlZEJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbVNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb290U2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRhdGFiYXNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEQk1TIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1ZpZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU1BQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3lub255bW5zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tPcHRpb24iDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvcnJlbGF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTbmFwU2hvdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1BhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9JRCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JvdyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSINCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImZyYW1ld29yayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9vdERpciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTSINCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdW4iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJNaWNyb3NvZnQiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJJQk0iDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIm1fIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJzXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJ2b2lkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIg0KLQkJCXZhbHVlICAgICAgCTMpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vdFNob3dSb3NlSUREbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSb3NlSUQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVmZXJlbmNlQ2xhc3NwYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZBSmF2YVdvcmtpbmdGb2xkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlbW90ZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZW1vdGVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSG9tZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJIb21lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJEVERMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNlcnZsZXRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdEoyRUVKYXZhZG9jIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZUphdmFEb2NUYWdzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkxvY2FsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkxvY2FsU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbEhvbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU291cmNlQ29udHJvbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTQ0NTZWxlY3RlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0U291cmNlUm9vdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTQ0NDb21tZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiDQotCQkJCXZhbHVlICAgICAgCTY1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMi4wIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMS54Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0NvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIl9JRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTkwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTE5MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiDQotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQUZURVIiDQotCQkJCXZhbHVlICAgICAgCTE4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiDQotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUk9XIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCINCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIjYiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlIyRWRpdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ29tcG9uZW50VGVzdCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiY29tcGlsZXIyLjFfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiDQotCQkJdmFsdWUgICAgICAJImNsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiDQotCQkJCXZhbHVlICAgICAgCTIwNikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWJzdHJhY3RCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjaWFsRGVjbFJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmREZWNsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGVudCINCi0JCQl2YWx1ZSAgICAgIAkyKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciINCi0JCQkJdmFsdWUgICAgICAJNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlS2luZHMiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZW51bSINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkicmVjb3JkIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtb2R1bGUiDQotCQkJCXZhbHVlICAgICAgCTEwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZGlzcGludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiY29jbGFzcyINCi0JCQkJdmFsdWUgICAgICAJMTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJCXZhbHVlICAgICAgCTEwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInVuaW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtYXgiDQotCQkJCXZhbHVlICAgICAgCTEwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkia2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVLaW5kcyIgMTA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInV1aWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImRsbG5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhbGlhcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJmaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxpYnJhcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwZmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkibGNpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiDQotCQkJCXZhbHVlICAgICAgCTIxMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjAiDQotCQkJCXZhbHVlICAgICAgCTIyMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjEiDQotCQkJCXZhbHVlICAgICAgCTIyNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nIg0KLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlRleHQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEJvZHkiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVZhbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJ5UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbUFycmF5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcG9ydFJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlF1aWNrSW1wb3J0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiV2ViIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVudGl0eV9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJJbnRlcm5hbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlckVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9QdWJsaWNJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudFBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNsZWFyQ2FzZSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJlcXVpc2l0ZVBybyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlNvREEiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJUb3BMaW5rIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIi5jcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiDQotCQkJdmFsdWUgICAgICAJOCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTQpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAktMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk4MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiDQotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIxIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMyINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjUiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVCYWNrdXBGaWxlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIHN5bmNocm9uaXplIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJSZXZlcnNlIGVuZ2luZWVyaW5nIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOZXZlciBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjMyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQotCQkJCXZhbHVlICAgICAgCTIzMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIzMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRlcGxveSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtRGlyZWN0aW9uVHlwZVNldCIgMTAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1EaXJlY3Rpb25UeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiaW4iDQotCQkJCXZhbHVlICAgICAgCTEwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiaW5vdXQiDQotCQkJCXZhbHVlICAgICAgCTEwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkib3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDQpKSkpKSkNCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI3RiIpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2FkYXB0ZXJGYWN0b3J5LmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9hZGFwdGVyRmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDEwMGRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2FkYXB0ZXJGYWN0b3J5LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iIGlkPSJhZGFwdGVyRmFjdG9yeSIgbmFtZT0iQWRhcHRlciBGYWN0b3J5IEV4dGVuc2lvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYW4gYWRhcHRlciBmYWN0b3J5IHdpdGggdGhlIGR5bmFtaWMgYWRhcHRlciBmYWN0b3J5Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWRhcHRlckZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImFkYXB0ZXJGYWN0b3J5Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBBZGFwdGVyIEZhY3RvcnkgYmVpbmcgYWRkZWQuIEFsbCBhZGRlZCBBZGFwdGVyIEZhY3RvcmllcyBhcmUgcXVlcmlhYmxlIHdoZW5ldmVyIHRoZWlyIEZ1bmN0aW9uIEdyb3VwIGFuZCBvcHRpb25hbCBWaWV3ZXIgSWQgYXJlIHNwZWNpZmllZC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2aWV3IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2VVUkkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHBhY2thZ2UgVVJJIHRoYXQgeW91IGFyZSBleHRlbmRpbmcgKGZvciBleGFtcGxlICZxdW90O2VqYi54bWkmcXVvdDspDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQWRhcHRlciBGYWN0b3J5IGV4dGVuc2lvbi4gIFRoaXMgd2lsbCBhc3NvY2lhdGUgaXQgd2l0aCBvbmUgb3IgbW9yZSBmdW5jdGlvbiBncm91cHMgYmFzZWQgb24gdGhlIGZ1bmN0aW9uIGdyb3VwIHBhdHRlcm5zLiAgRnVuY3Rpb24gR3JvdXBzIGFsbG93IENvbnRlbnQgYW5kIEFjdGlvbnMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBiYXNlZCBvbiBwcm9qZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uLiBHZW5lcmFsbHksIHRoZXkgYXJlIHVzZWQgYnkgdmVuZG9ycyB3aG8gd2lzaCB0byBhZGQgZnVuY3Rpb25hbGl0eSBzcGVjaWZpYyB0byB0aGVpciBwcm9kdWN0cywgZS5nLiBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlcnMuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uR3JvdXBJRCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InZpZXciPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIHZpZXdlciBJZCB3aGljaCB3aWxsIGxpbWl0IHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBkZWZpbmVkIEFkYXB0ZXIgRmFjdG9yeSB0byB0aGUgZ2l2ZW4gdmlld2VyIGlkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWwuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2VkaXRNb2RlbC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc0M2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2VkaXRNb2RlbC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBpZD0iZWRpdE1vZGVsIiBuYW1lPSJFTUYgUmVzb3VyY2UgRWRpdCBNb2RlbCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBFZGl0IG1vZGVscyBwcm92aWRlIGEgZnJhbWV3b3JrIGZvciBtYW5hZ2luZyBhIHNldCBvZiBFTUYgcmVzb3VyY2VzIHdpdGhpbiBhIHVuaXQgb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIHdvcmtzcGFjZSBvcGVyYXRpb24gbWF5IGFmZmVjdCBhIGNoYW5nZSB0byBtdWx0aXBsZSBFTUYgcmVzb3VyY2VzLiBFZGl0IG1vZGVscyBwcm92aWRlIGJhc2ljIHNlcnZpY2VzIHN1Y2ggYXMgbG9hZHMsIHNhdmVzICh3aGVuIG5lY2Vzc2FyeSksIGFuZCB2YWxpZGF0ZSBlZGl0IGZvciB0aGUgbWFuYWdlZCByZXNvdXJjZXMuICBFZGl0IG1vZGVscyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQsIHRoZXJlZm9yZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBhbiBlZGl0IG1vZGVsIGNhbiBiZSBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBvcGVyYXRpb24gb3IgZWRpdG9yLiAgQnkgZGVjbGFyaW5nIGFuIGVkaXQgbW9kZWwsIGEgcGx1Z2luIHByb3ZpZGVyIGVuYWJsZXMgb3RoZXIgY29tcG9uZW50cyB0byBjb250cmlidXRlIHJlc291cmNlcyB0byBiZSBtYW5hZ2VkIGJ5IHRoYXQgZWRpdCBtb2RlbC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRNb2RlbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdE1vZGVsIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBUaGUgZGVjbGFyYXRpb24gZm9yIGFuIGVkaXQgbW9kZWwgdG8gYmUgdXNlZCBpbiB0aGUgd29ya3NwYWNlLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRNb2RlbFJlc291cmNlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVkaXRNb2RlbElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlZGl0IG1vZGVsLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgZmFjdG9yeSBjbGFzcyB0aGF0IGlzIHVzZWQgZm9yIHRoaXMgZWRpdCBtb2RlbC4gIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkmbHQ7L2NvZGUmZ3Q7LiBJZiBub25lIGlzIHNwZWNpZmllZCwgdGhlbiBhIGdlbmVyaWMgJmx0O2NvZGUmZ3Q7RWRpdE1vZGVsJmx0Oy9jb2RlJmd0OyBpcyBjcmVhdGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2FkVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHkiIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnRNb2RlbElEIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdE1vZGVsUmVzb3VyY2UiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoaXMgaXMgYW4gaW5kaXZpZHVhbCBjb250cmlidXRpb24gb2YgYSByZXNvdXJjZSB0byB0aGUgZWRpdCBtb2RlbC4gIElmIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgVVJJIGlzIHJlZ2lzdGVyZWQgYWdhaW5zdCBhbiBlZGl0IG1vZGVsIGlkLCB0aGUgcmVzb3VyY2UgaXMgc3RpbGwgb25seSBsb2FkZWQgb25jZS4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlVSSSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgVVJJIG9mIHRoZSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBjb250YWluZXIgZnJvbSB3aGljaCBFTUYgcmVzb3VyY2VzIGFyZSBsb2FkZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9sb2FkIiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgSW5kaWNhdG9yIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGlzIHJlc291cmNlIHNob3VsZCBiZSBhdXRvbG9hZGVkIHdoZW4gdGhlIGVkaXQgbW9kZWwgaXMgY3JlYXRlZCwgb3Igd2hlbiBhbiBJRmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcmVzb3VyY2UgaXMgYWRkZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0gICANCi0gICA8ZWxlbWVudCBuYW1lPSJyZXNvdXJjZUV4dGVuc2lvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhpcyBhbGxvd3MgcmVnaXN0cmF0aW9uIG9mIGZpbGVzIGZvciBhdXRvbG9hZGluZyBhY2NvcmRpbmcgdG8gZmlsZSBleHRlbnNpb24uDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBmaWxlIGV4dGVuc2lvbiBpdHNlbGYgKCZxdW90O215eG1pJnF1b3Q7KQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9JnF1b3Q7ZWRpdE1vZGVsLmFjbWUucGFyZW50JnF1b3Q7DQotICAgICAgICAgbmFtZT0mcXVvdDtBY21lIFBhcmVudCBFZGl0IE1vZGVsJnF1b3Q7DQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtlZGl0TW9kZWwNCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0mcXVvdDtjb20uYWNtZS5hY21lcHJvLnBhcmVudC5lZGl0TW9kZWwmcXVvdDsNCi0gICAgICAgICAgICBmYWN0b3J5Q2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSZxdW90OyZndDsNCi0gICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL3Jlc291cmNlMC54bWwmcXVvdDsvJmd0Ow0KLSAgICAgICAgJmx0O2VkaXRNb2RlbFJlc291cmNlIFVSST0mcXVvdDtESVIvcmVzb3VyY2UxLnhtbCZxdW90Oy8mZ3Q7DQotICAgICAgJmx0Oy9lZGl0TW9kZWwmZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotDQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIGlkPSZxdW90O2VkaXRNb2RlbC5hY21lLmNoaWxkJnF1b3Q7DQotICAgICAgICAgbmFtZT0mcXVvdDtBY21lIENoaWxkIEVkaXQgTW9kZWwmcXVvdDsNCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWwmcXVvdDsmZ3Q7DQotICAgICAgJmx0O2VkaXRNb2RlbA0KLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSZxdW90O2NvbS5hY21lLmFjbWVwcm8uY2hpbGQuZWRpdE1vZGVsJnF1b3Q7DQotICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkmcXVvdDsNCi0gICAgICAgICAgICBwYXJlbnRNb2RlbElEPSZxdW90O2NvbS5hY21lLmFjbWVwcm8ucGFyZW50LmVkaXRNb2RlbCZxdW90OyZndDsNCi0gICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL3Jlc291cmNlMi54bWwmcXVvdDsvJmd0Ow0KLSAgICAgICAgJmx0O2VkaXRNb2RlbFJlc291cmNlIFVSST0mcXVvdDtESVIvcmVzb3VyY2UzLnhtbCZxdW90Oy8mZ3Q7DQotICAgICAgJmx0Oy9lZGl0TW9kZWwmZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgRWRpdCBNb2RlbHMgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQmbHQ7L2NvZGUmZ3Q7Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWxFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2ZDJhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWxFeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgaWQ9ImVkaXRNb2RlbEV4dGVuc2lvbiIgbmFtZT0iRWRpdCBNb2RlbCBFeHRlbnNpb25zIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBFZGl0IE1vZGVsIEV4dGVuc2lvbiBhbGxvd3MgdGhpcmQgcGFydGllcyB0byBjb250cmlidXRlIGV4cGVjdGVkIHJlc291cmNlcyB0byBFZGl0IE1vZGVscy4gVGhlIGZ1bmN0aW9uR3JvdXBJRCBhbGxvd3MgdXNlcnMgdG8gc2VsZWN0IHdoaWNoIGV4dGVuc2lvbnMgdGhleSBjaG9vc2UgdG8gaGF2ZSBlbmFibGVkLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImVkaXRNb2RlbC5leHNkIi8+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdE1vZGVsRXh0ZW5zaW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJlZGl0TW9kZWxFeHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIEVkaXQgbW9kZWwgZXh0ZW5zaW9ucyBhbGxvdyBjb21wb25lbnRzIHRvIGNvbnRyaWJ1dGUga25vd24gcmVzb3VyY2UgVVJJcyB0byBhbiBlZGl0IG1vZGVsLiAgV2hlbmV2ZXIgYW4gZWRpdCBtb2RlbCBpcyBsb2FkZWQsIHRoZSByZXNvdXJjZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGxvYWRlZCBhbmQgbWFuYWdlZCBieSB0aGUgZWRpdCBtb2RlbC4gIENoYW5nZXMgdG8gdGhlIHJlc291cmNlcyB3aWxsIGJlIHRyYWNrZWQgYW5kIHNhdmVkIGR1cmluZyBvcGVyYXRpb25zIG9yIGVkaXRvciBzYXZlcy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0TW9kZWxSZXNvdXJjZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlZGl0TW9kZWxJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBlZGl0IG1vZGVsIGJlaW5nIGV4dGVuZGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uLiAgVGhpcyB3aWxsIGJlIHVzZWQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBmdW5jdGlvbiBncm91cCBwYXR0ZXJuIGJpbmRpbmcuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxFeHRlbnNpb24mcXVvdDsmZ3Q7DQotICAgICAgJmx0O2VkaXRNb2RlbEV4dGVuc2lvbg0KLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSZxdW90O29yZy5zYW1wbGUuaW5oZXJpdGFuY2UucGFyZW50LmVkaXRNb2RlbCZxdW90Ow0KLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0mcXVvdDtvcmcuc2FtcGxlLmdyb3VwJnF1b3Q7Jmd0Ow0KLSAgICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL2V4dGVuc2lvbjAueG1sJnF1b3Q7LyZndDsNCi0gICAgICAgICAmbHQ7ZWRpdE1vZGVsUmVzb3VyY2UgVVJJPSZxdW90O0RJUi9leHRlbnNpb24xLnhtbCZxdW90Oy8mZ3Q7DQotICAgICAgJmx0Oy9lZGl0TW9kZWxFeHRlbnNpb24mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9tb2RpZmllckhlbHBlckZhY3RvcnkuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL21vZGlmaWVySGVscGVyRmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2MwN2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL21vZGlmaWVySGVscGVyRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBpZD0iTW9kaWZpZXJIZWxwZXJGYWN0b3J5IiBuYW1lPSJNb2RpZmllciBIZWxwZXIgRmFjdG9yeSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIGZvciB0aGUgbW9kZWwgbW9kaWZpZXJzLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYWNrYWdlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icGFja2FnZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0idHlwZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZlYXR1cmUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZlYXR1cmUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFjdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0NvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTBjZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgNCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwgZXh0ZW5kcyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsIGltcGxlbWVudHMgQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlciB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFuSW5wdXRDb250YWluZXIpIHsKLQkJc3VwZXIoYW5JbnB1dENvbnRhaW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFDb250YWluZXIKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFDb250YWluZXIsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKLQkJc3VwZXIoYUNvbnRhaW5lciwgYVN5bmNocm9uaXplcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYW5PdXRwdXRDb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhbklucHV0Q29udGFpbmVyLCBJQ29udGFpbmVyIGFuT3V0cHV0Q29udGFpbmVyKSB7Ci0JCXN1cGVyKGFuSW5wdXRDb250YWluZXIsIGFuT3V0cHV0Q29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgotCSAqIEBwYXJhbSBhbk91dHB1dENvbnRhaW5lcgotCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYW5JbnB1dENvbnRhaW5lciwgSUNvbnRhaW5lciBhbk91dHB1dENvbnRhaW5lciwgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcikgewotCQlzdXBlcihhbklucHV0Q29udGFpbmVyLCBhbk91dHB1dENvbnRhaW5lciwgYVN5bmNocm9uaXplcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy54bWkuaGVscGVycy5Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyI2RlTm9ybWFsaXplKFVSSSkKLQkgKi8KLQlwdWJsaWMgVVJJIGRlTm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQbGF0Zm9ybUZpbGUodXJpKTsKLQkJCWlmIChhRmlsZSAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgZmlsZVByb2plY3QgPSBhRmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJLy9JZiBpdCBpcyBub3QgaW4gdGhlIHNhbWUgcHJvamVjdCB0aGVuIGp1c3QgcmV0dXJuIHRoZSBVUkkgYXMgaXMuCi0JCQkJaWYgKHJlc291cmNlU2V0U3luY2hyb25pemVyLmdldFByb2plY3QoKSA9PSBmaWxlUHJvamVjdCkKLQkJCQkJcmV0dXJuIGdldENvbnRhaW5lclJlbGF0aXZlVVJJKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRHluYW1pY0dyb3d0aE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9EeW5hbWljR3Jvd3RoTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhOWE2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9EeW5hbWljR3Jvd3RoTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotCi1wdWJsaWMgY2xhc3MgRHluYW1pY0dyb3d0aE1vZGVsIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOSU1VTV9PUFRJTUFMX1NJWkUgPSAxMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRU1PUllfVEhSRVNISE9MRCA9IDEwMDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUNFQUJMRV9DSEFOR0UgPSA1OwotCQotCQotCS8qIFN0b3JlcyBhIEZJRk8gbGlzdCBvZiB0aGUgS2V5IHR5cGVzIChJUGF0aCkqLwotCXByaXZhdGUgZmluYWwgTGlzdCBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCi0JLyogV2UgdXNlIGFuIGludFtdIGFzIHRoZSB2YWx1ZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY3JlYXRpbmcgSW50ZWdlciBvYmplY3RzICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAvKiA8SVBhdGgsIGludFtdPiAqLyB1bmlxdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkKLQkvKioKLQkgKiBJbmplY3QgdGhlIGtleSBpbnRvIHRoZSBEeW5hbWljR3Jvd3RoTW9kZWwuIE1heSBvciBtYXkgbm90IGFmZmVjdCB0aGUgCi0JICogZHluYW1pYyBzaXplLgotCSAqCi0JICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGluamVjdCBpbnRvIHRoZSBtb2RlbAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb3B0aW1hbCBzaXplIGNoYW5nZWQgZ3JlYXRoZXIgdGhhbiB7QHZhbHVlIE5PVElDRUFCTEVfQ0hBTkdFfSBhcyBhIHJlc3VsdCBvZiB0aGUgaW5qZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpbmplY3RLZXkoSVBhdGgga2V5KSB7Ci0JCQotCQlpbnQgb3JpZ2luYWxTaXplID0gZ2V0T3B0aW1hbFNpemUoKTsKLQkJCi0JCWludFtdIGNvdW50ID0gbnVsbDsKLQkJaWYoIChjb3VudCA9IChpbnRbXSkgdW5pcXVlc01hcC5nZXQoa2V5KSkgIT0gbnVsbCApIHsKLQkJCS8qIGluY3JlbWVudCB0aGUgY291bnQgKi8KLQkJCSsrY291bnRbMF07Ci0JCX0gZWxzZSB7Ci0JCQkvKiBpbnNlcnQgdGhlIGZpcnN0IGNvdW50ICovCi0JCQl1bmlxdWVzTWFwLnB1dChrZXksIGNvdW50ID0gbmV3IGludFtdIHsgMSB9ICk7Ci0JCX0KLQkJCi0JCWlmKCBxdWV1ZS5zaXplKCkgPT0gTUVNT1JZX1RIUkVTSEhPTEQgKSB7Ci0JCQkKLQkJCS8qIHRha2UgdGhlIG9sZGVzdCB2YWx1ZSBvZmYgdGhlIHF1ZXVlICovCi0JCQlJUGF0aCBvbGRlc3RLZXkgPSAoSVBhdGgpIHF1ZXVlLnJlbW92ZSgwKTsKLQkJCQotCQkJLyogZGV0ZXJtaW5lIGlmIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIG9sZGVzdCBrZXkgaXMgc3RpbGwgaW4gdGhlIHF1ZXVlICovCi0JCQljb3VudCA9IChpbnRbXSkgdW5pcXVlc01hcC5nZXQob2xkZXN0S2V5KTsKLQkJCUFzc2VydC5pc05vdE51bGwoY291bnQpOwotCQkJCi0JCQkvKiBSZWR1Y2UgdGhlIGNvdW50ICovCi0JCQljb3VudFswXSAtPSAxOwotCQkKLQkJCS8qIENvdW50IHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZSAqLwotCQkJQXNzZXJ0LmlzVHJ1ZShjb3VudFswXSA+PSAwKTsKLQkJCQotCQkKLQkJCS8qIFRoaXMgdW5pcXVlIGtleSBpcyBubyBsb25nZXIgaW4gdGhlIHF1ZXVlKi8KLQkJCWlmKGNvdW50WzBdID09IDApIHsKLQkJCQl1bmlxdWVzTWFwLnJlbW92ZShvbGRlc3RLZXkpOwotCQkJfQotCQkJCi0JCQkKLQkJCQotCQl9Ci0JCS8qIEFkZCB0aGUgbmV3S2V5IHRvIGVuZCBvZiB0aGUgbGlzdCovCi0JCXF1ZXVlLmFkZChrZXkpOwotCQkKLQkJcmV0dXJuIE1hdGguYWJzKCBvcmlnaW5hbFNpemUgLSBnZXRPcHRpbWFsU2l6ZSgpICkgPiBOT1RJQ0VBQkxFX0NIQU5HRTsKLQotCX0KLQkKLQkvKioKLQkgKiBUaGUgb3B0aW1hbCBzaXplIGlzIGFuIGludGVnZXIgZnJvbSBbe0B2YWx1ZSAjTUlOSU1VTV9PUFRJTUFMX1NJWkV9LCB7QHZhbHVlICNNRU1PUllfVEhSRVNISE9MRH1dLiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcHRpbWFsIHNpemUgZm9yIHRoZSBMUlUgQ2FjaGUuICAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wdGltYWxTaXplKCkgewkJCi0JCXJldHVybiB1bmlxdWVzTWFwLnNpemUoKSA+IE1JTklNVU1fT1BUSU1BTF9TSVpFID8gdW5pcXVlc01hcC5zaXplKCkgOiBNSU5JTVVNX09QVElNQUxfU0laRTsKLQl9Ci0KLX0JCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YzZiMzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5FZGl0TW9kZWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGw7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoQ29udGV4dCBleHRlbmRzIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGltcGxlbWVudHMgSVN5bmNocm9uaXplckV4dGVuZGVyIHsKLQotCXByaXZhdGUgTWFwIHJlYWRPbmx5TW9kZWxzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIE1hcCBlZGl0YWJsZU1vZGVscyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciByZXNvdXJjZVNldExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkgPSBmYWxzZTsKLQotCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJc3VwZXIoYVByb2plY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dCNpbml0aWFsaXplUmVzb3VyY2VTZXQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVSZXNvdXJjZVNldChQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCXN1cGVyLmluaXRpYWxpemVSZXNvdXJjZVNldChhUmVzb3VyY2VTZXQpOwotCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5IHJlZyA9IG5ldyBEZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCQlSZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkgPSBuZXcgUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsKCk7Ci0JCXJlZy5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTiwgZmFjdG9yeSk7Ci0JCS8vIGFkZCB4bWkgYmVjYXVzZSBvdGhlciBwbHVnaW5zIGFyZSByZWdpc3RlcmluZyBpdCBnbG9iYWxseQotCQlyZWcuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4bWkiLCBmYWN0b3J5KTsgLy8kTk9OLU5MUy0xJAotCQlhUmVzb3VyY2VTZXQuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkocmVnKTsKLQkJYVJlc291cmNlU2V0LmdldFN5bmNocm9uaXplcigpLmFkZEV4dGVuZGVyKHRoaXMpOyAvLyBhZGRlZCBzbyB3ZSBjYW4gYmUgaW5mb3JtZWQgb2YgY2xvc2VzCi0JCS8vIHRvIHRoZSBwcm9qZWN0LgotCQlzdGFydExpc3RlbmluZ1RvUmVzb3VyY2VTZXQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlyZXR1cm4gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDYWNoZUlEKGVkaXRNb2RlbElELCBwYXJhbXMpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIEFQSSB0aGF0IGNsaWVudHMgc2hvdWxkIHVzZSB3aGVuIHRoZXkgaGF2ZSBhbiBpbnRlbnQgdG8gbW9kaWZ5IGEgcGFydGljdWxhcgotCSAqIHJlc291cmNlLiBZb3Ugc2hvdWxkIG9ubHkgYWNjZXNzIHRoZSByZXNvdXJjZXMgdGhyb3VnaCB0aGUgSjJFRUVkaXRNb2RlbCB0aGF0IGlzIHJldHVybmVkIGJ5Ci0JICogdGhpcyBtZXRob2QgaWYgeW91IGhhdmUgdGhlIGludGVudCB0byBtb2RpZnkuCi0JICogCi0JICogQHNlZSBKMkVFRWRpdE1vZGVsCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIE9iamVjdCBhY2Nlc3NvcktleSwgTWFwIHBhcmFtcykgewotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gZ2V0RXhpc3RpbmdFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIHBhcmFtcywgZmFsc2UpOwotCQlpZiAobnVsbCA9PSBlZGl0TW9kZWwpIHsKLQkJCWVkaXRNb2RlbCA9IGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBwYXJhbXMpOwotCQkJc3luY2hyb25pemVkIChlZGl0TW9kZWwpIHsKLQkJCQljYWNoZUVkaXRNb2RlbChlZGl0TW9kZWwsIHBhcmFtcyk7Ci0JCQkJZWRpdE1vZGVsLmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZWRpdE1vZGVsLmlzRGlzcG9zZWQoKSB8fCBlZGl0TW9kZWwuaXNEaXNwb3NpbmcoKSkgewotCQkJCWVkaXRNb2RlbCA9IGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBwYXJhbXMpOwotCQkJCWNhY2hlRWRpdE1vZGVsKGVkaXRNb2RlbCwgcGFyYW1zKTsKLQkJCX0KLQkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQkJZWRpdE1vZGVsLmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjbGllbnRzIHNob3VsZCB1c2Ugd2hlbiB0aGV5IHdhbnQgdG8gcmVhZCBhIGdyb3VwIG9mIHJlc291cmNlcyB0aGF0IGFyZQotCSAqIG5vcm1hbGx5IG1hbmFnZWQgYnkgdGhlIGVkaXQgbW9kZWwgd2l0aAotCSAqIAotCSAqIEBhS2V5LiBZb3Ugc2hvdWxkIG9ubHkgYWNjZXNzIHRoZSByZXNvdXJjZXMgdGhyb3VnaCB0aGUgSjJFRUVkaXRNb2RlbCB0aGF0IGlzIHJldHVybmVkIGJ5Ci0JICogICAgICAgIHRoaXMgbWV0aG9kLiBZb3UgbXVzdCBjYWxsIHJlbGVhc2VFZGl0TW9kZWwoLi4uKSB3aGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgZWRpdAotCSAqICAgICAgICBtb2RlbC4KLQkgKiBAc2VlIEoyRUVFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgZmluYWwgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBPYmplY3QgYWNjZXNzb3JLZXksIE1hcCBwYXJhbXMpIHsKLQkJdHJ5IHsKLQkJCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBnZXRFeGlzdGluZ0VkaXRNb2RlbChlZGl0TW9kZWxJRCwgcGFyYW1zLCB0cnVlKTsKLQkJCWlmIChudWxsID09IGVkaXRNb2RlbCkgewotCQkJCWVkaXRNb2RlbCA9IGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIHBhcmFtcyk7Ci0JCQkJc3luY2hyb25pemVkIChlZGl0TW9kZWwpIHsKLQkJCQkJY2FjaGVFZGl0TW9kZWwoZWRpdE1vZGVsLCBwYXJhbXMpOwotCQkJCQlFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5nZXRJbnN0YW5jZSgpLmFjY2VzcyhlZGl0TW9kZWwpOwotCQkJCQllZGl0TW9kZWwuYWNjZXNzKGFjY2Vzc29yS2V5KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlZGl0TW9kZWwuaXNEaXNwb3NlZCgpIHx8IGVkaXRNb2RlbC5pc0Rpc3Bvc2luZygpKSB7Ci0JCQkJCWVkaXRNb2RlbCA9IGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIHBhcmFtcyk7Ci0JCQkJCWNhY2hlRWRpdE1vZGVsKGVkaXRNb2RlbCwgcGFyYW1zKTsKLQkJCQl9Ci0JCQkJc3luY2hyb25pemVkIChlZGl0TW9kZWwpIHsKLQkJCQkJRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuZ2V0SW5zdGFuY2UoKS5hY2Nlc3MoZWRpdE1vZGVsKTsKLQkJCQkJZWRpdE1vZGVsLmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVkaXRNb2RlbDsKLQkJfSBmaW5hbGx5IHsKLQkJCUVkaXRNb2RlbExlYXN0VXNlZENhY2hlLmdldEluc3RhbmNlKCkub3B0aW1pemVMUlVTaXplSWZOZWNlc3NhcnkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIEFQSSB0aGF0IGNsaWVudHMgc2hvdWxkIHVzZSB3aGVuIHRoZXkgaGF2ZSBhbiBpbnRlbnQgdG8gbW9kaWZ5IGEgcGFydGljdWxhcgotCSAqIHJlc291cmNlLiBZb3Ugc2hvdWxkIG9ubHkgYWNjZXNzIHRoZSByZXNvdXJjZXMgdGhyb3VnaCB0aGUgSjJFRUVkaXRNb2RlbCB0aGF0IGlzIHJldHVybmVkIGJ5Ci0JICogdGhpcyBtZXRob2QgaWYgeW91IGhhdmUgdGhlIGludGVudCB0byBtb2RpZnkuCi0JICogCi0JICogQHNlZSBKMkVFRWRpdE1vZGVsCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlyZXR1cm4gZ2V0RWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsSUQsIGFjY2Vzc29yS2V5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjbGllbnRzIHNob3VsZCB1c2Ugd2hlbiB0aGV5IHdhbnQgdG8gcmVhZCBhIGdyb3VwIG9mIHJlc291cmNlcyB0aGF0IGFyZQotCSAqIG5vcm1hbGx5IG1hbmFnZWQgYnkgdGhlIGVkaXQgbW9kZWwgd2l0aAotCSAqIAotCSAqIEBhS2V5LiBZb3Ugc2hvdWxkIG9ubHkgYWNjZXNzIHRoZSByZXNvdXJjZXMgdGhyb3VnaCB0aGUgSjJFRUVkaXRNb2RlbCB0aGF0IGlzIHJldHVybmVkIGJ5Ci0JICogICAgICAgIHRoaXMgbWV0aG9kLiBZb3UgbXVzdCBjYWxsIHJlbGVhc2VFZGl0TW9kZWwoLi4uKSB3aGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgZWRpdAotCSAqICAgICAgICBtb2RlbC4KLQkgKiBAc2VlIEoyRUVFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgZmluYWwgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIGFjY2Vzc29yS2V5LCBudWxsKTsKLQl9Ci0KLQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFeGlzdGluZ0VkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMsIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJaWYgKGlzUmVhZE9ubHkpIHsKLQkJCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSByZWFkT25seU1vZGVscy5nZXQoZ2V0Q2FjaGVJRChlZGl0TW9kZWxJRCwgcGFyYW1zKSk7Ci0JCQl9IGVsc2UgewotCQkJCXN5bmNocm9uaXplZCAoZWRpdGFibGVNb2RlbHMpIHsKLQkJCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgZWRpdGFibGVNb2RlbHMuZ2V0KGdldENhY2hlSUQoZWRpdE1vZGVsSUQsIHBhcmFtcykpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdE1vZGVsOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgcmVhZC1vbmx5IEoyRUVFZGl0TW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlyZXR1cm4gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCB0aGlzLCBwYXJhbXMpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgSjJFRUVkaXRNb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlyZXR1cm4gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgdGhpcywgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzE2LzIwMDEgMTI6MjU6MzkgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGNhY2hlRWRpdE1vZGVsKEVkaXRNb2RlbCBlZGl0TW9kZWwsIE1hcCBwYXJhbXMpIHsKLQkJZWRpdE1vZGVsLnNldFBhcmFtcyhwYXJhbXMpOwotCQlzeW5jaHJvbml6ZWQgKHJlYWRPbmx5TW9kZWxzKSB7Ci0JCQlpZiAoZWRpdE1vZGVsLmlzUmVhZE9ubHkoKSkKLQkJCQlyZWFkT25seU1vZGVscy5wdXQoZ2V0Q2FjaGVJRChlZGl0TW9kZWwuZ2V0RWRpdE1vZGVsSUQoKSwgcGFyYW1zKSwgZWRpdE1vZGVsKTsKLQkJCWVsc2UKLQkJCQlzeW5jaHJvbml6ZWQgKGVkaXRhYmxlTW9kZWxzKSB7Ci0JCQkJCWVkaXRhYmxlTW9kZWxzLnB1dChnZXRDYWNoZUlEKGVkaXRNb2RlbC5nZXRFZGl0TW9kZWxJRCgpLCBwYXJhbXMpLCBlZGl0TW9kZWwpOwotCQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2NhcmRBbGxFZGl0TW9kZWxzKCkgewotCQlzeW5jaHJvbml6ZWQgKHJlYWRPbmx5TW9kZWxzKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGVkaXRhYmxlTW9kZWxzKSB7Ci0JCQkJQ29sbGVjdGlvbiByZWFkT25seSA9IHJlYWRPbmx5TW9kZWxzLnZhbHVlcygpOwotCQkJCUVkaXRNb2RlbExlYXN0VXNlZENhY2hlLmdldEluc3RhbmNlKCkucmVtb3ZlQWxsQ2FjaGVkKHJlYWRPbmx5KTsKLQkJCQlkaXNjYXJkTW9kZWxzKHJlYWRPbmx5KTsKLQkJCQlkaXNjYXJkTW9kZWxzKGVkaXRhYmxlTW9kZWxzLnZhbHVlcygpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc2NhcmRNb2RlbHMoQ29sbGVjdGlvbiBlZGl0TW9kZWxzKSB7Ci0JCWlmIChlZGl0TW9kZWxzICE9IG51bGwgJiYgIWVkaXRNb2RlbHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBNYWtlIGEgY29weSBmb3Igc2FmZXR5IGFnYWluc3QgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJCUl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChlZGl0TW9kZWxzKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCSgoRWRpdE1vZGVsKSBpdC5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVkaXRNb2RlbChFZGl0TW9kZWwgZWRpdE1vZGVsLCBib29sZWFuIHJlYWRPbmx5KSB7Ci0JCS8vIFRoZSBiZXN0IHdheSB3b3VsZCBiZSB0byByZWNvbXB1dGUgdGhlIGNhY2hlIGlkLCBidXQgd2UgZG9uJ3QgY2FyZQotCQkvLyBiZWNhdXNlIHRoZSBlZGl0IG1vZGVsIHNob3VsZCBvbmx5IGJlIGNhY2hlZCBvbmNlIGFueXdheQotCQlzeW5jaHJvbml6ZWQgKHJlYWRPbmx5TW9kZWxzKSB7Ci0JCQlpZiAocmVhZE9ubHkpCi0JCQkJcmVhZE9ubHlNb2RlbHMudmFsdWVzKCkucmVtb3ZlKGVkaXRNb2RlbCk7Ci0JCQllbHNlCi0JCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgewotCQkJCQllZGl0YWJsZU1vZGVscy52YWx1ZXMoKS5yZW1vdmUoZWRpdE1vZGVsKTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgYWxsIGVkaXRNb2RlbHMgb2YgdGhlIGNoYW5nZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlFZGl0TW9kZWxzKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJaWYgKGFuRXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTGlzdCBhTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgewotCQkJCWFMaXN0LmFkZEFsbChyZWFkT25seU1vZGVscy52YWx1ZXMoKSk7Ci0JCQkJYUxpc3QuYWRkQWxsKGVkaXRhYmxlTW9kZWxzLnZhbHVlcygpKTsKLQkJCX0KLQkJfQotCQlFZGl0TW9kZWwgZWRpdE1vZGVsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBhTGlzdC5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCWVkaXRNb2RlbC5yZXNvdXJjZUNoYW5nZWQoYW5FdmVudCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZE5vdGlmeUVkaXRNb2RlbHMoKSB7Ci0JCXN5bmNocm9uaXplZCAocmVhZE9ubHlNb2RlbHMpIHsKLQkJCXN5bmNocm9uaXplZCAoZWRpdGFibGVNb2RlbHMpIHsKLQkJCQlyZXR1cm4gIXRoaXMucmVhZE9ubHlNb2RlbHMuaXNFbXB0eSgpIHx8ICF0aGlzLmVkaXRhYmxlTW9kZWxzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBBZGFwdGVyIGdldFJlc291cmNlU2V0TGlzdGVuZXIoKSB7Ci0JCWlmIChyZXNvdXJjZVNldExpc3RlbmVyID09IG51bGwpCi0JCQlyZXNvdXJjZVNldExpc3RlbmVyID0gbmV3IFJlc291cmNlU2V0TGlzdGVuZXIoKTsKLQkJcmV0dXJuIHJlc291cmNlU2V0TGlzdGVuZXI7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VTZXRMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJLyoKLQkJICogQHNlZSBBZGFwdGVyI25vdGlmeUNoYW5nZWQobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpTm90aWZpZXIsCi0JCSAqICAgICAgaW50LChFU3RydWN0dXJhbEZlYXR1cmUpIEVPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBpbnQpKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQkJCWFkZGVkUmVzb3VyY2UoKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0JCQkJCXJlbW92ZWRSZXNvdXJjZSgoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOgotCQkJCQlyZW1vdmVkUmVzb3VyY2VzKChMaXN0KSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBlZGl0TW9kZWxzIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgYWRkZWRSZXNvdXJjZShSZXNvdXJjZSBhZGRlZFJlc291cmNlKSB7Ci0JCWlmIChkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSAmJiAoYWRkZWRSZXNvdXJjZSAhPSBudWxsKSAmJiAoYWRkZWRSZXNvdXJjZSBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkpCi0JCQkoKENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkgYWRkZWRSZXNvdXJjZSkuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7Ci0JCWlmIChzaG91bGROb3RpZnlFZGl0TW9kZWxzKCkpIHsKLQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LkFEREVEX1JFU09VUkNFLCBudWxsKTsKLQkJCWV2ZW50LmFkZFJlc291cmNlKGFkZGVkUmVzb3VyY2UpOwotCQkJbm90aWZ5RWRpdE1vZGVscyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgYWxsIGVkaXRNb2RlbHMgb2YgdGhlIGNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVkUmVzb3VyY2UoUmVzb3VyY2UgcmVtb3ZlZFJlc291cmNlKSB7Ci0JCWlmIChzaG91bGROb3RpZnlFZGl0TW9kZWxzKCkpIHsKLQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UsIG51bGwpOwotCQkJZXZlbnQuYWRkUmVzb3VyY2UocmVtb3ZlZFJlc291cmNlKTsKLQkJCW5vdGlmeUVkaXRNb2RlbHMoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBlZGl0TW9kZWxzIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlZFJlc291cmNlcyhMaXN0IHJlbW92ZWRSZXNvdXJjZXMpIHsKLQkJaWYgKHNob3VsZE5vdGlmeUVkaXRNb2RlbHMoKSkgewotCQkJRWRpdE1vZGVsRXZlbnQgZXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSwgbnVsbCk7Ci0JCQlldmVudC5hZGRSZXNvdXJjZXMocmVtb3ZlZFJlc291cmNlcyk7Ci0JCQlub3RpZnlFZGl0TW9kZWxzKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0TGlzdGVuaW5nVG9SZXNvdXJjZVNldCgpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKHNldCAhPSBudWxsKQotCQkJc2V0LmVBZGFwdGVycygpLmFkZChnZXRSZXNvdXJjZVNldExpc3RlbmVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyI3Byb2plY3RDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCS8vIGRlZmF1bHQgbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyI3Byb2plY3RDbG9zZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2plY3RDbG9zZWQoKSB7Ci0JCWRpc2NhcmRBbGxFZGl0TW9kZWxzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0QmFzZSNjcmVhdGVVUklDb252ZXJ0ZXIob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0KQotCSAqLwotCXByb3RlY3RlZCBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY3JlYXRlVVJJQ29udmVydGVyKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbChnZXRQcm9qZWN0KCksIGFSZXNvdXJjZVNldC5nZXRTeW5jaHJvbml6ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dGVtcHQgdG8gY3JlYXRlIHJlc291cmNlIHNldCB3aXRoIG51bGwgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwocHJvamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0QmFzZSNkZWxldGVGaWxlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVGaWxlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRyeSB7Ci0JCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5kZWxldGVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eQotCSAqICAgICAgICAgICAgVGhlIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eShib29sZWFuIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5KSB7Ci0JCXRoaXMuZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkgPSBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkMTA3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDI1LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImVtZndvcmtiZW5jaGVkaXQiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb25fVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNuYXBzaG90X0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5X0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VkaXRNb2RlbExlYXN0VXNlZENhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1M2JmMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gY2FjaGUgdGhlIHJlY2VudGx5IHVzZWQgZWRpdCBtb2RlbHMuICBMb2FkaW5nIGFuZCB1bmxvYWRpbmcgb2YgZWRpdCBtb2RlbHMgY2FuIGJlCi0gKiBjb3N0bHksIGVzcGVjaWFsbHkgaWYgb3BlcmF0aW9ucyBhbmQvb3IgcG9zdCBvcGVyYXRpb25zIGhhdmUgYSBuZWVkIHRvIHJlbG9hZCB0aGUgc2FtZSBlZGl0IG1vZGVsIHJlcGVhdGVkbHkuCi0gKiBUaGlzIHdpbGwgYWxsb3cgdGhvc2UgcmVwZWF0ZWRseSB1c2VkIGVkaXQgbW9kZWxzIHRvIGJlIGNhY2hlZCwgdGhlcmVieSBpbXByb3ZpbmcgcGVyZm9ybWFuY2UuICBCeSBkZXNpZ24sIHRoZQotICogZWRpdCBtb2RlbHMgbG9hZCByZXNvdXJjZXMgYW5kIHRoZXNlIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIG1lbW9yeSwgc28gd2UgZG9uJ3Qgd2FudCB0byBjYWNoZSBldmVyeSBlZGl0Ci0gKiBtb2RlbCBhY2Nlc3NlZCwgc28gdGhpcyBpcyBhIGxlYXN0IHVzZWQgY2FjaGUgbWVjaGFuaXNtLCB3aGVyZSB0aGUgbWF4IHNpemUgaXMgMTAuICBJZiBhbiBlZGl0IG1vZGVsIGlzIHVzZWQKLSAqIGl0IGlzIHB1dCB0byB0aGUgYmFjayBvZiB0aGUgc3RhY2ssIGFuZCBuZXcgZWRpdCBtb2RlbHMgYWNjZXNzZWQgYXJlIHB1dCB0byB0aGUgYmFjayBvZiB0aGUgc3RhY2ssIHNvIHRoYXQgdGhlCi0gKiB0b3Agb2YgdGhlIHN0YWNrIGlzIHRoZSBmaXJzdCBlZGl0IG1vZGVsIGRpc3Bvc2VkIHdoZW4gdGhlIGNhY2hlIGlzIGhpZ2hlciB0aGFuIHRoZSB0aHJlc2hob2xkLgotICoKLSAqLwotcHVibGljIGNsYXNzIEVkaXRNb2RlbExlYXN0VXNlZENhY2hlIHsKLQkKLQkvKioKLQkgKiBQcm92aWRlIGEgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEVkaXRNb2RlbExlYXN0VXNlZENhY2hlIElOU1RBTkNFID0gbmV3IEVkaXRNb2RlbExlYXN0VXNlZENhY2hlKCk7CQotCQotCS8qKgotCSAqIFRoZSB0aHJlc2hvbGQsIG9yIG1vc3QgZWRpdCBtb2RlbHMgd2Ugd2lsbCBrZWVwIG9wZW4gYXQgYSB0aW1lIGlzIDEwLiAgVGhpcyBpcyBsb3cgZW5vdWdoIHRvIG5vdAotCSAqIG92ZXJ3aGVsbSB3b3JrYmVuY2ggbWVtb3J5IGFuZCBoaWdoIGVub3VnaCB0byBhaWQgaW4gb3BlcmF0aW9ucyB3aGljaCBjb250aW51YWxseSByZWxvYWQgMy00IAotCSAqIGVkaXQgbW9kZWxzLgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCB0aHJlc2hob2xkID0gMTA7Ci0JCi0JLyoqCi0JICogIEEgTEhTIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGUgb3JkZXIgb2YgdGhlIGl0ZW1zIGlzIG1haW50YWluZWQuIE90aGVyCi0JICogU2V0IGltcGxlbWVudGF0aW9ucyAoSGFzaFNldCwgVHJlZVNldCkgZG8gbm90IHByZXNlcnZlIHRoZSBvcmRlci4gVGhpcyAKLQkgKiBpcyBjcml0aWNhbCB0byB0aGUgaW1wbGVtZW50YXRpb24uIERPIE5PVCBDSEFOR0UgVEhJUy4gCi0JICovCi0JcHJpdmF0ZSBMaW5rZWRIYXNoU2V0IGxydSA9IG5ldyBMaW5rZWRIYXNoU2V0KHRocmVzaGhvbGQpOwotCQotCS8qKgotCSAqIEFjY2Vzc29yIGZvciB0aGUgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUgSU5TVEFOQ0UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZSBJTlNUQU5DRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgbHJ1IHRoYXQgYXJlIGNvbnRhaW5lZAotCSAqIGluIDxjb2RlPmFDb2xsZWN0aW9uPC9jb2RlPi4gIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlCi0JICogRWRpdE1vZGVscyBpbiB0aGUgYUNvbGxlY3Rpb24gd2lsbCBiZSBkaXNjYXJkZWQgYW5kIGl0Ci0JICogd2lsbCBub3QgYXR0ZW1wdCB0byBkZWNyZW1lbXQgaXRzIHJlZmVyZW5jZSBjb3VudC4KLQkgKiBAcGFyYW0gYUNvbGxlY3Rpb24gLSBBIHtAbGluayBDb2xsZWN0aW9ufSBvZiB7QGxpbmsgRWRpdE1vZGVsfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxDYWNoZWQoQ29sbGVjdGlvbiBhQ29sbGVjdGlvbikgewotCQlpZiAoYUNvbGxlY3Rpb24gIT0gbnVsbCkgeyAKLQkJCWxydS5yZW1vdmVBbGwoYUNvbGxlY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4ge0BsaW5rIEVkaXRNb2RlbH0gaXMgYmVpbmcgYWNjZXNzZWQgc28gd2Ugd2lsbCB3YW50Ci0JICogdG8gdXBkYXRlIHRoZSBscnUgYW5kIGFjY2VzcyB0aGUgZWRpdE1vZGVsIHdoaWNoIHdpbGwgaG9sZAotCSAqIGEgcmVmZXJlbmNlIGNvdW50LgotCSAqIEBwYXJhbSBlZGl0TW9kZWwgLSBUaGUge0BsaW5rIEVkaXRNb2RlbH0gdGhhdCB3ZSB3YW50IHRvIHBsYWNlCi0JICogCWluIHRoZSBsZWFzdCB1c2VkIGNhY2hlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VzcyhFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCWJvb2xlYW4gc2hvdWxkQWNjZXNzID0gdHJ1ZTsKLQkJc3luY2hyb25pemVkIChscnUpIHsKLQkJCWlmIChscnUuY29udGFpbnMoZWRpdE1vZGVsKSkgewotCQkJCW1vdmVUb0VuZChlZGl0TW9kZWwpOwotCQkJCXNob3VsZEFjY2VzcyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChzaG91bGRBY2Nlc3MpIHsKLQkJCXN5bmNocm9uaXplZCAobHJ1KSB7Ci0JCQkJZWRpdE1vZGVsLmFjY2Vzcyh0aGlzKTsKLQkJCQlscnUuYWRkKGVkaXRNb2RlbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgd2UgaGl0IHRoZSBjYXBhY2l0eSBvZiB0aGUgbHJ1IHRoZW4gcmVtb3ZlIHRoZSBmaXJzdCBvbmUKLQkgKiBhbmQgcmVsZWFzZSBhY2Nlc3MuCi0JICovCi0JcHVibGljIHZvaWQgb3B0aW1pemVMUlVTaXplSWZOZWNlc3NhcnkoKSB7Ci0JCUVkaXRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAobHJ1KSB7Ci0JCQlpZiAobHJ1LnNpemUoKSA+IHRocmVzaGhvbGQpIHsKLQkJCQkvLyByZW1vdmUgb2xkZXN0IGVsZW1lbnQgYW5kIHJlbGVhc2UgdGhlIGVkaXQgbW9kZWwuCi0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBscnUuaXRlcmF0b3IoKTsKLQkJCQltb2RlbCA9IChFZGl0TW9kZWwpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQlscnUucmVtb3ZlKG1vZGVsKTsJCi0JCQkJfQotCQkJfQotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCW1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBlZGl0TW9kZWwgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCAKLQkgKiBAcGFyYW0gZWRpdE1vZGVsIC0tIEVkaXRNb2RlbCB0byBiZSBtb3ZlZAotCSAqLwotCXByaXZhdGUgdm9pZCBtb3ZlVG9FbmQoRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlscnUucmVtb3ZlKGVkaXRNb2RlbCk7Ci0JCWxydS5hZGQoZWRpdE1vZGVsKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRW1mUGFja2FnZVByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1OTQwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBFbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZiAocmVjZWl2ZXIgPT0gbnVsbCB8fCAhKHJlY2VpdmVyIGluc3RhbmNlb2YgRU9iamVjdCkgfHwgZXhwZWN0ZWRWYWx1ZSA9PSBudWxsIHx8ICEoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgcmVjZWl2ZXI7Ci0JCVN0cmluZyBlbWZQYWNrYWdlID0gKFN0cmluZylleHBlY3RlZFZhbHVlOwotCQlyZXR1cm4gZW1mUGFja2FnZS5lcXVhbHMoZU9iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpLmdldE5zVVJJKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRW1mVmFsaWRhdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VtZlZhbGlkYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjQyYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRW1mVmFsaWRhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyOwotCi0KLS8qKgotICogRW1mIHZhbGlkYXRpb24gZXh0ZW5zaW9uIGZvciB2YWxhZGl0ZW1lbnVhY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEVtZlZhbGlkYXRpb25IYW5kbGVyIGltcGxlbWVudHMgSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25UeXBlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVtZlZhbGlkYXRpb25IYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjZ2V0QmFzZVZhbGlkYXRpb25UeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRCYXNlVmFsaWRhdGlvblR5cGUoT2JqZWN0IHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHNlbGVjdGlvbjsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZU9iamVjdC5lUmVzb3VyY2UoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVzb3VyY2UpOwotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciNnZXRWYWxpZGF0aW9uVHlwZVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uVHlwZVN0cmluZygpIHsKLQkJcmV0dXJuIHZhbGlkYXRpb25UeXBlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjc2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uVHlwZVN0cmluZyhTdHJpbmcgdmFsaWRhdGlvblR5cGUpIHsKLQkJdGhpcy52YWxpZGF0aW9uVHlwZSA9IHZhbGlkYXRpb25UeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1Bhc3N0aHJ1UmVzb3VyY2VTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1Bhc3N0aHJ1UmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiMzZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9QYXNzdGhydVJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLQotLyoqCi0gKiBUaGlzIFJlc291cmNlU2V0IGlzIHRvIGJlIHVzZWQgYnkgcGx1Z2lucyB0aGF0IGFyZSBjdXJyZW50bHkgbG9hZGluZyB0byBhIGNhY2hlZCBSZXNvdXJjZVNldCB0aGF0Ci0gKiBhbHdheXMgbG9hZHMgcmVsYXRpdmUgdG8gdGhlIFdvcmtiZW5jaC4gVGhpcyBSZXNvdXJjZVNldCB3aWxsIGRpcmVjdCB0aGUgbG9hZHMgdG8gdGhlIGFwcHJvcHJpYXRlCi0gKiBQcm9qZWN0IFJlc291cmNlU2V0LiBJdCB3aWxsIG9ubHkgbG9hZCBpbiB0aGlzIFJlc291cmNlU2V0IGlmIGl0IHdhcyB1bmFibGUgdG8gbG9hZCB2aWEgdGhlCi0gKiBXb3Jrc3BhY2UuCi0gKiAKLSAqIElmIHlvdSBzZXQgd2FudCB0byB1c2VkIHRoaXMgUmVzb3VyY2VTZXQgc28gdGhhdCB0aGUgbG9hZGVkIHJlc291cmNlcyBhcmUgaXNvbGF0ZWQgZnJvbSBldmVyeW9uZQotICogZWxzZSwgeW91IHNob3VsZCB1c2UgdGhlCi0gKiAKLSAqIEBsaW5rIFBhc3N0aHJ1UmVzb3VyY2VTZXQoSVByb2plY3QpIGNvbnN0cnVjdG9yLiBUaGlzIHdpbGwgbG9hZCBhbGwgcmVzb3VyY2VzIGxvY2FsbHkgYW5kIGl0IHdpbGwKLSAqICAgICAgIG5vdCBkZWxlZ2F0ZSB0byBhbm90aGVyIFByb2plY3RSZXNvdXJjZVNldC4gVGhpcyB3b3VsZCBiZSBlcXVpdmFsZW50IHRvIGNyZWF0aW5nIGEKLSAqICAgICAgIFByb2plY3RSZXNvdXJjZVNldCB3aXRob3V0IHNldHRpbmcgYW55IGhhbmRsZXJzLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUGFzc3RocnVSZXNvdXJjZVNldCBleHRlbmRzIFByb2plY3RSZXNvdXJjZVNldEltcGwgewotCXByb3RlY3RlZCBib29sZWFuIGlzSXNvbGF0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBjbGFzcyBQYXNzdGhydVJlc291cmNlc0VMaXN0IGV4dGVuZHMgUmVzb3VyY2VTZXRJbXBsLlJlc291cmNlc0VMaXN0IHsKLQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQoKChSZXNvdXJjZSkgb2JqZWN0KS5nZXRVUkkoKSk7Ci0JCQlpZiAoc2V0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHNldC5nZXRSZXNvdXJjZXMoKS5hZGQoKFJlc291cmNlKW9iamVjdCk7Ci0KLQkJCXJldHVybiBzdXBlci5hZGQob2JqZWN0KTsKLQkJfQotCi0KLQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCUl0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQkJUmVzb3VyY2UgcmVzOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJlcyA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCWlmICghV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmNhY2hlUmVzb3VyY2UocmVzKSkKLQkJCQkJc3VwZXIuYWRkKHJlcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBQYXNzdGhydVJlc291cmNlU2V0KCkgewotCQlpc0lzb2xhdGVkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIHVzZSB0aGlzIFJlc291cmNlU2V0IGlzb2xhdGVkIGZyb20gdGhlCi0JICogYWN0dWFsIGNhY2hlZCBQcm9qZWN0UmVzb3VyY1NldCBmb3IgdGhlIHBhc3NlZCBJUHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgUGFzc3RocnVSZXNvdXJjZVNldChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXNldFByb2plY3QocHJvamVjdCk7Ci0JCWlzSXNvbGF0ZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSXNvbGF0ZWQoKSB7Ci0JCXJldHVybiBpc0lzb2xhdGVkOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc3VsdCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVtYW5kQ3JlYXRlUmVzb3VyY2UoVVJJKQotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkZW1hbmRDcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc3VsdCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlUmVzb3VyY2UodXJpKTsgLy9XZSBkbyB3YW50IHRvIGNhbGwgc3VwZXIuY3JlYXRlUmVzb3VyY2UgYW5kIG5vdAotCQkvLyBkZW1hbmRDcmVhdGVSZXNvdXJjZQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlc291cmNlcygpIHsKLQkJaWYgKGlzSXNvbGF0ZWQpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VzKCk7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VzID0gbmV3IFBhc3N0aHJ1UmVzb3VyY2VzRUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsI2NyZWF0ZVJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSkKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VGcm9tSGFuZGxlcnMoVVJJIHVyaSkgewotCQlpZiAoIWlzSXNvbGF0ZWQpCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlUmVzb3VyY2VGcm9tSGFuZGxlcnModXJpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGwjZ2V0UmVzb3VyY2VGcm9tSGFuZGxlcnMoVVJJKQotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkgdXJpKSB7Ci0JCWlmICghaXNJc29sYXRlZCkKLQkJCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZUZyb21IYW5kbGVycyh1cmkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbCNnZXRFT2JqZWN0RnJvbUhhbmRsZXJzKFVSSSwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFT2JqZWN0RnJvbUhhbmRsZXJzKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCWlmICghaXNJc29sYXRlZCkKLQkJCXJldHVybiBzdXBlci5nZXRFT2JqZWN0RnJvbUhhbmRsZXJzKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5Njk4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlciBleHRlbmRzIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBDbGFzcyBSRUZFUkVOQ0VEX1JFU19DTEFTUyA9IFJlZmVyZW5jZWRSZXNvdXJjZS5jbGFzczsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGZpbGVBZGFwdGVyRmFjdG9yeUluaXRpYWxpemVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCi0JCXB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQkJCUZpbGVBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRmlsZUFkYXB0ZXIoKTsKLQkJCWFkYXB0ZXIuc2V0VGFyZ2V0KHRhcmdldCk7Ci0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBjbGFzcyBpcyBpbnRlcm5hbCBhbmQgaXMgdXNlZCB0byBzdG9yZSBzdGF0ZSBvbiB0aGUgcmVzb3VyY2UsIHNwZWNpZmljYWxseSwgYSBjYWNoZWQKLQkgKiByZWZlcmVuY2UgdG8gdGhlIElGaWxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEFEQVBURVJfS0VZID0gRmlsZUFkYXB0ZXIuY2xhc3MuZ2V0TmFtZSgpOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIGRlbGF5ID0gMzA7Ci0JCXByaXZhdGUgSUZpbGUgZmlsZTsKLQkJcHJpdmF0ZSBsb25nIHN5bmNocm9uaXphdGlvblN0YW1wOwotCQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcHJldmlvdXNSZXNvdXJjZVNldDsKLQkJcHJpdmF0ZSBJTG9jayBzYXZlTG9jazsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9OT1RfTE9BREVEID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9JTkFDQ0VTU0lCTEUgPSAtMTsKLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gQURBUFRFUl9LRVkuZXF1YWxzKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogVXBkYXRlIHRoZSBzeW5jaHJvbml6YXRpb24gc3RhbXAgd2hlcmUgYXBwcm9wcmlhdGUKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpKSB7Ci0JCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEIDoKLQkJCQkJaWYgKGdldFJlc291cmNlKCkuaXNMb2FkZWQoKSkKLQkJCQkJCWhhbmRsZUxvYWRlZCgpOwotCQkJCQllbHNlCi0JCQkJCQloYW5kbGVVbmxvYWRlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFJlZmVyZW5jZWRSZXNvdXJjZS5SRVNPVVJDRV9BQk9VVF9UT19TQVZFOgotCSAgICAgICAgICAgICAgICBoYW5kbGVBYm91dFRvU2F2ZSgpOwotCSAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgICAgICAgICBjYXNlIFJlZmVyZW5jZWRSZXNvdXJjZS5SRVNPVVJDRV9XQVNfU0FWRUQ6Ci0JICAgICAgICAgICAgICAgIGhhbmRsZVNhdmVkKCk7Ci0JICAgICAgICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgICAgIGNhc2UgUmVmZXJlbmNlZFJlc291cmNlLlJFU09VUkNFX1NBVkVfRkFJTEVEOgotCSAgICAgICAgICAgICAgICBoYW5kbGVTYXZlRmFpbGVkKCk7Ci0JICAgICAgICAgICAgICAgIGJyZWFrOwotCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1VSSSA6Ci0JCQkJCWhhbmRsZVVSSUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZVNhdmVGYWlsZWQoKSB7Ci0gICAgICAgICAgICByZWxlYXNlU2F2ZUxvY2soKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFib3V0VG9TYXZlKCkgewotICAgICAgICAgICAgYXF1aXJlU2F2ZUxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhcXVpcmVTYXZlTG9jaygpIHsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlTmFtZTogIiArIGdldEZpbGUoKS5nZXROYW1lKCkgKyAiICIgK2dldEZpbGUoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYXF1aXJlZFNhdmVMb2NrOiAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlcHRoIiArIGdldFNhdmVMb2NrKCkuZ2V0RGVwdGgoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFuY2U6IitnZXRTYXZlTG9jaygpLmhhc2hDb2RlKCkpOwotLy8gICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgZ2V0U2F2ZUxvY2soKS5hY3F1aXJlKCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBhcXVpcmVTYXZlTG9jayhsb25nIGRlbGF5KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVOYW1lOiAiICsgZ2V0RmlsZSgpLmdldE5hbWUoKSAgKyAiICIgK2dldEZpbGUoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYXF1aXJlZFNhdmVMb2NrIHdpdGggZGVsYXk6ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVwdGgiICsgZ2V0U2F2ZUxvY2soKS5nZXREZXB0aCgpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnN0YW5jZToiK2dldFNhdmVMb2NrKCkuaGFzaENvZGUoKSk7Ci0vLyAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBnZXRTYXZlTG9jaygpLmFjcXVpcmUoZGVsYXkpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVsZWFzZVNhdmVMb2NrKCkgewotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVOYW1lOiAiICsgZ2V0RmlsZSgpLmdldE5hbWUoKSAgKyAiICIgK2dldEZpbGUoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVsZWFzZWRTYXZlTG9jazogIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXB0aCIgKyBnZXRTYXZlTG9jaygpLmdldERlcHRoKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbmNlOiIrZ2V0U2F2ZUxvY2soKS5oYXNoQ29kZSgpKTsKLS8vICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIGdldFNhdmVMb2NrKCkucmVsZWFzZSgpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIElMb2NrIGdldFNhdmVMb2NrKCkgewotICAgICAgICAgICAgaWYgKHNhdmVMb2NrID09IG51bGwpCi0gICAgICAgICAgICAgICAgc2F2ZUxvY2sgPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotICAgICAgICAgICAgcmV0dXJuIHNhdmVMb2NrOwotICAgICAgICB9Ci0KLQkJLyoqCi0JCSAqICAKLQkJICovCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVVUklDaGFuZ2VkKCkgewotCQkJZmlsZSA9IG51bGw7Ci0JCQlzeW5jaHJvbml6YXRpb25TdGFtcCA9IEZJTEVfTk9UX0xPQURFRDsKLQkJfQotCi0JCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQkJLy9GaXJzdCB0ZXN0IHRvIHNlZSBpZiB3ZSBzaG91bGQgcmVzZXQgdGhlIGZpbGUuCi0JCQlpZiAoZmlsZSAhPSBudWxsICYmICghZmlsZS5pc0FjY2Vzc2libGUoKSB8fCBwcmV2aW91c1Jlc291cmNlU2V0ICE9IGdldFJlc291cmNlU2V0KCkpKSB7Ci0JCQkJZmlsZSA9IG51bGw7Ci0JCQkJc3luY2hyb25pemF0aW9uU3RhbXAgPSBGSUxFX05PVF9MT0FERUQ7Ci0JCQl9Ci0JCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVVSSShnZXRVUkkoKSkpIHsKLQkJCQkJZmlsZSA9IGdldFBsYXRmb3JtRmlsZShnZXRVUkkoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy93ZSBzaG91bGQgbm90IGJlIGhlcmUgYW55bW9yZS4KLQkJCQkJZmlsZSA9IGludGVybmFsR2V0RmlsZShnZXRSZXNvdXJjZSgpKTsKLQkJCQl9Ci0JCQkJaWYobnVsbCE9IGZpbGUgJiYgIWZpbGUuaXNBY2Nlc3NpYmxlKCkpewotCQkJCQlzeW5jaHJvbml6YXRpb25TdGFtcCA9IEZJTEVfSU5BQ0NFU1NJQkxFOwotCQkJCX0KLQkJCQlwcmV2aW91c1Jlc291cmNlU2V0ID0gZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCX0KLQkJCXJldHVybiBmaWxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFN5bmNocm9uaXphdGlvblN0YW1wKCkgewotCQkJcmV0dXJuIHN5bmNocm9uaXphdGlvblN0YW1wOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBmaWxlCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRGaWxlKElGaWxlIGZpbGUpIHsKLQkJCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGwKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXphdGlvblN0YW1wKGxvbmcgbCkgewotCQkJc3luY2hyb25pemF0aW9uU3RhbXAgPSBsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzQ29uc2lzdGVudCgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnNpc3RlbnQoKSB7Ci0JCQkvL1RoaXMgY2hlY2tzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgcmVzb3VyY2UgaGFzbid0IGZpbmlzaGVkIHNhdmluZyBmbyB0aGUgZmlyc3QgdGltZQotCQkJaWYoIWdldFJlc291cmNlKCkuaXNMb2FkZWQoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzTG9ja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGhhc0xvY2tlZCA9IGFxdWlyZVNhdmVMb2NrKGRlbGF5KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkud3JpdGUoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgIGlmIChnZXRGaWxlKCkgPT0gbnVsbCB8fCAhZ2V0RmlsZSgpLmlzQWNjZXNzaWJsZSgpKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWdldEZpbGUoKS5pc1N5bmNocm9uaXplZChJRmlsZS5ERVBUSF9aRVJPKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN5bmNocm9uaXphdGlvblN0YW1wID09IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChnZXRGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkud3JpdGUoZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChoYXNMb2NrZWQpCi0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VTYXZlTG9jaygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0JCXB1YmxpYyB2b2lkIGNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKSB7Ci0JCQlzZXRTeW5jaHJvbml6YXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZ2V0RmlsZSgpKSk7Ci0JCX0KLQotCQlwdWJsaWMgUmVmZXJlbmNlZFJlc291cmNlIGdldFJlc291cmNlKCkgewotCQkJcmV0dXJuIChSZWZlcmVuY2VkUmVzb3VyY2UpIHRhcmdldDsKLQkJfQotCi0JCXB1YmxpYyBVUkkgZ2V0VVJJKCkgewotCQkJcmV0dXJuIHRhcmdldCA9PSBudWxsID8gbnVsbCA6IGdldFJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCX0KLQotCQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCQlyZXR1cm4gdGFyZ2V0ID09IG51bGwgPyBudWxsIDogZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlVW5sb2FkZWQoKSB7Ci0JCQlmaWxlID0gbnVsbDsKLQkJCXN5bmNocm9uaXphdGlvblN0YW1wID0gRklMRV9OT1RfTE9BREVEOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlTG9hZGVkKCkgewotCQkJY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlU2F2ZWQoKSB7Ci0JCQljYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCk7Ci0JCQlyZWxlYXNlU2F2ZUxvY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHRvIGJlIHVzZWQgYnkgdGhlIHBsdWdpbiBvbmx5Ci0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplRmlsZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAoIWZpbGVBZGFwdGVyRmFjdG9yeUluaXRpYWxpemVkKSB7Ci0JCQlSZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwuYWRkR2xvYmFsQWRhcHRlckZhY3RvcnkobmV3IEZpbGVBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCWZpbGVBZGFwdGVyRmFjdG9yeUluaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUFkYXB0ZXIgZ2V0RmlsZUFkYXB0ZXIoUmVmZXJlbmNlZFJlc291cmNlIHJlcykgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gKEZpbGVBZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHJlcywgRmlsZUFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCQlyZXR1cm4gYWRhcHRlciA9PSBudWxsID8gY3JlYXRlRmlsZUFkYXB0ZXIocmVzKSA6IGFkYXB0ZXI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUFkYXB0ZXIgY3JlYXRlRmlsZUFkYXB0ZXIoUmVmZXJlbmNlZFJlc291cmNlIHJlcykgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gbmV3IEZpbGVBZGFwdGVyKCk7Ci0JCWFkYXB0ZXIuc2V0VGFyZ2V0KHJlcyk7Ci0JCXJlcy5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5kZXJseWluZyBJRmlsZSBmb3IgdGhlIHJlc291cmNlIGlmIG9uZSBleGlzdHMuIFRoaXMgbWF5IHJldHVybiBudWxsIGlmIHRoZQotCSAqIHJlc291cmNlIGRvZXMgbm90IGJlbG9uZyB0byBhIFByb2plY3RSZXNvdXJjZVNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoUmVmZXJlbmNlZFJlc291cmNlIHJlcykgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IG51bGwgOiBhZGFwdGVyLmdldEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlcykgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IEZpbGVBZGFwdGVyLkZJTEVfTk9UX0xPQURFRCA6IGFkYXB0ZXIuZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3luaHJvbml6YXRpb25TdGFtcChSZWZlcmVuY2VkUmVzb3VyY2UgcmVzLCBsb25nIHN0YW1wKSB7Ci0JCUZpbGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRGaWxlQWRhcHRlcihyZXMpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJYWRhcHRlci5zZXRTeW5jaHJvbml6YXRpb25TdGFtcChzdGFtcCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29uc2lzdGVudChSZWZlcmVuY2VkUmVzb3VyY2UgcmVzKSB7Ci0JCUZpbGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRGaWxlQWRhcHRlcihyZXMpOwotCQlyZXR1cm4gYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNDb25zaXN0ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAuCi0JICogCi0JICogQHBhcmFtIHIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcChSZWZlcmVuY2VkUmVzb3VyY2UgcmVmUmVzb3VyY2UpIHsKLQkJaWYgKHJlZlJlc291cmNlICE9IG51bGwpIHsKLQkJCUZpbGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRGaWxlQWRhcHRlcihyZWZSZXNvdXJjZSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKSA8PSBGaWxlQWRhcHRlci5GSUxFX05PVF9MT0FERUQpCi0JCQkJYWRhcHRlci5zZXRTeW5jaHJvbml6YXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAocmVmUmVzb3VyY2UpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZmVyZW5jZWRSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIFJFRkVSRU5DRURfUkVTX0NMQVNTLmlzSW5zdGFuY2UoYVJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKFJlZmVyZW5jZWRSZXNvdXJjZSByZXNvdXJjZSkgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzb3VyY2UpOwotCQlyZXR1cm4gYWRhcHRlciA9PSBudWxsID8gRmlsZUFkYXB0ZXIuRklMRV9OT1RfTE9BREVEIDogY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGFkYXB0ZXIuZ2V0RmlsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBGaWxlQWRhcHRlci5GSUxFX05PVF9MT0FERUQ7Ci0JCWlmKCFmaWxlLmlzQWNjZXNzaWJsZSgpKXsKLQkJCXJldHVybiBGaWxlQWRhcHRlci5GSUxFX0lOQUNDRVNTSUJMRTsKLQkJfQotCQlsb25nIGN1cnJlbnRTdGFtcCA9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJSVBhdGggcGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCXJldHVybiBwYXRoLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQlyZXR1cm4gY3VycmVudFN0YW1wOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSUZpbGUgdGhhdCBjdXJyZW50bHkgY29ycmVzcG9uZHMgdG8gPGNvZGU+YVJlc291cmNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJaWYgKGlzUmVmZXJlbmNlZFJlc291cmNlKGFSZXNvdXJjZSkpCi0JCQkJcmV0dXJuIGdldEZpbGUoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKTsKLQkJCXJldHVybiBpbnRlcm5hbEdldEZpbGUoYVJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoRU9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJUmVzb3VyY2UgbW9mUmVzb3VyY2UgPSBvYmouZVJlc291cmNlKCk7Ci0JCWlmIChtb2ZSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRGaWxlKG1vZlJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3IgbG9hZCBhIGNhY2hlZCBSZXNvdXJjZSBvciBjcmVhdGUgb25lIGlmIGl0IGlzIG5vdCBmb3VuZC4gQSBXcmFwcGVkRXhjZXB0aW9uIHdpbGwgb25seQotCSAqIGJlIHRocm93biBpZiB0aGUgY29ycmVzcG9uZGluZyBmaWxlIGV4aXN0cyBidXQgaXQgZmFpbGVkIHRvIGxvYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRPckNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlU2V0IHNldCkgdGhyb3dzIFdyYXBwZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIHNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOyAvL3RoaXMgd2lsbCBjcmVhdGUgdGhlIHJlc291cmNlIG5vIG1hdHRlciB3aGF0Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmdldEZpbGVOb3RGb3VuZERldGVjdG9yKCkuaXNGaWxlTm90Rm91bmQoZSkpCi0JCQkJcmV0dXJuIHNldC5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNTYW1lUHJvamVjdChSZXNvdXJjZSByZXNvdXJjZUEsIFJlc291cmNlIHJlc291cmNlQikgewotCQlJUHJvamVjdCBwQSwgcEI7Ci0JCXBBID0gZ2V0UHJvamVjdChyZXNvdXJjZUEpOwotCQlwQiA9IGdldFByb2plY3QocmVzb3VyY2VCKTsKLQkJaWYgKHBBICE9IG51bGwgJiYgcEIgIT0gbnVsbCkKLQkJCXJldHVybiBwQS5lcXVhbHMocEIpOwotCQkvL290aGVyd2lzZSB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggaW5mbyB0byBkZXRlcm1pbmUgZmFsc2Ugc28gd2UgbXVzdCByZXR1cm4gdHJ1ZQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoUmVzb3VyY2UgcmVzKSB7Ci0JCUlQcm9qZWN0IHByb2ogPSBnZXRQcm9qZWN0KHJlcy5nZXRSZXNvdXJjZVNldCgpKTsKLQkJaWYgKHByb2ogPT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUocmVzKTsKLQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJcHJvaiA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBwcm9qOwotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgY2xpZW50cy4gSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IGNsaWVudHMgdGhhdCBhbHNvIGNhbGwKLQkgKiBnZXRGaWxlKC4uLikuIFRoaXMgaXMgdG8gYXZvaWQgZW5kbGVzcyBsb29wcy4KLQkgKiAKLQkgKiBAc2VlIGdldEZpbGUoUmVzb3VyY2UpCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJRmlsZSBpbnRlcm5hbEdldEZpbGUoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRGaWxlKGFSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLCBhUmVzb3VyY2UuZ2V0VVJJKCkpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSUZpbGUgZ2V0RmlsZShSZXNvdXJjZVNldCBzZXQsIFVSSSB1cmkpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZSh1cmkpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlpZiAoc2V0ICE9IG51bGwpIHsKLQkJCQlVUklDb252ZXJ0ZXIgY29udmVydGVyID0gc2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQkJCVVSSSBjb252ZXJ0ZWRVcmkgPSBjb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JCQkJaWYgKCF1cmkuZXF1YWxzKGNvbnZlcnRlZFVyaSkpCi0JCQkJCXJldHVybiBnZXRQbGF0Zm9ybUZpbGUoY29udmVydGVkVXJpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElGaWxlIGZvciB0aGUgPGNvZGU+dXJpPC9jb2RlPiB3aXRoaW4gdGhlIFdvcmtzcGFjZS4gVGhpcyBVUkkgaXMgYXNzdW1lZCB0byBiZQotCSAqIGFic29sdXRlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBwbGF0Zm9ybTovcmVzb3VyY2UvLi4uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKFVSSSB1cmkpIHsKLQkJaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKSB7Ci0JCQlTdHJpbmcgZmlsZVN0cmluZyA9IFVSSS5kZWNvZGUodXJpLnBhdGgoKSk7Ci0JCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9SRVNPVVJDRS5sZW5ndGgoKSArIDEpOwotCQkJcmV0dXJuIGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGZpbGVTdHJpbmcpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKElQcm9qZWN0IHByb2plY3QsIFVSSSB1cmkpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2VTZXQocHJvamVjdCk7Ci0JCXJldHVybiBnZXRGaWxlKHNldCwgdXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gc2F2ZSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IHdpdGhpbiB0aGUgSVByb2plY3QKLQkgKiB0aGF0IGl0IGlzIGN1cnJlbnRseSByZXNpZGluZyBidXQgeW91IGRvIG5vdCB3YW50IHRvIHNhdmUgaXQgaW4gdGhlIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uLgotCSAqIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGFwaSB0byBzYXZlIGEgUmVzb3VyY2UgdG8gYW4gZXhpc3RpbmcgZmlsZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGFwaSBpcyBubyBsb25nZXIgcmVxdWlyZWQuIFlvdSBzaG91bGQgY3JlYXRlIGEgcmVzb3VyY2Ugd2l0aCB0aGUgYWJzb2x1dGUKLQkgKiAgICAgICAgICAgICBwYXRoIChwbGF0Zm9ybTovcmVzb3VyY2UvLi4uKS4gVXBvbiBzYXZlLCB0aGUgZmlsZSB3aWxsIGJlIHNhdmVkIHRvIHRoaXMKLQkgKiAgICAgICAgICAgICBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZVJlc291cmNlVG9GaWxlKFJlc291cmNlIGFSZXNvdXJjZSwgSUZpbGUgYUZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gc2F2ZVJlc291cmNlVG9GaWxlKGFSZXNvdXJjZSwgYUZpbGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3Ugd2FudCB0byBzYXZlIDxjb2RlPmFSZXNvdXJjZTwvY29kZT4gd2l0aGluIHRoZSBJUHJvamVjdAotCSAqIHRoYXQgaXQgaXMgY3VycmVudGx5IHJlc2lkaW5nIGJ1dCB5b3UgZG8gbm90IHdhbnQgdG8gc2F2ZSBpdCBpbiB0aGUgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24uCi0JICogWW91IHNob3VsZCBub3QgdXNlIHRoaXMgYXBpIHRvIHNhdmUgYSBSZXNvdXJjZSB0byBhbiBleGlzdGluZyBmaWxlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFRoaXMgYXBpIGlzIG5vIGxvbmdlciByZXF1aXJlZC4gWW91IHNob3VsZCBjcmVhdGUgYSByZXNvdXJjZSB3aXRoIHRoZSBhYnNvbHV0ZQotCSAqICAgICAgICAgICAgIHBhdGggKHBsYXRmb3JtOi9yZXNvdXJjZS8uLi4pLiBVcG9uIHNhdmUsIHRoZSBmaWxlIHdpbGwgYmUgc2F2ZWQgdG8gdGhpcwotCSAqICAgICAgICAgICAgIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYXZlUmVzb3VyY2VUb0ZpbGUoUmVzb3VyY2UgYVJlc291cmNlLCBJRmlsZSBhRmlsZSwgTWFwIHNhdmVPcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmIGFGaWxlICE9IG51bGwgJiYgIWFGaWxlLmV4aXN0cygpKSB7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChzZXQgIT0gbnVsbCkgewotCQkJCVVSSUNvbnZlcnRlciBjb252ID0gc2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQkJCWlmIChjb252ICE9IG51bGwgJiYgY29udiBpbnN0YW5jZW9mIFdvcmtiZW5jaFVSSUNvbnZlcnRlcikgewotCQkJCQlXb3JrYmVuY2hVUklDb252ZXJ0ZXIgd2JDb252ID0gKFdvcmtiZW5jaFVSSUNvbnZlcnRlcikgY29udjsKLQkJCQkJU3RyaW5nIHVyaSA9IGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJCQlJUGF0aCByZXNQYXRoLCBmaWxlUGF0aDsKLQkJCQkJcmVzUGF0aCA9IG5ldyBQYXRoKHVyaSk7Ci0JCQkJCWZpbGVQYXRoID0gYUZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJCQlpbnQgcmVzQ291bnQsIGZpbGVDb3VudDsKLQkJCQkJcmVzQ291bnQgPSByZXNQYXRoLnNlZ21lbnRDb3VudCgpOwotCQkJCQlmaWxlQ291bnQgPSBmaWxlUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJaWYgKHJlc0NvdW50IDw9IGZpbGVDb3VudCkgewotCQkJCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGZpbGVDb3VudCAtIHJlc0NvdW50KTsKLQkJCQkJCWlmIChyZXNQYXRoLmVxdWFscyhmaWxlUGF0aCkpIHsKLQkJCQkJCQlPdXRwdXRTdHJlYW0gb3MgPSB3YkNvbnYuY3JlYXRlT3V0cHV0U3RyZWFtKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGFGaWxlLnRvU3RyaW5nKCkpKTsKLQkJCQkJCQlpZiAob3MgIT0gbnVsbCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJYVJlc291cmNlLnNhdmUob3MsIHNhdmVPcHRpb25zKTsKLQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCW9zLmNsb3NlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGVsZXRlRmlsZShJRmlsZSBhRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYUZpbGUgIT0gbnVsbCAmJiBhRmlsZS5leGlzdHMoKSkKLQkJCWFGaWxlLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGUKLQkgKiAKLQkgKiBAYVJlc291cmNlIGluIHRoZSBXb3JrYmVuY2guCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlkZWxldGVGaWxlKGdldEZpbGUoYVJlc291cmNlKSk7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjE1M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyNiwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKLSAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlVVJJID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0JcHJpdmF0ZSBTZXQgdmlld0lEcyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgbG9hZE9yZGVyOwotCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyID0gMDsKLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0KLQkJcGFja2FnZVVSSSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuUEFDS0FHRV9VUkkpOwotCQlpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuSUQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHBhY2thZ2VVUkksIEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzApOwotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCBFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcl9FUlJPUl8xLCBuZXcgT2JqZWN0W117ZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKX0pKTsKLQotCQlyZWFkVmlld0lEcygpOwotCQl0aGlzLmxvYWRPcmRlciA9IGxvYWRPcmRlckNvdW50ZXIrKzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoJ1snKTsKLQkJc2IuYXBwZW5kKHBhY2thZ2VVUkkpOwotCQlzYi5hcHBlbmQoIixwIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKGdldFByaW9yaXR5KCkpOwotCQlpZiAodmlld0lEcyAhPSBudWxsICYmICF2aWV3SURzLmlzRW1wdHkoKSkgewotCQkJc2IuYXBwZW5kKCc6Jyk7Ci0JCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSB2aWV3SURzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoIWZpcnN0KQotCQkJCQlzYi5hcHBlbmQoJywnKTsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCXNiLmFwcGVuZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKCddJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkVmlld0lEcygpIHsKLQkJdmlld0lEcyA9IG5ldyBIYXNoU2V0KDMpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5WSUVXKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHZpZXdJRCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXZpZXdJRCA9IGNoaWxkcmVuW2ldLmdldEF0dHJpYnV0ZShBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LklEKTsKLQkJCWlmICh2aWV3SUQgIT0gbnVsbCkKLQkJCQl2aWV3SURzLmFkZCh2aWV3SUQpOwotCQl9Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUluc3RhbmNlKCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5DTEFTU19OQU1FKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKRU1VdGlsUGx1Z2luLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJZmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VVUkkoKSB7Ci0JCXJldHVybiBwYWNrYWdlVVJJOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0Vmlld0lEcygpIHsKLQkJcmV0dXJuIHZpZXdJRHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKFN0cmluZyB2aWV3SUQpIHsKLQkJcmV0dXJuIHZpZXdJRHMuaXNFbXB0eSgpIHx8IHZpZXdJRHMuY29udGFpbnModmlld0lEKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJaWYgKHRoaXMgPT0gbykKLQkJCXJldHVybiAwOwotCQlpZiAoIShvIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSkKLQkJCXJldHVybiAxOwotCQlBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIG87Ci0KLQkJaW50IHBDb21wYXJlID0gZ2V0UHJpb3JpdHkoKSAtIGRlc2MuZ2V0UHJpb3JpdHkoKTsKLQkJaWYgKHBDb21wYXJlICE9IDApCi0JCQkvL1dlIGhhdmUgcmV2ZXJzZSB0aGUgc29ydGluZyBvZiB0aGUgcHJpb3JpdHkgZm9yIHRoZSBhZGFwdGVyIGZhY3RvcmllcwotCQkJcmV0dXJuIC1wQ29tcGFyZTsKLQotCQkvL1RoZSBncm91cCBpcyB0aGUgc2FtZSAtIGluIHRoaXMgY2FzZSB0aGUgb25lIGZvciBhIHNwZWNpZmljIHZpZXcgaGFzIHByZWNlZGVuY2Ugb3ZlcgotCQkvL2EgZ2VuZXJpYyBvbmUKLQkJZWxzZSBpZiAodmlld0lEcyAhPSBudWxsICYmICF2aWV3SURzLmlzRW1wdHkoKSkKLQkJCXJldHVybiAtMTsKLQkJZWxzZQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9hZE9yZGVyLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TG9hZE9yZGVyKCkgewotCQlyZXR1cm4gbG9hZE9yZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ODY5NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRU1GV29ya2JlbmNoRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0ZBQ1RPUlkgPSAiYWRhcHRlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX1VSSSA9ICJwYWNrYWdlVVJJIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXID0gInZpZXciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWFwIGRlc2NyaXB0b3JNYXAgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBpbnN0YW5jZTsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5JRCwgRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5BREFQVEVSX0ZBQ1RPUllfUkVHSVNUUllfRVhURU5TSU9OX1BPSU5UKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdG9ycyhFUGFja2FnZSBwa2csIFN0cmluZyB2aWV3SUQpIHsKLQkJQ29sbGVjdGlvbiBhbGwgPSBnZXREZXNjcmlwdG9ycyhwa2cpOwotCQlpZiAoYWxsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJdGVyYXRvciBpdGVyID0gYWxsLml0ZXJhdG9yKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGFsbC5zaXplKCkpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWRlc2MgPSAoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCWlmIChkZXNjLmFwcGxpZXNUbyh2aWV3SUQpKQotCQkJCXJlc3VsdC5hZGQoZGVzYyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXREZXNjcmlwdG9ycyhFUGFja2FnZSByZWdpc3RlcmVkUGFja2FnZSkgewotCQlyZXR1cm4gKENvbGxlY3Rpb24pIGdldERlc2NyaXB0b3JNYXAoKS5nZXQocmVnaXN0ZXJlZFBhY2thZ2UuZ2V0TnNVUkkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0RGVzY3JpcHRvck1hcCgpIHsKLQkJaWYgKGRlc2NyaXB0b3JNYXAgPT0gbnVsbCkKLQkJCWRlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvck1hcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEFEQVBURVJfRkFDVE9SWSkpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQkJbWFwRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHJlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1hcERlc2NyaXB0b3IoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJU3RyaW5nIHVyaSA9IGRlc2NyaXB0b3IuZ2V0UGFja2FnZVVSSSgpOwotCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzID0gKENvbGxlY3Rpb24pIGdldERlc2NyaXB0b3JNYXAoKS5nZXQodXJpKTsKLQkJaWYgKGRlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JzID0gbmV3IFRyZWVTZXQoKTsKLQkJCWdldERlc2NyaXB0b3JNYXAoKS5wdXQodXJpLCBkZXNjcmlwdG9ycyk7Ci0JCX0KLQkJZGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpOwotCQkJaW5zdGFuY2UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DaGlsZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2hpbGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZWM0MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DaGlsZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsQ29tbWFuZDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjIvMDEgODo1Nzo1NiBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2hpbGRDb21tYW5kIGV4dGVuZHMgRWRpdE1vZGVsQ29tbWFuZCB7Ci0JcHJpdmF0ZSBQYXJlbnRDb21tYW5kIHBhcmVudDsKLQlwcml2YXRlIEVkaXRNb2RlbFJldHJpZXZlciBtb2RlbFJldHJpZXZlcjsKLQotCXB1YmxpYyBDaGlsZENvbW1hbmQoUGFyZW50Q29tbWFuZCBwYXJlbnRDbWQsIENvbW1hbmQgdGFyZ2V0Q21kLCBFZGl0TW9kZWxSZXRyaWV2ZXIgcmV0cmlldmVyKSB7Ci0JCXN1cGVyKHRhcmdldENtZCk7Ci0JCXBhcmVudCA9IHBhcmVudENtZDsKLQkJbW9kZWxSZXRyaWV2ZXIgPSByZXRyaWV2ZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy9kb2VzIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlSW5Nb2RlbChBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgY21kKSB7Ci0JCUVkaXRNb2RlbCBtb2RlbCA9IG1vZGVsUmV0cmlldmVyLmdldEVkaXRNb2RlbEZvcldyaXRlKHRoaXMpOwotCQl0cnkgewotCQkJbW9kZWwuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwotCQkJbW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIyLzAxIDk6MzU6MzYgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RWRpdE1vZGVsS2V5KCkgewotCQlyZXR1cm4gbW9kZWxSZXRyaWV2ZXIuZ2V0RWRpdE1vZGVsSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMi8wMSA5OjM1OjM2IEFNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guUGFyZW50Q29tbWFuZAotCSAqLwotCXB1YmxpYyBQYXJlbnRDb21tYW5kIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlyZWRvSW5Nb2RlbCgpOwotCQlnZXRQYXJlbnQoKS5yZWRvRnJvbSh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWRvSW5Nb2RlbCgpIHsKLQkJRWRpdE1vZGVsIG1vZGVsID0gbW9kZWxSZXRyaWV2ZXIuZ2V0RWRpdE1vZGVsRm9yV3JpdGUodGhpcyk7Ci0JCXRyeSB7Ci0JCQlnZXRUYXJnZXQoKS5yZWRvKCk7Ci0JCQltb2RlbC5zYXZlSWZOZWNlc3NhcnkodGhpcyk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJdW5kb0luTW9kZWwoKTsKLQkJZ2V0UGFyZW50KCkudW5kb0Zyb20odGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5kb0luTW9kZWwoKSB7Ci0JCUVkaXRNb2RlbCBtb2RlbCA9IG1vZGVsUmV0cmlldmVyLmdldEVkaXRNb2RlbEZvcldyaXRlKHRoaXMpOwotCQl0cnkgewotCQkJZ2V0VGFyZ2V0KCkudW5kbygpOwotCQkJbW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwZjgyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCA2LCAyMDAzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRBY2Nlc3NSZWdpc3RyeSB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgV2Vha0hhc2hNYXAgcmVnaXN0cnkgPSBuZXcgV2Vha0hhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgZmluYWwgU2V0IGJhc2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJaWYgKGlzU3RhYmxlKCkpIHsKLQkJCWlmICghcmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpKSB7Ci0JCQkJU25hcHNob3Qgc25hcHNob3QgPSBuZXcgU25hcHNob3QoKTsKLQkJCQl0aGlzLnJlZ2lzdHJ5LnB1dChhY2Nlc3NvcktleSwgc25hcHNob3QpOwotCQkJCXRoaXMuYmFzZVNldC5hZGQoc25hcHNob3QpOwotCi0JCQl9IGVsc2UKLQkJCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wLCBhY2Nlc3NvcktleSk7Ci0KLQkJfSBlbHNlCi0JCQljb21wbGFpbigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKE9iamVjdCBhY2Nlc3NvcktleSkgewotCi0JCS8qCi0JCSAqIEVycm9yIGNvbmRpdGlvbjogU29tZSBvbmUgaGFzIGJlZW4gbmF1Z2h0eSBhbmQgbm90IHJlbGVhc2VkIHRoZSByZXNvdXJjZQotCQkgKi8KLQkJaWYgKHRoaXMucmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpICYmIGlzU3RhYmxlKCkpIHsKLQkJCVNuYXBzaG90IHNuYXBzaG90ID0gKFNuYXBzaG90KSB0aGlzLnJlZ2lzdHJ5LnJlbW92ZShhY2Nlc3NvcktleSk7Ci0JCQl0aGlzLmJhc2VTZXQucmVtb3ZlKHNuYXBzaG90KTsKLQkJfSBlbHNlCi0JCQljb21wbGFpbihhY2Nlc3NvcktleSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFzc2VydEFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJaWYgKCFpc0NsaWVudEFjY2Vzc2luZyhhY2Nlc3NvcktleSkpCi0JCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMSIpLCBhY2Nlc3NvcktleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDbGllbnRBY2Nlc3NpbmcoT2JqZWN0IGNsaWVudCkgewotCQlib29sZWFuIHJlc3VsdCA9IHRoaXMucmVnaXN0cnkuY29udGFpbnNLZXkoY2xpZW50KTsKLQkJaWYgKCFpc1N0YWJsZSgpKQotCQkJY29tcGxhaW4oKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBbnlDbGllbnRBY2Nlc3NpbmcoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdGhpcy5yZWdpc3RyeS5zaXplKCkgPiAwOwotCQlpZiAoIWlzU3RhYmxlKCkpCi0JCQljb21wbGFpbigpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1N0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZVNldC5zaXplKCkgPT0gdGhpcy5yZWdpc3RyeS5zaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29tcGxhaW4oKSB7Ci0JCWNvbXBsYWluKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbXBsYWluKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlpZiAoIWlzU3RhYmxlKCkpCi0JCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24odGhpcy5yZWdpc3RyeSwgdGhpcy5iYXNlU2V0KTsKLQkJdGhyb3cgbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzEiKSwgYWNjZXNzb3JLZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkNsaWVudEFjY2Vzc1JlZ2lzdHJ5OiBbIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgoaXNTdGFibGUoKSkgPyAiU1RBQkxFIiA6ICJPVVQgT0YgU1lOQyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmVzdWx0LmFwcGVuZCgiXTogUmVmZXJlbmNlIENvdW50ID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0aGlzLnNpemUoKSk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5yZWdpc3RyeS5zaXplKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWExY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMiwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcjsKLQotCi0vKioKLSAqIFRoZSBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbiBhY2NlcHRzIGEgV2Vha0hhc2hTZXQgcmVnaXN0cnkgYW5kIGEgU2V0IG9mIGFsbCBTbmFwc2hvdHMgdGhhdAotICogc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiB0aGUgcmVnaXN0cnkuIEl0IHdpbGwgcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IHNldCBkaWZmZXJlbmNlIGluIG9yZGVyIHRvCi0gKiBkZXRlcm1pbmUgd2hpY2ggU25hcHNob3RzIGV4aXN0IGluIHRoZSBiYXNlU2V0IGJ1dCBub3QgaW4gdGhlIHJlZ2lzdHJ5LgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQU5HTElOR19SRUZFUkVOQ0UgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQUNDRVNTX0tFWSA9IDI7Ci0JcHJpdmF0ZSBXZWFrSGFzaE1hcCByZWdpc3RyeSA9IG51bGw7Ci0JcHJpdmF0ZSBTZXQgYmFzZVNldCA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NlZCA9IGZhbHNlOwotCXByaXZhdGUgaW50IHR5cGUgPSBVTktOT1dOOwotCi0JcHVibGljIENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKFdlYWtIYXNoTWFwIHJlZ2lzdHJ5LCBTZXQgYmFzZVNldCkgewotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXRoaXMuYmFzZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXRoaXMuYmFzZVNldC5hZGRBbGwoYmFzZVNldCk7Ci0JCXRoaXMudHlwZSA9IERBTkdMSU5HX1JFRkVSRU5DRTsKLQl9Ci0KLQlwdWJsaWMgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oU3RyaW5nIG1zZywgT2JqZWN0IGtleSkgewotCQlzdXBlcihtc2cgKyAiIDogIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy50eXBlID0gSU5WQUxJRF9BQ0NFU1NfS0VZOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLlRocm93YWJsZSNwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gcykgewotCi0JCXMucHJpbnRsbih0b1N0cmluZygpKTsKLQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCi0JCWlmICh0aGlzLnJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCVNuYXBzaG90IHNuYXBzaG90ID0gbnVsbDsKLQkJCWlmICghcHJvY2Vzc2VkKSB7Ci0JCQkJT2JqZWN0IGtleSA9IG51bGw7Ci0JCQkJSXRlcmF0b3Iga2V5SXRlcmF0b3IgPSB0aGlzLnJlZ2lzdHJ5LmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlrZXkgPSBrZXlJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCXNuYXBzaG90ID0gKFNuYXBzaG90KSB0aGlzLnJlZ2lzdHJ5LmdldChrZXkpOwotCQkJCQl0aGlzLmJhc2VTZXQucmVtb3ZlKHNuYXBzaG90KTsKLQkJCQl9Ci0JCQkJcHJvY2Vzc2VkID0gdHJ1ZTsKLQkJCX0KLQkJCXMucHJpbnRsbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkNsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uX1VJXzAsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihiYXNlU2V0LnNpemUoKSkudG9TdHJpbmcoKX0pKTsKLQotCQkJZm9yIChJdGVyYXRvciBwb3NzaWJsZUN1bHByaXRzSXRyID0gYmFzZVNldC5pdGVyYXRvcigpOyBwb3NzaWJsZUN1bHByaXRzSXRyLmhhc05leHQoKTspIHsKLQkJCQlzbmFwc2hvdCA9IChTbmFwc2hvdCkgcG9zc2libGVDdWxwcml0c0l0ci5uZXh0KCk7Ci0JCQkJc25hcHNob3QucHJpbnRTdGFja1RyYWNlKHMpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHMpIHsKLQotCQlzLnByaW50bG4odG9TdHJpbmcoKSk7Ci0JCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQkJaWYgKHRoaXMucmVnaXN0cnkgIT0gbnVsbCkgewotCQkJU25hcHNob3Qgc25hcHNob3QgPSBudWxsOwotCQkJaWYgKCFwcm9jZXNzZWQpIHsKLQkJCQlPYmplY3Qga2V5ID0gbnVsbDsKLQkJCQlJdGVyYXRvciBrZXlJdGVyYXRvciA9IHRoaXMucmVnaXN0cnkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoa2V5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCWtleSA9IGtleUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJc25hcHNob3QgPSAoU25hcHNob3QpIHRoaXMucmVnaXN0cnkuZ2V0KGtleSk7Ci0JCQkJCXRoaXMuYmFzZVNldC5yZW1vdmUoc25hcHNob3QpOwotCQkJCX0KLQkJCQlwcm9jZXNzZWQgPSB0cnVlOwotCQkJfQotCQkJcy5wcmludGxuKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIiLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoYmFzZVNldC5zaXplKCkpLnRvU3RyaW5nKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJZm9yIChJdGVyYXRvciBwb3NzaWJsZUN1bHByaXRzSXRyID0gYmFzZVNldC5pdGVyYXRvcigpOyBwb3NzaWJsZUN1bHByaXRzSXRyLmhhc05leHQoKTspIHsKLQkJCQlzbmFwc2hvdCA9IChTbmFwc2hvdCkgcG9zc2libGVDdWxwcml0c0l0ci5uZXh0KCk7Ci0JCQkJc25hcHNob3QucHJpbnRTdGFja1RyYWNlKHMpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBEQU5HTElOR19SRUZFUkVOQ0UgOgotCQkJCXJldHVybiAiREFOR0xJTkdfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBJTlZBTElEX0FDQ0VTU19LRVkgOgotCQkJCXJldHVybiAiSU5WQUxJRF9BQ0NFU1NfS0VZIjsgLy8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSkuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkNsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uX1VJXzEsIG5ldyBPYmplY3RbXXtnZXRUeXBlKCl9KSk7Ci0JCS8vCQlpZiAodGhpcy5iYWRSZWZlcmVuY2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCS8vCQkJcmVzdWx0LmFwcGVuZCgiVGhlIGludmFsaWQgYWNjZXNzIG9jY3VycmVkIHNvbWV3aGVyZSBpbiB0aGUgZm9sbG93aW5nIHN0YWNrCi0JCS8vIHRyYWNlLiIpLmFwcGVuZCgiXG4iKTsKLQkJLy8JCQlyZXN1bHQuYXBwZW5kKHRoaXMuYmFkUmVmZXJlbmNlTG9jYXRpb24uZ2V0U3RhY2tUcmFjZVN0cmluZygpKTsKLQkJLy8JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbigidGVzdCBtZXNzYWdlIiwgIi1zb21la2V5b2JqLSIpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJMSU5FQlJFQUsiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKG5ldyBXZWFrSGFzaE1hcCgpLCBuZXcgSGFzaFNldCgpKS50b1N0cmluZygpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJMSU5FQlJFQUsiKTsgLy8kTk9OLU5MUy0xJAotCQluZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oInRlc3QgbWVzc2FnZSIsICItc29tZWtleW9iai0iKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiTElORUJSRUFLIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKG5ldyBXZWFrSGFzaE1hcCgpLCBuZXcgSGFzaFNldCgpKS5wcmludFN0YWNrVHJhY2UoKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FTUZXb3JrYmVuY2hFZGl0Q29udGV4dEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOGQyZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FTUZXb3JrYmVuY2hFZGl0Q29udGV4dEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5qb2JzLkxvY2tNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5JRU1GQ29udGV4dENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5SZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXI7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5IGV4dGVuZHMgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgewotCQotCQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBwcmltQ3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEVNRldvcmtiZW5jaENvbnRleHQoYVByb2plY3QpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBjcmVhdGVTeW5jaHJvbml6ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0LCBJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcihhUmVzb3VyY2VTZXQsIGFQcm9qZWN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBMb2NrTWFuYWdlciBsb2NrTWFuYWdlciA9IG5ldyBMb2NrTWFuYWdlcigpOwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIHByb2plY3RMb2NrcyA9IG5ldyBIYXNodGFibGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgSUxvY2sgZ2V0UHJvamVjdExvY2tPYmplY3QoSVByb2plY3QgYVByb2plY3QpewotCQlpZihudWxsID09IGFQcm9qZWN0KXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUludGVnZXIgaGFzaENvZGUgPSBuZXcgSW50ZWdlcihhUHJvamVjdC5oYXNoQ29kZSgpKTsKLQkJc3luY2hyb25pemVkIChwcm9qZWN0TG9ja3MpIHsKLQkJCUlMb2NrIGxvY2sgPSAoSUxvY2spcHJvamVjdExvY2tzLmdldChoYXNoQ29kZSk7Ci0JCQlpZihsb2NrID09IG51bGwpewotCQkJCWxvY2sgPSBsb2NrTWFuYWdlci5uZXdMb2NrKCk7Ci0JCQkJcHJvamVjdExvY2tzLnB1dChoYXNoQ29kZSwgbG9jayk7Ci0JCQl9Ci0JCQlyZXR1cm4gbG9jazsKLQkJfQotCX0KLQkKLQlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgY3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCwgSUVNRkNvbnRleHRDb250cmlidXRvciBjb250cmlidXRvcikgewotCQlJTG9jayBsb2NrID0gZ2V0UHJvamVjdExvY2tPYmplY3QoYVByb2plY3QpOwotCQl0cnl7Ci0JCQlpZihudWxsICE9IGxvY2spewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUVNRkNvbnRleHQoYVByb2plY3QsIGNvbnRyaWJ1dG9yKTsKLQkJfSBmaW5hbGx5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZ2V0Q2FjaGVkRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCkgewotCQlJTG9jayBsb2NrID0gZ2V0UHJvamVjdExvY2tPYmplY3QoYVByb2plY3QpOwotCQl0cnl7Ci0JCQlpZihudWxsICE9IGxvY2spewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldENhY2hlZEVNRkNvbnRleHQoYVByb2plY3QpOwotCQl9IGZpbmFsbHl7Ci0JCQlpZihudWxsICE9IGxvY2spewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDFkZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE4LCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZQotICogR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5Db25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXI7Ci0KLQotcHVibGljIGNsYXNzIEVkaXRNb2RlbEV4dGVuc2lvbiBleHRlbmRzIENvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQVRUUiA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGVkaXRNb2RlbElEID0gbnVsbDsKLQlwcml2YXRlIENvbGxlY3Rpb24gcmVzb3VyY2VzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0KLQotCXB1YmxpYyBFZGl0TW9kZWxFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShJRF9BVFRSKTsKLQkJaWYgKGlkID09IG51bGwpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiSW5jb3JyZWN0IHVzYWdlIG9mIGVkaXRNb2RlbEV4dGVuc2lvbiBleHRlbnNpb24gcG9pbnQuICBFbGVtZW50IG11c3QgY29udGFpbiBpZCBhdHRyaWJ1dGUuICBQbHVnaW46ICIgKyBnZXRQbHVnaW5JZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZWRpdE1vZGVsSUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeS5FRElUX01PREVMX0lEX0FUVFIpOwotCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVkaXRNb2RlbFJlc291cmNlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRWRpdE1vZGVsUmVzb3VyY2UuRURJVF9NT0RFTF9SRVNPVVJDRV9FTEVNRU5UKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBlZGl0TW9kZWxSZXNvdXJjZXMubGVuZ3RoOyBqKyspCi0JCQlyZXNvdXJjZXMuYWRkKG5ldyBFZGl0TW9kZWxSZXNvdXJjZShlZGl0TW9kZWxSZXNvdXJjZXNbal0sIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdE1vZGVsSUQoKSB7Ci0JCXJldHVybiBlZGl0TW9kZWxJRDsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YmM1MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luOwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLWNsYXNzIEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkgSU5TVEFOQ0UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9FWFRfRUxFTUVOVCA9ICJlZGl0TW9kZWxFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRF9BVFRSID0gImVkaXRNb2RlbElEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0lEX0FUVFIgPSAiZnVuY3Rpb25Hcm91cElEIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcml2YXRlIE1hcCBleHRlbnNpb25zID0gbnVsbDsKLQotCXByb3RlY3RlZCBFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeSgpIHsKLQkJc3VwZXIoRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5JRCwgRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5FRElUX01PREVMX0VYVEVOU0lPTl9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlDb2xsZWN0aW9uIGV4dGVuc2lvbnNCeUlEID0gbnVsbDsKLQkJRWRpdE1vZGVsRXh0ZW5zaW9uIGVkaXRNb2RlbEV4dGVuc2lvbiA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRURJVF9NT0RFTF9FWFRfRUxFTUVOVCkpIHsKLQkJCWVkaXRNb2RlbEV4dGVuc2lvbiA9IG5ldyBFZGl0TW9kZWxFeHRlbnNpb24oZWxlbWVudCk7Ci0JCQlleHRlbnNpb25zQnlJRCA9IChDb2xsZWN0aW9uKSBnZXRFeHRlbnNpb25zKCkuZ2V0KGVkaXRNb2RlbEV4dGVuc2lvbi5nZXRFZGl0TW9kZWxJRCgpKTsKLQkJCWlmIChleHRlbnNpb25zQnlJRCA9PSBudWxsKSB7Ci0JCQkJZXh0ZW5zaW9uc0J5SUQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZ2V0RXh0ZW5zaW9ucygpLnB1dChlZGl0TW9kZWxFeHRlbnNpb24uZ2V0RWRpdE1vZGVsSUQoKSwgZXh0ZW5zaW9uc0J5SUQpOwotCQkJfQotCQkJZXh0ZW5zaW9uc0J5SUQuYWRkKGVkaXRNb2RlbEV4dGVuc2lvbik7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRFeHRlbnNpb25zKCkgewotCQlpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJZXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBleHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFZGl0TW9kZWxSZXNvdXJjZXMoT2JqZWN0IGVkaXRNb2RlbElEKSB7Ci0JCS8vVE9ETyAtIENhY2hlIHRoZSByZXNvdXJjZXMKLQkJQ29sbGVjdGlvbiBlZGl0TW9kZWxSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gZWRpdE1vZGVsRXh0ZW5zaW9ucyA9IChDb2xsZWN0aW9uKSBnZXRFeHRlbnNpb25zKCkuZ2V0KGVkaXRNb2RlbElEKTsKLQotCQlpZiAoZWRpdE1vZGVsRXh0ZW5zaW9ucyA9PSBudWxsIHx8IGVkaXRNb2RlbEV4dGVuc2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJSXRlcmF0b3IgaXRyID0gZWRpdE1vZGVsRXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJRWRpdE1vZGVsRXh0ZW5zaW9uIGV4dCA9IChFZGl0TW9kZWxFeHRlbnNpb24pIGl0ci5uZXh0KCk7Ci0JCQllZGl0TW9kZWxSZXNvdXJjZXMuYWRkQWxsKGV4dC5nZXRSZXNvdXJjZXMoKSk7Ci0JCX0KLQkJcmV0dXJuICghZWRpdE1vZGVsRXh0ZW5zaW9ucy5pc0VtcHR5KCkpID8gZWRpdE1vZGVsUmVzb3VyY2VzIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjZDljYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLklFZGl0TW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBFZGl0TW9kZWxSZWdpc3RyeSBJTlNUQU5DRSA9ICBuZXcgRWRpdE1vZGVsUmVnaXN0cnkoKTsKLQotCXByaXZhdGUgZmluYWwgTWFwIGZhY3RvcnlDb25maWd1cmF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9FTEVNRU5UID0gImVkaXRNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1JFU09VUkNFX0VYVEVOU0lPTiA9ICJyZXNvdXJjZUV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1JFU09VUkNFX0VYVEVOU0lPTl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRF9BVFRSID0gImVkaXRNb2RlbElEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUllfQ0xBU1NfQVRUUiA9ICJmYWN0b3J5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX01PREVMX0FUVFIgPSAicGFyZW50TW9kZWxJRCI7IC8vJE5PTi1OTFMtMSQKLQotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1VOS05PV05fUkVTT1VSQ0VTX0FUVFIgPSAibG9hZFVua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbFJlZ2lzdHJ5KCkgewotCQlzdXBlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLkVESVRfTU9ERUxfRkFDVE9SSUVTX0VYVEVOU0lPTl9QT0lOVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFZGl0TW9kZWxSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYoaXNJbml0aWFsaXplZCgpKSAKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJc3luY2hyb25pemVkKElOU1RBTkNFKSB7Ci0JCQlpZighaXNJbml0aWFsaXplZCgpKSB7Ci0JCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJfQotCQl9IAotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkvKgotCQkgKiBUaGUgRWRpdE1vZGVsIEV4dGVuc2lvbiBQb2ludCBkZWZpbmVzIENvbmZpZ3VyYXRpb24gZWxlbWVudHMgbmFtZWQgImVkaXRNb2RlbCIgd2l0aAotCQkgKiBhdHRyaWJ1dGVzICJlZGl0TW9kZWxJRCIgYW5kICJmYWN0b3J5Q2xhc3MiCi0JCSAqLwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVESVRfTU9ERUxfRUxFTUVOVCkpIHsKLQkJCVN0cmluZyBlZGl0TW9kZWxJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVESVRfTU9ERUxfSURfQVRUUik7Ci0JCQlpZiAoZWRpdE1vZGVsSUQgIT0gbnVsbCkgewotCQkJCXRoaXMuZmFjdG9yeUNvbmZpZ3VyYXRpb25zLnB1dChlZGl0TW9kZWxJRCwgbmV3IEVkaXRNb2RlbEluZm8oZWRpdE1vZGVsSUQsIGVsZW1lbnQpKTsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlJRWRpdE1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RWRpdE1vZGVsRmFjdG9yeUJ5S2V5KGVkaXRNb2RlbElEKTsKLQkJcmV0dXJuIGZhY3RvcnkuZ2V0Q2FjaGVJRChlZGl0TW9kZWxJRCwgcGFyYW1zKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZhY3RvcnlCeUtleShlZGl0TW9kZWxJRCkuY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxJRCwgY29udGV4dCwgcGFyYW1zKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKSB7Ci0JCXJldHVybiBnZXRFZGl0TW9kZWxGYWN0b3J5QnlLZXkoZWRpdE1vZGVsSUQpLmNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBjb250ZXh0LCBwYXJhbXMpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVkaXRNb2RlbFJlc291cmNlcyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsKLQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBuZXcgVHJlZVNldCgpOwotCi0JCUVkaXRNb2RlbEluZm8gbmV4dEVkaXRNb2RlbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7Ci0KLQkJU3RyaW5nIHBhcmVudE1vZGVsSUQgPSBudWxsOwotCQlNYXAgdmlzaXRlZEVkaXRNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOwotCQkvKiBjb2xsZWN0IHRoZSByZXNvdXJjZXMgZnJvbSB0aGUgcGFyZW50cyAqLwotCQl3aGlsZSAobmV4dEVkaXRNb2RlbEluZm8gIT0gbnVsbCAmJiAocGFyZW50TW9kZWxJRCA9IG5leHRFZGl0TW9kZWxJbmZvLmdldFBhcmVudE1vZGVsSUQoKSkgIT0gbnVsbCkgewotCQkJaWYgKHZpc2l0ZWRFZGl0TW9kZWxzLmNvbnRhaW5zS2V5KHBhcmVudE1vZGVsSUQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5FZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8wLCBuZXcgT2JqZWN0W117ZWRpdE1vZGVsSUR9KSk7Ci0JCQl2aXNpdGVkRWRpdE1vZGVscy5wdXQocGFyZW50TW9kZWxJRCwgbnVsbCk7Ci0JCQlyZXNvdXJjZXMuYWRkQWxsKGdldEFsbEVkaXRNb2RlbFJlc291cmNlcyhwYXJlbnRNb2RlbElEKSk7Ci0JCQluZXh0RWRpdE1vZGVsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKHBhcmVudE1vZGVsSUQpOwotCQl9Ci0KLQkJLyogR2V0IHRoZSByZXNvdXJjZXMgZm9yIHRoZSBhY3R1YWwgZWRpdCBtb2RlbCBpZCAqLwotCQlyZXNvdXJjZXMuYWRkQWxsKGdldEFsbEVkaXRNb2RlbFJlc291cmNlcyhlZGl0TW9kZWxJRCkpOwotCi0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVkaXRNb2RlbEV4dGVuc2lvbnMoU3RyaW5nIGVkaXRNb2RlbElEKSB7IAotCQlDb2xsZWN0aW9uIGV4dGVuc2lvbnMgPSBuZXcgVHJlZVNldCgpOwotCQkKLQkJRWRpdE1vZGVsSW5mbyBuZXh0RWRpdE1vZGVsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKGVkaXRNb2RlbElEKTsKLQotCQlTdHJpbmcgcGFyZW50TW9kZWxJRCA9IG51bGw7Ci0JCU1hcCB2aXNpdGVkRWRpdE1vZGVscyA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8qIGNvbGxlY3QgdGhlIHJlc291cmNlcyBmcm9tIHRoZSBwYXJlbnRzICovCi0JCXdoaWxlKG5leHRFZGl0TW9kZWxJbmZvICE9IG51bGwgJiYgKHBhcmVudE1vZGVsSUQgPSBuZXh0RWRpdE1vZGVsSW5mby5nZXRQYXJlbnRNb2RlbElEKCkpICE9IG51bGwpIHsKLQkJCWlmKHZpc2l0ZWRFZGl0TW9kZWxzLmNvbnRhaW5zS2V5KHBhcmVudE1vZGVsSUQpKSAKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMCxuZXcgT2JqZWN0IFtdIHtlZGl0TW9kZWxJRH0pKTsgCi0JCQllbHNlIAotCQkJCXZpc2l0ZWRFZGl0TW9kZWxzLnB1dChwYXJlbnRNb2RlbElELCBudWxsKTsKLQkJCQotCQkJZXh0ZW5zaW9ucy5hZGRBbGwoZ2V0QWxsRWRpdE1vZGVsRXh0ZW5zaW9ucyhwYXJlbnRNb2RlbElEKSk7Ci0JCQluZXh0RWRpdE1vZGVsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKHBhcmVudE1vZGVsSUQpOwotCQl9Ci0JCQotCQkvKiBHZXQgdGhlIHJlc291cmNlcyBmb3IgdGhlIGFjdHVhbCBlZGl0IG1vZGVsIGlkICovCi0JCWV4dGVuc2lvbnMuYWRkQWxsKGdldEFsbEVkaXRNb2RlbEV4dGVuc2lvbnMoZWRpdE1vZGVsSUQpKTsKLQkJCi0JCXJldHVybiBleHRlbnNpb25zOwotCX0KLQkKLQlwdWJsaWMgSUVkaXRNb2RlbEZhY3RvcnkgZmluZEVkaXRNb2RlbEZhY3RvcnlCeUtleShPYmplY3QgZWRpdE1vZGVsSUQpIHsKLQkJSUVkaXRNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCUVkaXRNb2RlbEluZm8gZWRpdE1kbEluZm8gPSAoRWRpdE1vZGVsSW5mbykgZmFjdG9yeUNvbmZpZ3VyYXRpb25zLmdldChlZGl0TW9kZWxJRCk7Ci0JCWlmIChlZGl0TWRsSW5mbyAhPSBudWxsKQotCQkJZmFjdG9yeSA9IGVkaXRNZGxJbmZvLmdldEVkaXRNb2RlbEZhY3RvcnkoKTsKLQkJcmV0dXJuIGZhY3Rvcnk7IAotCX0KLQkKLQlwdWJsaWMgSUVkaXRNb2RlbEZhY3RvcnkgZmluZEVkaXRNb2RlbEZhY3RvcnlCeVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZmFjZXRlZFByb2plY3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUl0ZXJhdG9yIGtleXMgPSBmYWN0b3J5Q29uZmlndXJhdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0KCk7Ci0JCQlpZiAoa2V5IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoKFN0cmluZylrZXkpOwotCQkJCQlpZiAocHJvamVjdEZhY2V0ICE9IG51bGwgJiYgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KHByb2plY3RGYWNldCkpCi0JCQkJCQlyZXR1cm4gZmluZEVkaXRNb2RlbEZhY3RvcnlCeUtleShrZXkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0QWxsRWRpdE1vZGVsUmVzb3VyY2VzKFN0cmluZyBlZGl0TW9kZWxJRCkgewotCQlDb2xsZWN0aW9uIHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzb3VyY2VzLmFkZEFsbChnZXRMb2NhbEVkaXRNb2RlbFJlc291cmNlcyhlZGl0TW9kZWxJRCkpOwotCQlyZXNvdXJjZXMuYWRkQWxsKGdldEV4dGVuZGVkRWRpdE1vZGVsUmVzb3VyY2VzKGVkaXRNb2RlbElEKSk7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEFsbEVkaXRNb2RlbEV4dGVuc2lvbnMoU3RyaW5nIGVkaXRNb2RlbElEKSB7Ci0JCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXNvdXJjZXMuYWRkQWxsKGdldExvY2FsRWRpdE1vZGVsRXh0ZW5zaW9ucyhlZGl0TW9kZWxJRCkpOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldExvY2FsRWRpdE1vZGVsUmVzb3VyY2VzKFN0cmluZyBlZGl0TW9kZWxJRCkgeyAKLQkJRWRpdE1vZGVsSW5mbyBlZGl0TWRsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKGVkaXRNb2RlbElEKTsKLSAgCQlyZXR1cm4gKGVkaXRNZGxJbmZvICE9IG51bGwpID8gZWRpdE1kbEluZm8uZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKCkgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOyAKLQl9Ci0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0TG9jYWxFZGl0TW9kZWxFeHRlbnNpb25zKFN0cmluZyBlZGl0TW9kZWxJRCkgeyAKLQkJRWRpdE1vZGVsSW5mbyBlZGl0TWRsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKGVkaXRNb2RlbElEKTsKLSAgCQlyZXR1cm4gKGVkaXRNZGxJbmZvICE9IG51bGwpID8gZWRpdE1kbEluZm8uZ2V0RWRpdE1vZGVsRXh0ZW5zaW9ucygpIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsgCi0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RXh0ZW5kZWRFZGl0TW9kZWxSZXNvdXJjZXMoU3RyaW5nIGVkaXRNb2RlbElEKSB7Ci0JCXJldHVybiBFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVkaXRNb2RlbFJlc291cmNlcyhlZGl0TW9kZWxJRCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRNb2RlbEtleQotCSAqICAgICAgICAgICAgdGhlIGVkaXRNb2RlbElEIG9mIGEgZ2l2ZW4gRWRpdE1vZGVsRmFjdG9yeSBkZWZpbmVkIGluIHRoZSBFeHRlbnNpb24gUG9pbnQKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgSUVkaXRNb2RlbEZhY3RvcnkgY2Fubm90IGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gSUQuCi0JICogQHJldHVybiB0aGUgRWRpdE1vZGVsRmFjdG9yeSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBFZGl0TW9kZWxJRAotCSAqLwotCXByb3RlY3RlZCBJRWRpdE1vZGVsRmFjdG9yeSBnZXRFZGl0TW9kZWxGYWN0b3J5QnlLZXkoT2JqZWN0IGVkaXRNb2RlbElEKSB7Ci0JCUlFZGl0TW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlFZGl0TW9kZWxJbmZvIGVkaXRNZGxJbmZvID0gZ2V0RWRpdE1vZGVsSW5mb0J5SWQoZWRpdE1vZGVsSUQpOwotCQlpZiAoZWRpdE1kbEluZm8gIT0gbnVsbCkKLQkJCWZhY3RvcnkgPSBlZGl0TWRsSW5mby5nZXRFZGl0TW9kZWxGYWN0b3J5KCk7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5FZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8yLCBuZXcgT2JqZWN0W117ZWRpdE1vZGVsSUR9KSk7Ci0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCQotCS8qKgotICAgICAqIEBwYXJhbSBlZGl0TW9kZWxJRAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWRpdE1vZGVsSW5mbyBnZXRFZGl0TW9kZWxJbmZvQnlJZChPYmplY3QgZWRpdE1vZGVsSUQpIHsKLSAgICAgICAgd2FpdEZvckluaXRpYWxpemF0aW9uSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgcmV0dXJuIChFZGl0TW9kZWxJbmZvKSBmYWN0b3J5Q29uZmlndXJhdGlvbnMuZ2V0KGVkaXRNb2RlbElEKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgd2UgYXJlIG5vdCBpbml0aWFsaXplZCwgYmxvY2sgdW50aWwgdGhlIElOU1RBTkNFIGlzIHJlbGVhc2VkICggZnJvbSBnZXRJbnN0YW5jZSgpKQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9ySW5pdGlhbGl6YXRpb25JZk5lY2Vzc2FyeSgpIHsKLSAgICAgICAgLyogV2Ugb25seSBuZWVkIHRvIGFjcXVpcmUgdGhlIHNlbWFwaG9yZSAoSU5TVEFOQ0UpLCB3ZSBkbyBub3QgbmVlZCAKLSAgICAgICAgICogdG8gZXhlY3V0ZSBhbnl0aGluZyBpbiB0aGlzIGJsb2NrLiBJZiB0aGUgUmVnaXN0cnkgaXMgbm90IGluaXRhaWxpemVkLAotICAgICAgICAgKiB0aGVuIGl0IHdpbGwgYmxvY2sgdW50aWwgdGhlIHNlbWFwaG9yZSBpcyByZWxlYXNlZCAoZnJvbSBnZXRJbnN0YW5jZSgpKSwKLSAgICAgICAgICogYW5kIHRoZW4gcmVsZWFzZSBpdCBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LiAKLSAgICAgICAgICovCi0JCWlmKCFpc0luaXRpYWxpemVkKCkpIAotCQkgICAgc3luY2hyb25pemVkKElOU1RBTkNFKSB7IH0KLSAgICB9Ci0KLQlwdWJsaWMgY2xhc3MgRWRpdE1vZGVsSW5mbyB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZWRpdE1vZGVsSUQgPSBudWxsOwotCQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBJRWRpdE1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJcHJpdmF0ZSBMaXN0IGVkaXRNb2RlbFJlc291cmNlcyA9IG51bGw7Ci0JCXByaXZhdGUgTGlzdCBlZGl0TW9kZWxFeHRlbnNpb25zID0gbnVsbDsKLQotCQlwcml2YXRlIFN0cmluZyBwYXJlbnRNb2RlbElEID0gbnVsbDsKLQotCQlwcml2YXRlIFN0cmluZyB0b3N0cmluZ0NhY2hlID0gbnVsbDsKLQotCQlwdWJsaWMgRWRpdE1vZGVsSW5mbyhTdHJpbmcgZWRpdE1vZGVsSUQsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCkgewotCi0JCQl0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50ID0gY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JCQl0aGlzLmVkaXRNb2RlbElEID0gZWRpdE1vZGVsSUQ7Ci0JCQl0aGlzLnBhcmVudE1vZGVsSUQgPSB0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50LmdldEF0dHJpYnV0ZShQQVJFTlRfTU9ERUxfQVRUUik7Ci0JCX0KLQotCi0JCXB1YmxpYyBMaXN0IGdldEVkaXRNb2RlbFJlc291cmNlcygpIHsKLQkJCS8qIHRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgKi8KLQkJCWluaXRpYWxpemVSZXNvdXJjZXMoKTsKLQkJCXJldHVybiBlZGl0TW9kZWxSZXNvdXJjZXM7Ci0JCX0KLQotCQlwdWJsaWMgSUVkaXRNb2RlbEZhY3RvcnkgZ2V0RWRpdE1vZGVsRmFjdG9yeSgpIHsKLS8vCQkJIERvIG5vdCBibG9jayBpZiB0aGUgZmFjdG9yeSBpcyBub3QgbnVsbAotCQkJaWYgKHRoaXMuZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkgIHN5bmNocm9uaXplZCAodGhpcykgewotCQkJICAgICAgLy8gYW5vdGhlciB0aHJlYWQgY291bGQgaGF2ZSBhbHJlYWR5IGluaXRpYWxpemVkIHRoZSBmYWN0b3J5Ci0JCQkgICAgICAvLyB3aGlsZSB0aGlzIHRocmVhZCB3YXMgd2FpdGluZyB0byBlbnRlciB0aGUgc3luYyBibG9jawotCQkJICAgICAgaWYodGhpcy5mYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJaWYgKHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl0aGlzLmZhY3RvcnkgPSAoSUVkaXRNb2RlbEZhY3RvcnkpIHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihGQUNUT1JZX0NMQVNTX0FUVFIpOwotCQkJCQkJCUJvb2xlYW4gdmFsdWUgPSBCb29sZWFuLnZhbHVlT2YodGhpcy5jb25maWd1cmF0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoTE9BRF9VTktOT1dOX1JFU09VUkNFU19BVFRSKSk7Ci0JCQkJCQkJdGhpcy5mYWN0b3J5LnNldExvYWRLbm93blJlc291cmNlc0FzUmVhZE9ubHkodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJCQkJCWRpc2NhcmRDb25maWd1cmF0aW9uRWxlbWVudElmTmVjZXNzYXJ5KCk7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKEVNRldvcmtiZW5jaEVkaXRQbHVnaW4uSUQpLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMSk7Ci0JCQkJCX0KLQkJCSAgICAgIH0KLQkJCSAgICB9Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5mYWN0b3J5OwotCQl9Ci0KLQkJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VzKCkgewotCi0JCQlpZiAoZWRpdE1vZGVsUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlpZiAoY29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgewotCi0JCQkJCWVkaXRNb2RlbFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByZXNvdXJjZXMgPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXRDaGlsZHJlbihFZGl0TW9kZWxSZXNvdXJjZS5FRElUX01PREVMX1JFU09VUkNFX0VMRU1FTlQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByZXNFeHRlbnNpb25zID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oRURJVF9NT0RFTF9SRVNPVVJDRV9FWFRFTlNJT04pOwotCQkJCQkvLyBzZXQgdGhlIGNvbmZpZ3VyYXRpb25FbGVtZW50IHRvIG51bGwtIGtlZXBzIGNvZGUgZnJvbSByZWVudGVyaW5nCi0JCQkJCWRpc2NhcmRDb25maWd1cmF0aW9uRWxlbWVudElmTmVjZXNzYXJ5KCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVzb3VyY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQllZGl0TW9kZWxSZXNvdXJjZXMuYWRkKG5ldyBFZGl0TW9kZWxSZXNvdXJjZShyZXNvdXJjZXNbal0pKTsKLQkJCQkJfQotCQkJCQlpZiAocmVzRXh0ZW5zaW9ucyA9PSBudWxsIHx8IHJlc0V4dGVuc2lvbnMubGVuZ3RoID09IDApIHsKLQkJCQkJCWVkaXRNb2RlbEV4dGVuc2lvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWRpdE1vZGVsRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNFeHRlbnNpb25zW2ldLmdldEF0dHJpYnV0ZShFRElUX01PREVMX1JFU09VUkNFX0VYVEVOU0lPTl9OQU1FKTsKLQkJCQkJCQllZGl0TW9kZWxFeHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWRpdE1vZGVsUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQkJZWRpdE1vZGVsRXh0ZW5zaW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRpc2NhcmRDb25maWd1cmF0aW9uRWxlbWVudElmTmVjZXNzYXJ5KCkgewotCQkJaWYgKHRoaXMuZWRpdE1vZGVsUmVzb3VyY2VzICE9IG51bGwgJiYgdGhpcy5mYWN0b3J5ICE9IG51bGwpCi0JCQkJdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKHRvc3RyaW5nQ2FjaGUgPT0gbnVsbCkKLQkJCQl0b3N0cmluZ0NhY2hlID0gIkVkaXRNb2RlbElEOiB7IiArIHRoaXMuZWRpdE1vZGVsSUQgKyAifSwgUGFyZW50IE1vZGVsIElEIHsiICsgdGhpcy5wYXJlbnRNb2RlbElEICsgIn0sIENvbmZpZ3VyYXRpb24gRWxlbWVudDogWyIgKyB0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50ICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtNCQKLQkJCXJldHVybiB0b3N0cmluZ0NhY2hlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyZW50TW9kZWxJRC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TW9kZWxJRCgpIHsKLQkJCXJldHVybiBwYXJlbnRNb2RlbElEOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdCBnZXRFZGl0TW9kZWxFeHRlbnNpb25zKCkgewotCQkJLyogdGhpcyBtZXRob2QgaXMgZ3VhcmRlZCAqLwotCQkJaW5pdGlhbGl6ZVJlc291cmNlcygpOwotCQkJcmV0dXJuIGVkaXRNb2RlbEV4dGVuc2lvbnM7Ci0JCX0KLQotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluaXRpYWxpemVkLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6ZWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRSZWdpc3RlcmVkRWRpdE1vZGVsSURzKCkgewotCQlyZXR1cm4gKFN0cmluZ1tdKSBmYWN0b3J5Q29uZmlndXJhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW2ZhY3RvcnlDb25maWd1cmF0aW9ucy5rZXlTZXQoKS5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTQzYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiA1LCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZQotICogR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3I7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsUmVzb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfVVJJX0FUVFIgPSAiVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fTE9BRF9BVFRSID0gImF1dG9sb2FkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfUkVTT1VSQ0VfRUxFTUVOVCA9ICJlZGl0TW9kZWxSZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyID0gMTsKLQlwcml2YXRlIFVSSSB1cmk7Ci0JcHJpdmF0ZSBib29sZWFuIGF1dG9sb2FkID0gZmFsc2U7Ci0JLy9JbmRpY2F0ZXMgaWYgdGhpcyB3YXMgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBlZGl0IG1vZGVsLAotCS8vYXMgb3Bwb3NlZCB0byBhbiBleHRlbnNpb24KLQlwcml2YXRlIGJvb2xlYW4gaXNDb3JlID0gdHJ1ZTsKLQotCXByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbklEOwotCi0JcHJpdmF0ZSBpbnQgbG9hZE9yZGVyOwotCi0JcHVibGljIEVkaXRNb2RlbFJlc291cmNlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQpOwotCQlTdHJpbmcgc3RyVXJpID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoRURJVF9NT0RFTF9VUklfQVRUUik7Ci0JCWlmIChzdHJVcmkgIT0gbnVsbCkKLQkJCUVkaXRNb2RlbFJlc291cmNlLnRoaXMudXJpID0gVVJJLmNyZWF0ZVVSSShzdHJVcmkpOwotCi0JCVN0cmluZyBzdHJMb2FkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVVUT19MT0FEX0FUVFIpOwotCQlpZiAoc3RyTG9hZCAhPSBudWxsKQotCQkJYXV0b2xvYWQgPSBCb29sZWFuLnZhbHVlT2Yoc3RyTG9hZCkuYm9vbGVhblZhbHVlKCk7Ci0JCWxvYWRPcmRlciA9IGxvYWRPcmRlckNvdW50ZXIrKzsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsUmVzb3VyY2UoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBleHRlbnNpb25JRCkgewotCQl0aGlzKGVsZW1lbnQpOwotCQl0aGlzLmV4dGVuc2lvbklEID0gZXh0ZW5zaW9uSUQ7Ci0JCWlzQ29yZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0VVJJKCkgewotCQlyZXR1cm4gdXJpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXV0b0xvYWQoKSB7Ci0JCXJldHVybiBhdXRvbG9hZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciNnZXRJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbklEOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yI2dldFByaW9yaXR5KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgewotCQlpZiAoaXNDb3JlKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBzdXBlci5nZXRQcmlvcml0eSgpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB3aGV0aGVyIHRoaXMgcmVzb3VyY2UgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBlZGl0IG1vZGVsIGRlZmluaXRpb24gYXMgb3Bwb3NlZCB0byBhbgotCSAqIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29yZSgpIHsKLQkJcmV0dXJuIGlzQ29yZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBFZGl0TW9kZWxSZXNvdXJjZSkpCi0JCQlyZXR1cm4gMTsKLQkJRWRpdE1vZGVsUmVzb3VyY2UgcmVzID0gKEVkaXRNb2RlbFJlc291cmNlKSBvOwotCQlpbnQgdmFsdWUgPSBnZXRQcmlvcml0eSgpIC0gcmVzLmdldFByaW9yaXR5KCk7Ci0JCWlmICh2YWx1ZSA9PSAwKQotCQkJcmV0dXJuIGxvYWRPcmRlciAtIHJlcy5sb2FkT3JkZXI7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvYWRPcmRlci4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLQkJcmV0dXJuIGxvYWRPcmRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXRyaWV2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmV0cmlldmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZmI4YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXRyaWV2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLQotCi0KLXB1YmxpYyBjbGFzcyBFZGl0TW9kZWxSZXRyaWV2ZXIgewotCXByaXZhdGUgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0OwotCXByaXZhdGUgU3RyaW5nIGVkaXRNb2RlbElEOwotCXByaXZhdGUgTWFwIGVkaXRNb2RlbFBhcm1zOwotCi0JLyoqCi0JICogRWRpdE1vZGVsUmV0cmlldmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVkaXRNb2RlbFJldHJpZXZlcihFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIFN0cmluZyBlZGl0TW9kZWxLZXksIE1hcCBwYXJtcykgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQllZGl0TW9kZWxJRCA9IGVkaXRNb2RlbEtleTsKLQkJZWRpdE1vZGVsUGFybXMgPSBwYXJtczsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclJlYWQoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBjb250ZXh0LmdldEVkaXRNb2RlbEZvclJlYWQoZ2V0RWRpdE1vZGVsSUQoKSwgYWNjZXNzb3JLZXksIGVkaXRNb2RlbFBhcm1zKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvcldyaXRlKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlyZXR1cm4gY29udGV4dC5nZXRFZGl0TW9kZWxGb3JXcml0ZShnZXRFZGl0TW9kZWxJRCgpLCBhY2Nlc3NvcktleSwgZWRpdE1vZGVsUGFybXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdE1vZGVsSUQoKSB7Ci0JCXJldHVybiBlZGl0TW9kZWxJRDsKLQl9Ci0KLQlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjZjZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDMsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yaWVzCi0JICovCi0JcHVibGljIEV4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KENvbGxlY3Rpb24gYWRhcHRlckZhY3RvcmllcykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvKgotCSAqIG92ZXJyb2RlIGZyb20gdGhlIHN1cGVyIGNsYXNzLCBjaGFuZ2VkIG5vdCB0byBjaGVjayBzdXBlcnR5cGVzIG9mIHRoZSBFT2JqZWN0LCBiZWNhdXNlIHRoYXQKLQkgKiB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIER5bmFtaWNBZGFwdGVyRmFjdG9yeQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQkJQWRhcHRlciByZXN1bHQgPSBudWxsOwotCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgdGFyZ2V0OwotCQkJRUNsYXNzIGVDbGFzcyA9IGVPYmplY3QuZUNsYXNzKCk7Ci0JCQlpZiAoZUNsYXNzICE9IG51bGwpIHsKLQkJCQlFUGFja2FnZSBlUGFja2FnZSA9IGVDbGFzcy5nZXRFUGFja2FnZSgpOwotCQkJCUNvbGxlY3Rpb24gdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJdHlwZXMuYWRkKGVQYWNrYWdlKTsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCXR5cGVzLmFkZCh0eXBlKTsKLQkJCQl9Ci0JCQkJLyogd2hlbiBhbiBlcnJvciBvY2N1cnMsIHJlbW92ZSB0aGUgZGVsZWdhdGUgYW5kIHRyeSBhZ2FpbiAqLwotCQkJCWJvb2xlYW4gYXR0ZW1wdEFkYXB0QWdhaW4gPSB0cnVlOwotCQkJCXdoaWxlIChyZXN1bHQgPT0gbnVsbCAmJiBhdHRlbXB0QWRhcHRBZ2FpbikgewotCQkJCQlhdHRlbXB0QWRhcHRBZ2FpbiA9IGZhbHNlOwotCQkJCQlBZGFwdGVyRmFjdG9yeSBkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5ID0gZ2V0RmFjdG9yeUZvclR5cGVzKHR5cGVzKTsKLQkJCQkJaWYgKGRlbGVnYXRlQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZXN1bHQgPSBkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5LmFkYXB0KHRhcmdldCwgdHlwZSk7Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHJlKTsKLQkJCQkJCQlhZGFwdGVyRmFjdG9yaWVzLnJlbW92ZShkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCQlhdHRlbXB0QWRhcHRBZ2FpbiA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBhZGFwdCh0YXJnZXQsIHR5cGUsIG5ldyBIYXNoU2V0KCksIHRhcmdldC5nZXRDbGFzcygpKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9JbnZlcnRlZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvSW52ZXJ0ZWRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYmNiMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9JbnZlcnRlZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbENvbW1hbmQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIyLzAxIDg6NTg6MjQgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEludmVydGVkQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCB7Ci0JcHVibGljIEludmVydGVkQ29tbWFuZChDb21tYW5kIHRhcmdldENvbW1hbmQpIHsKLQkJc3VwZXIodGFyZ2V0Q29tbWFuZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGdldFRhcmdldCgpLmNhblVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gZ2V0VGFyZ2V0KCkuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZwotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vZG9lcyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogZ2V0RWRpdE1vZGVsQ29tbWFuZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRWRpdE1vZGVsQ29tbWFuZCBnZXRFZGl0TW9kZWxDb21tYW5kKCkgewotCQlyZXR1cm4gKChBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQpIGdldFRhcmdldCgpKS5nZXRFZGl0TW9kZWxDb21tYW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBpbnZlcnNpb25EZXB0aCgpIHsKLQkJaWYgKGdldEVkaXRNb2RlbENvbW1hbmQoKSA9PSBnZXRUYXJnZXQoKSkKLQkJCXJldHVybiAxOwotCQlyZXR1cm4gKChJbnZlcnRlZENvbW1hbmQpIGdldFRhcmdldCgpKS5pbnZlcnNpb25EZXB0aCgpICsgMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsUHJlZml4KCkgewotCQlyZXR1cm4gaW52ZXJzaW9uRGVwdGgoKSAlIDIgPT0gMSA/ICJVbmRvICIgOiAiUmVkbyAiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZ2V0VGFyZ2V0KCkudW5kbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWdldFRhcmdldCgpLnJlZG8oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1BhcmVudENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUGFyZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzdkYzkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUGFyZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkNvbXBvc2VkRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxDb21tYW5kOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMi8wMSA4OjU3OjM4IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJlbnRDb21tYW5kIGV4dGVuZHMgRWRpdE1vZGVsQ29tbWFuZCB7Ci0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuOwotCXByaXZhdGUgQ29tcG9zZWRFZGl0TW9kZWwgZWRpdE1vZGVsOwotCXByaXZhdGUgTGlzdCBhZmZlY3RlZE1vZGVsczsKLQotCXB1YmxpYyBQYXJlbnRDb21tYW5kKENvbW1hbmQgdGFyZ2V0Q29tbWFuZCwgQ29tcG9zZWRFZGl0TW9kZWwgYW5FZGl0TW9kZWwpIHsKLQkJc3VwZXIodGFyZ2V0Q29tbWFuZCk7Ci0JCWVkaXRNb2RlbCA9IGFuRWRpdE1vZGVsOwotCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGdldFRhcmdldCgpLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlQWZmZWN0ZWRNb2RlbHMoKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IG51bGw7Ci0JCUxpc3QgZWRpdE1vZGVscyA9IGdldEVkaXRNb2RlbCgpLmdldENoaWxkcmVuKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gY29tcHV0ZUFmZmVjdGVkUmVzb3VyY2VTZXRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJc2V0ID0gKFJlc291cmNlU2V0KSBpdC5uZXh0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRNb2RlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFZGl0TW9kZWwgbW9kZWwgPSAoRWRpdE1vZGVsKSBlZGl0TW9kZWxzLmdldChpKTsKLQkJCQlpZiAobW9kZWwuZ2V0UmVzb3VyY2VTZXQoKSA9PSBzZXQpIHsKLQkJCQkJZ2V0QWZmZWN0ZWRNb2RlbHMoKS5hZGQobmV3IEVkaXRNb2RlbFJldHJpZXZlcihtb2RlbC5nZXRFbWZDb250ZXh0KCksIG1vZGVsLmdldEVkaXRNb2RlbElEKCksIG1vZGVsLmdldFBhcmFtcygpKSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTZXQgY29tcHV0ZUFmZmVjdGVkUmVzb3VyY2VTZXRzKCkgewotCQlJdGVyYXRvciBvYmplY3RzID0gZ2V0VGFyZ2V0KCkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJU2V0IHJlc291cmNlU2V0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCU9iamVjdCBvID0gbnVsbDsKLQkJRU9iamVjdCByZWYgPSBudWxsOwotCQlSZXNvdXJjZVNldCBzZXQgPSBudWxsOwotCQl3aGlsZSAob2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCW8gPSBvYmplY3RzLm5leHQoKTsKLQkJCWlmICghKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSkKLQkJCQljb250aW51ZTsKLQkJCXJlZiA9IChFT2JqZWN0KSBvOwotCQkJaWYgKHJlZi5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJc2V0ID0gcmVmLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYgKHNldCAhPSBudWxsKQotCQkJCQlyZXNvdXJjZVNldHMuYWRkKHNldCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlU2V0czsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2hpbGRDb21tYW5kIGNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0TW9kZWxSZXRyaWV2ZXIgcmV0cmlldmVyKSB7Ci0JCXJldHVybiBuZXcgQ2hpbGRDb21tYW5kKHRoaXMsIGdldFRhcmdldCgpLCByZXRyaWV2ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWdldFRhcmdldCgpLmV4ZWN1dGUoKTsKLQkJY29tcHV0ZUFmZmVjdGVkTW9kZWxzKCk7Ci0JCXB1c2hDaGlsZHJlbkZvckV4ZWN1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlSW5Nb2RlbChBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgY21kKSB7Ci0JCWdldEVkaXRNb2RlbCgpLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY21kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBZmZlY3RlZE1vZGVscygpIHsKLQkJaWYgKGFmZmVjdGVkTW9kZWxzID09IG51bGwpCi0JCQlhZmZlY3RlZE1vZGVscyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCXJldHVybiBhZmZlY3RlZE1vZGVsczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NlZEVkaXRNb2RlbCBnZXRFZGl0TW9kZWwoKSB7Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW52ZXJ0Q2hpbGRyZW4oKSB7Ci0JCWludmVydENoaWxkcmVuRXhjZXB0KChDaGlsZENvbW1hbmQpIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGludmVydENoaWxkcmVuRXhjZXB0KENoaWxkQ29tbWFuZCBjYWxsZXIpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJQ2hpbGRDb21tYW5kIGNoaWxkQ21kID0gKENoaWxkQ29tbWFuZCkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKGNhbGxlciA9PSBudWxsIHx8IGNoaWxkQ21kICE9IGNhbGxlcikKLQkJCQljaGlsZENtZC5pbnZlcnRBbmRQdXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZlcnRGcm9tKENoaWxkQ29tbWFuZCBjYWxsZXIpIHsKLQkJaW52ZXJ0QW5kUHVzaCgpOwotCQlpbnZlcnRDaGlsZHJlbkV4Y2VwdChjYWxsZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hDaGlsZHJlbkZvckV4ZWN1dGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0QWZmZWN0ZWRNb2RlbHMoKS5zaXplKCk7IGkrKykgewotCQkJRWRpdE1vZGVsUmV0cmlldmVyIHJldHJpZXZlciA9IChFZGl0TW9kZWxSZXRyaWV2ZXIpIGdldEFmZmVjdGVkTW9kZWxzKCkuZ2V0KGkpOwotCQkJQ2hpbGRDb21tYW5kIGNvbW1hbmQgPSBjcmVhdGVDaGlsZENvbW1hbmQocmV0cmlldmVyKTsKLQkJCWdldENoaWxkcmVuKCkuYWRkKGNvbW1hbmQpOwotCQkJY29tbWFuZC5leGVjdXRlSW5Nb2RlbChjb21tYW5kKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWdldFRhcmdldCgpLnJlZG8oKTsKLQkJaW52ZXJ0Q2hpbGRyZW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvRnJvbShDaGlsZENvbW1hbmQgY2hpbGQpIHsKLQkJaW52ZXJ0RnJvbShjaGlsZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJZ2V0VGFyZ2V0KCkudW5kbygpOwotCQlpbnZlcnRDaGlsZHJlbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG9Gcm9tKENoaWxkQ29tbWFuZCBjaGlsZCkgewotCQlpbnZlcnRGcm9tKGNoaWxkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9SZWFkT25seUNsaWVudEFjY2Vzc1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1JlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0NTQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1JlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci0KLS8qKgotICogVGhpcyBpcyBhIHJlYWRvbmx5IHZlcnNpb24gb2YgdGhlIGVkaXRtb2RlbCBhY2Nlc3MgcmVnaXN0cnksIG9ubHkgdXNlcyBhIHdlYWsgaGFzaCBkaWN0aW9uYXJ5LAotICogYW5kIGJlY2F1c2UgdGhlIGFjY2VzcyBpcyByZWFkIG9ubHksIGlzIGxlc3MgY29uY2VybmVkIHdpdGggdGltaW5nIG9mIGFjY2Vzcy9yZWxlYXNlLCBhbmQgd2lsbCBiZQotICogY2xlYW5lZCB1cCBvbiBnYXJiYWdlIGNvbGxlY3Rpb24gaWYgbmVlZGVkLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUNsaWVudEFjY2Vzc1JlZ2lzdHJ5IGV4dGVuZHMgQ2xpZW50QWNjZXNzUmVnaXN0cnkgewotCi0JcHVibGljIFJlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJaWYgKCFyZWdpc3RyeS5jb250YWluc0tleShhY2Nlc3NvcktleSkpIHsKLQkJCXRoaXMucmVnaXN0cnkucHV0KGFjY2Vzc29yS2V5LCBudWxsKTsKLQkJfSBlbHNlCi0JCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wLCBhY2Nlc3NvcktleSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0KLQkJLyoKLQkJICogRXJyb3IgY29uZGl0aW9uOiBTb21lIG9uZSBoYXMgYmVlbiBuYXVnaHR5IGFuZCBub3QgcmVsZWFzZWQgdGhlIHJlc291cmNlCi0JCSAqLwotCQlpZiAodGhpcy5yZWdpc3RyeS5jb250YWluc0tleShhY2Nlc3NvcktleSkpIHsKLQkJCXRoaXMucmVnaXN0cnkucmVtb3ZlKGFjY2Vzc29yS2V5KTsKLQkJfSBlbHNlCi0JCQljb21wbGFpbihhY2Nlc3NvcktleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29tcGxhaW4oT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0KLQkJdGhyb3cgbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzEiKSwgYWNjZXNzb3JLZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1NuYXBzaG90LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1NuYXBzaG90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjY0YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9TbmFwc2hvdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAzLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcjsKLQotCi0vKioKLSAqIFRoZSBTbmFwc2hvdCBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBjYWxsIHN0YWNrIHRyYWNlIG9mIGFueSBtZXRob2QgdGhhdCBhY2Nlc3NlcyBhIFJlc291cmNlLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIFNuYXBzaG90IGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgU25hcHNob3QoKSB7Ci0JCXN1cGVyKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuU25hcHNob3RfRVJST1JfMCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI3ByaW50U3RhY2tUcmFjZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdGFja1RyYWNlU3RyaW5nKCkgewotCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOwotCQlzdXBlci5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOwotCQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9XcmFwcGluZ0NvbW1hbmRTdGFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9XcmFwcGluZ0NvbW1hbmRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjE1MzcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvV3JhcHBpbmdDb21tYW5kU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5Db21wb3NlZEVkaXRNb2RlbDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjEvMDEgOTozMTowMiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBpbmdDb21tYW5kU3RhY2sgZXh0ZW5kcyBCYXNpY0NvbW1hbmRTdGFjayB7Ci0JcHJpdmF0ZSBDb21wb3NlZEVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0KLQkvKioKLQkgKiBXcmFwcGluZ0NvbW1hbmRTdGFjayBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXcmFwcGluZ0NvbW1hbmRTdGFjayhDb21wb3NlZEVkaXRNb2RlbCBhbkVkaXRNb2RlbCkgewotCQlzdXBlcigpOwotCQllZGl0TW9kZWwgPSBhbkVkaXRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlQYXJlbnRDb21tYW5kIHBhcmVudCA9IG5ldyBQYXJlbnRDb21tYW5kKGNvbW1hbmQsIGVkaXRNb2RlbCk7Ci0JCXN1cGVyLmV4ZWN1dGUocGFyZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2MWU3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkludmVydGVkQ29tbWFuZDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIENvbW1hbmQgdGFyZ2V0OwotCXByaXZhdGUgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIG93bmVyOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kKENvbW1hbmQgdGFyZ2V0Q29tbWFuZCkgewotCQlzdXBlcigpOwotCQl0YXJnZXQgPSB0YXJnZXRDb21tYW5kOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBFZGl0TW9kZWxDb21tYW5kIGdldEVkaXRNb2RlbENvbW1hbmQoKTsKLQotCXByb3RlY3RlZCBBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgZ2V0T3V0ZXJtb3N0Q29tbWFuZCgpIHsKLQkJcmV0dXJuIG93bmVyID09IG51bGwgPyB0aGlzIDogb3duZXIuZ2V0T3V0ZXJtb3N0Q29tbWFuZCgpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW52ZXJ0ZWQgY29tbWFuZCBvbiB0aGUgb3V0ZXJtb3N0IGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgSW52ZXJ0ZWRDb21tYW5kIGludmVydGVkKCkgewotCQlBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgb3V0ZXIgPSBnZXRPdXRlcm1vc3RDb21tYW5kKCk7Ci0JCUludmVydGVkQ29tbWFuZCBjbWQgPSBuZXcgSW52ZXJ0ZWRDb21tYW5kKG91dGVyKTsKLQkJb3V0ZXIuc2V0T3duZXIoY21kKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lcihBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgb3duZXJDb21tYW5kKSB7Ci0JCW93bmVyID0gb3duZXJDb21tYW5kOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3NlZEFjY2Vzc29yS2V5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3NlZEFjY2Vzc29yS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwY2FjMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG9zZWRBY2Nlc3NvcktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogIAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zZWRBY2Nlc3NvcktleSB7Ci0KLQlwcml2YXRlIE9iamVjdCBhY2Nlc3NvcktleSA9IG51bGw7Ci0JcHJpdmF0ZSBPYmplY3QgYWRkb25LZXkgPSBudWxsOwotCi0KLQlwdWJsaWMgc3RhdGljIENvbXBvc2VkQWNjZXNzb3JLZXkgZ2V0Q29tcG9zZWRBY2Nlc3NvcktleShPYmplY3QgYWNjZXNzb3JLZXksIENvbXBvc2VkRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlDb21wb3NlZEFjY2Vzc29yS2V5IG5ld0tleSA9IG5ldyBDb21wb3NlZEFjY2Vzc29yS2V5KGFjY2Vzc29yS2V5LCBlZGl0TW9kZWwpOwotCQllZGl0TW9kZWwuY2FjaGVBY2Nlc3NvcktleShuZXdLZXkpOwotCQlyZXR1cm4gbmV3S2V5OwotCX0KLQotCi0JcHJpdmF0ZSBDb21wb3NlZEFjY2Vzc29yS2V5KE9iamVjdCBhY2Nlc3NvcktleSwgT2JqZWN0IGFkZG9uS2V5KSB7Ci0JCXRoaXMuYWNjZXNzb3JLZXkgPSBhY2Nlc3NvcktleTsKLQkJdGhpcy5hZGRvbktleSA9IGFkZG9uS2V5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKG90aGVyID09IG51bGwgfHwgIShvdGhlciBpbnN0YW5jZW9mIENvbXBvc2VkQWNjZXNzb3JLZXkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDb21wb3NlZEFjY2Vzc29yS2V5IG90aGVyS2V5ID0gKENvbXBvc2VkQWNjZXNzb3JLZXkpIG90aGVyOwotCi0JCXJldHVybiBhY2Nlc3NvcktleS5lcXVhbHMob3RoZXJLZXkuYWNjZXNzb3JLZXkpICYmIGFkZG9uS2V5LmVxdWFscyhvdGhlcktleS5hZGRvbktleSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gYWNjZXNzb3JLZXkuaGFzaENvZGUoKSBeIGFkZG9uS2V5Lmhhc2hDb2RlKCk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3NlZEVkaXRNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG9zZWRFZGl0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2ZmE5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3NlZEVkaXRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklPcGVyYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5XcmFwcGluZ0NvbW1hbmRTdGFjazsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjEvMDEgODoyNjozMiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zZWRFZGl0TW9kZWwgZXh0ZW5kcyBFZGl0TW9kZWwgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBudWxsOwotCXByaXZhdGUgTWFwIGNoaWxkcmVuTWFwID0gbnVsbDsKLQlwcml2YXRlIExpc3QgY2FjaGVkS2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENvbXBvc2VkRWRpdE1vZGVsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbXBvc2VkRWRpdE1vZGVsKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKGVkaXRNb2RlbElELCBjb250ZXh0LCBmYWxzZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDaGlsZHJlbklmTmVjZXNzYXJ5KENvbXBvc2VkQWNjZXNzb3JLZXkgY29tcG9zZWRBY2Nlc3NvcktleSkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3S2V5Ci0JICovCi0JcHVibGljIHZvaWQgY2FjaGVBY2Nlc3NvcktleShDb21wb3NlZEFjY2Vzc29yS2V5IG5ld0tleSkgewotCQlpZiAoIWNhY2hlZEtleXMuY29udGFpbnMobmV3S2V5KSkKLQkJCWNhY2hlZEtleXMuYWRkKG5ld0tleSk7Ci0JfQotCi0JLy8gSXMgdGhpcyBuZWNlc3NhcnkgYW55bW9yZT8gIFRoZSBvbmx5IGRpZmYgc2VlbXMgdG8gYmUgaXQgZG9lc24ndCByZWxlYXNlIHJlc291cmNlcwotLy8JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLS8vCQlkaXNwb3NpbmcgPSB0cnVlOwotLy8JCWlmIChjb21tYW5kU3RhY2sgIT0gbnVsbCkKLS8vCQkJY29tbWFuZFN0YWNrLnJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKHRoaXMpOwotLy8JCWlmIChoYXNMaXN0ZW5lcnMoKSkKLS8vCQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSwgdGhpcykpOwotLy8JCXJlbGVhc2VQcmVsb2FkUmVzb3VyY2VzKCk7Ci0vLwkJcmVsZWFzZUlkZW50aWZpZXJzKCk7Ci0vLwkJZW1mQ29udGV4dCA9IG51bGw7IAotLy8JCXJlc291cmNlcyA9IG51bGw7Ci0vLwkJZGlzcG9zaW5nID0gZmFsc2U7Ci0vLwkJcHJvamVjdCA9IG51bGw7Ci0vLwkJY2FjaGVkS2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwuUmVmZXJlbmNlIGFkZENoaWxkKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcywgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBhZGRDaGlsZChlZGl0TW9kZWxJRCwgcGFyYW1zLCBDb21wb3NlZEFjY2Vzc29yS2V5LmdldENvbXBvc2VkQWNjZXNzb3JLZXkoYWNjZXNzb3JLZXksIHRoaXMpKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsLlJlZmVyZW5jZSBhZGRDaGlsZChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMsIENvbXBvc2VkQWNjZXNzb3JLZXkgY29tcG9zZWRBY2Nlc3NvcktleSkgewotCi0JCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBnZXRFbWZDb250ZXh0KCkuZ2V0RWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsSUQsIGNvbXBvc2VkQWNjZXNzb3JLZXksIHBhcmFtcyk7Ci0JCWVkaXRNb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQotCQlnZXRDaGlsZHJlbk1hcCgpLnB1dChlZGl0TW9kZWwuZ2V0UmVmZXJlbmNlKCksIGVkaXRNb2RlbCk7Ci0JCWdldENoaWxkcmVuKCkuYWRkKGVkaXRNb2RlbCk7Ci0KLQkJcmV0dXJuIGVkaXRNb2RlbC5nZXRSZWZlcmVuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChFZGl0TW9kZWwuUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCUNvbXBvc2VkQWNjZXNzb3JLZXkgY29tcG9zZWRBY2Nlc3NvcktleSA9IENvbXBvc2VkQWNjZXNzb3JLZXkuZ2V0Q29tcG9zZWRBY2Nlc3NvcktleShhY2Nlc3NvcktleSwgdGhpcyk7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBnZXRDaGlsZHJlbk1hcCgpLnJlbW92ZShyZWZlcmVuY2UpOwotCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKGNvbXBvc2VkQWNjZXNzb3JLZXkpOwotCQkJZWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoZWRpdE1vZGVsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDb250YWluZWRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW5NYXAoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0Q29udGFpbmVkRWRpdE1vZGVsKEVkaXRNb2RlbC5SZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0JCXJldHVybiAoRWRpdE1vZGVsKSBnZXRDaGlsZHJlbk1hcCgpLmdldChyZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQ29tbWFuZFN0YWNrLgotCSAqLwotCXByb3RlY3RlZCBCYXNpY0NvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCXJldHVybiBuZXcgV3JhcHBpbmdDb21tYW5kU3RhY2sodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBhbGwgZXZlbnRzIHRvIHRoZSBsaXN0ZW5lcnMgZm9yIHRoaXMgbW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJaWYgKGhhc0xpc3RlbmVycygpKQotCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJU2V0IGFTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IG1vZGVscyA9IGdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kZWxzLnNpemUoKTsgaSsrKSB7Ci0JCQlFZGl0TW9kZWwgY2hpbGQgPSAoRWRpdE1vZGVsKSBtb2RlbHMuZ2V0KGkpOwotCQkJYVNldC5hZGRBbGwoY2hpbGQuZ2V0QWZmZWN0ZWRGaWxlcygpKTsKLQkJfQotCQlyZXR1cm4gYVNldDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0Q2hpbGRyZW5NYXAoKSB7Ci0JCWlmIChjaGlsZHJlbk1hcCA9PSBudWxsKQotCQkJY2hpbGRyZW5NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gY2hpbGRyZW5NYXA7Ci0JfQotCi0JLyoqCi0JICogUGFzcyBhbG9uZyB0byBjaGlsZHJlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTYXZlSWZOZWNlc3NhcnlEaWROb3RTYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IGxpc3QgPSBnZXRDaGlsZHJlbigpOwotCQlFZGl0TW9kZWwgZWRpdE1vZGVsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGxpc3QuZ2V0KGkpOwotCQkJZWRpdE1vZGVsLmhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUobW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIHNhdmUgaXMgbmVlZGVkIG9uIHRoZSBDb21tYW5kU3RhY2sKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlJdGVyYXRvciBlZGl0TW9kZWxzID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZWRpdE1vZGVscy5oYXNOZXh0KCkpIHsKLQkJCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBlZGl0TW9kZWxzLm5leHQoKTsKLQkJCWlmIChlZGl0TW9kZWwuaXNEaXJ0eSgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBzYXZlIGlzIG5lZWRlZCBvbiB0aGUgQ29tbWFuZFN0YWNrCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcnJlc3RlZEluUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCUl0ZXJhdG9yIGVkaXRNb2RlbHMgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlZGl0TW9kZWxzLmhhc05leHQoKSkgewotCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGVkaXRNb2RlbHMubmV4dCgpOwotCQkJaWYgKGVkaXRNb2RlbC5pc0ludGVycmVzdGVkSW5SZXNvdXJjZShhUmVzb3VyY2UpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmltU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQotCQkJKChFZGl0TW9kZWwpIGxpc3QuZ2V0KGkpKS5wcmltU2F2ZShtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG9ubHkgaW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBjaGlsZHJlbiBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHlvdQotCSAqIGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5ID0gQ29tcG9zZWRBY2Nlc3NvcktleS5nZXRDb21wb3NlZEFjY2Vzc29yS2V5KGFjY2Vzc29yS2V5LCB0aGlzKTsKLQkJaWYgKGdldENoaWxkcmVuKCkuc2l6ZSgpID09IDApIHsKLQkJCWNyZWF0ZUNoaWxkcmVuSWZOZWNlc3NhcnkoY29tcG9zZWRBY2Nlc3NvcktleSk7Ci0JCX0gZWxzZSB7Ci0KLQkJCUxpc3QgdGVtcGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJRWRpdE1vZGVsIG1vZGVsID0gKEVkaXRNb2RlbCkgdGVtcGNoaWxkcmVuLmdldChpKTsKLQkJCQltb2RlbC5hY2Nlc3MoY29tcG9zZWRBY2Nlc3NvcktleSk7Ci0JCQl9Ci0JCX0KLQkJLy8gcmVtb3ZpbmcgZm9yIGRlZmVjdCAxOTc4LCBjaGlsZHJlbiBzaG91bGQgZG8gYWxsIHRoZSBhY2Nlc3NpbmcKLQkJc3VwZXIuYWNjZXNzKGFjY2Vzc29yS2V5KTsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBlYWNoIGNsaWVudCB3aGVuIHRoZXkgYXJlIGZpbmlzaGVkIHdvcmtpbmcgd2l0aCB0aGUKLQkgKiBFZGl0TW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJTGlzdCB0ZW1wY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlDb21wb3NlZEFjY2Vzc29yS2V5IGNvbXBvc2VkQWNjZXNzb3JLZXkgPSBDb21wb3NlZEFjY2Vzc29yS2V5LmdldENvbXBvc2VkQWNjZXNzb3JLZXkoYWNjZXNzb3JLZXksIHRoaXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJRWRpdE1vZGVsIG1vZGVsID0gKEVkaXRNb2RlbCkgdGVtcGNoaWxkcmVuLmdldChpKTsKLQkJCW1vZGVsLnJlbGVhc2VBY2Nlc3MoY29tcG9zZWRBY2Nlc3NvcktleSk7Ci0JCX0KLQkJcmVtb3ZlS2V5RnJvbUNhY2hlKGNvbXBvc2VkQWNjZXNzb3JLZXkpOwotCQkvLyBSZW1vdmluZyB0aGlzIGNhbGwuLi4gQ2hpbGRyZW4gc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGFsbCByZWxlYXNpbmcgZGVmZWN0IDE5NzgKLQkJc3VwZXIucmVsZWFzZUFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlS2V5RnJvbUNhY2hlKENvbXBvc2VkQWNjZXNzb3JLZXkga2V5KSB7Ci0JCWNhY2hlZEtleXMucmVtb3ZlKGtleSk7Ci0JfQotCi0JLyoqCi0JICogSWYgb25lIHNob3VsZCBzYXZlLCB0aGV5IGFsbCBzaG91bGQgc2F2ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKCkgewotCQlMaXN0IGxpc3QgPSBnZXRDaGlsZHJlbigpOwotCQlFZGl0TW9kZWwgZWRpdE1vZGVsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKGVkaXRNb2RlbC5zaG91bGRTYXZlKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIElmIG9uZSBzaG91bGQgc2F2ZSwgdGhleSBhbGwgc2hvdWxkIHNhdmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyKSB7Ci0JCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoZWRpdE1vZGVsLnNob3VsZFNhdmUob3BlcmF0aW9uSGFuZGxlcikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guRWRpdE1vZGVsI2dldE5vblJlc291cmNlRmlsZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE5vblJlc291cmNlRmlsZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFZGl0TW9kZWwgZWRpdE1vZGVsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGxpc3QuZ2V0KGkpOwotCQkJTGlzdCBmaWxlcyA9IGVkaXRNb2RlbC5nZXROb25SZXNvdXJjZUZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpKQotCQkJCXJlc3VsdC5hZGRBbGwoZmlsZXMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3VuZGluZ0NvbW1hbmRTdGFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG91bmRpbmdDb21tYW5kU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4YTg4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3VuZGluZ0NvbW1hbmRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjYsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotCi0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVGhpcyBjbGFzcyBkb2VzIG5vdCBhY3R1YWxseSBleGVjdXRlIGFueSBjb21tYW5kcy4gSXQgbWVyZWx5IGdhdGhlcnMgdGhlIGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkCi0gKiBhbmQgY29tcG91bmRzIHRoZW0gc28gdGhhdCB0aGV5IGNhbiBiZSBleGVjdXRlZCBhZ2FpbnN0IHRoZSBhY3R1YWxDb21tYW5kU3RhY2suCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3VuZGluZ0NvbW1hbmRTdGFjayBpbXBsZW1lbnRzIENvbW1hbmRTdGFjayB7Ci0JcHJpdmF0ZSBDb21tYW5kU3RhY2sgYWN0dWFsQ29tbWFuZFN0YWNrOwotCXByaXZhdGUgQ29tbWFuZCBjb21wb3VuZENvbW1hbmQ7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIENvbXBvdW5kaW5nQ29tbWFuZFN0YWNrKENvbW1hbmRTdGFjayBhY3R1YWxDb21tYW5kU3RhY2spIHsKLQkJdGhpcy5hY3R1YWxDb21tYW5kU3RhY2sgPSBhY3R1YWxDb21tYW5kU3RhY2s7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2V4ZWN1dGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJaWYgKGNvbXBvdW5kQ29tbWFuZCA9PSBudWxsKQotCQkJY29tcG91bmRDb21tYW5kID0gY29tbWFuZDsKLQkJZWxzZQotCQkJY29tcG91bmRDb21tYW5kID0gY29tcG91bmRDb21tYW5kLmNoYWluKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1FeGVjdXRpb24oKSB7Ci0JCWlmIChjb21wb3VuZENvbW1hbmQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlhY3R1YWxDb21tYW5kU3RhY2suZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQljb21wb3VuZENvbW1hbmQgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2NhblVuZG8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJLy9kZWZhdWx0Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2NhblJlZG8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjZ2V0VW5kb0NvbW1hbmQoKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldFVuZG9Db21tYW5kKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjZ2V0UmVkb0NvbW1hbmQoKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldFJlZG9Db21tYW5kKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjZ2V0TW9zdFJlY2VudENvbW1hbmQoKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldE1vc3RSZWNlbnRDb21tYW5kKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy9yZWRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2ZsdXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLQkJLy9mbHVzaAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNhZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoQ29tbWFuZFN0YWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kZWZhdWx0Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI3JlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihDb21tYW5kU3RhY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RlZmF1bHQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9EeW5hbWljQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0R5bmFtaWNBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU3MWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0R5bmFtaWNBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMSwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkV4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSwgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciwgSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnkgTlVMTF9GQUNUT1JZID0gbmV3IEFkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCi0JcHJpdmF0ZSBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdmlld0lEOwotCi0JLy9FYWNoIG9mIHRoZSB0d28gbWFwcyBiZWxvdyBhcmUga2V5ZWQgYnkgdGhlIHByb2plY3QKLQlwcml2YXRlIE1hcCBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlOwotCi0JcHJpdmF0ZSBNYXAgYWRhcHRlckZhY3Rvcmllc0J5VHlwZTsKLQotCXByaXZhdGUgU2V0IGFsbEZhY3RvcmllczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIElDaGFuZ2VOb3RpZmllcn0KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNwZWN0aW5nQWN0aXZpdGllcyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTk9fUFJPSkVDVCA9ICJOT19QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JcHVibGljIER5bmFtaWNBZGFwdGVyRmFjdG9yeShTdHJpbmcgdmlld0lELCBib29sZWFuIHJlc3BlY3RBY3RpdmllcykgewotCQl0aGlzLnZpZXdJRCA9IHZpZXdJRDsKLQkJdGhpcy5yZXNwZWN0aW5nQWN0aXZpdGllcyA9IHJlc3BlY3RBY3RpdmllczsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBEeW5hbWljQWRhcHRlckZhY3RvcnkoU3RyaW5nIHZpZXdJRCkgewotCQl0aGlzLnZpZXdJRCA9IHZpZXdJRDsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlID0gbmV3IEhhc2hNYXAoKTsKLQkJYWRhcHRlckZhY3Rvcmllc0J5VHlwZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCWFsbEZhY3RvcmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gZ2V0RmFjdG9yeUZvclR5cGUodHlwZSkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGdldEZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCXJldHVybiBnZXRGYWN0b3J5Rm9yVHlwZSgoRU9iamVjdCkgdHlwZSk7Ci0KLQkJT2JqZWN0IGFQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHR5cGUpOwotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCWFQcm9qZWN0ID0gTk9fUFJPSkVDVDsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEV4aXN0aW5nRmFjdG9yeUZvclR5cGUoYVByb2plY3QsIHR5cGUpOwotCQlpZiAoZmFjdG9yeSA9PSBOVUxMX0ZBQ1RPUlkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JUeXBlKGFQcm9qZWN0LCB0eXBlKTsKLQotCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgdHlwZSwgTlVMTF9GQUNUT1JZKTsKLQkJCWVsc2UKLQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgdHlwZSwgZmFjdG9yeSk7Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBwLCBPYmplY3QgdHlwZSkgewotCQlpZiAocCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5VHlwZS5nZXQocCk7Ci0JCWlmIChhTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllc0J5VHlwZS5nZXQodHlwZSk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgZmFjdG9yeSB3YXMgbm90IGNhY2hlZCBieSB0eXBlLCBzbyB3ZSB3aWxsIHNlYXJjaCB0aGUgY2FjaGUgb2YgZmFjdG9yaWVzIGZvciB0aGUgcHJvamVjdAotCSAqIGFuZCBzZWUgaWYgaXQgY2FuIGJlIGZvdW5kIHRoZXJlCi0JICovCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBmaW5kRmFjdG9yeUZvclR5cGUoT2JqZWN0IHByb2plY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTWFwIGFNYXAgPSAoTWFwKSBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlLmdldChwcm9qZWN0KTsKLQkJaWYgKGFNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJdGVyYXRvciBpdGVyID0gYU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChmYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZSkpCi0JCQkJcmV0dXJuIGZhY3Rvcnk7Ci0JCX0KLQotCQkvLyBhZGFwdCB0aGUgcmVzb3VyY2UgdG8gaXRzIGNvbnRlbnRzCi0JCWlmIChnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkKLQkJCXJldHVybiBnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclR5cGUoRU9iamVjdCBvYmopIHsKLQkJRUNsYXNzIGVDbGFzcyA9IG9iai5lQ2xhc3MoKTsKLQkJaWYgKGVDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJT2JqZWN0IGFQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG9iaik7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsKQotCQkJYVByb2plY3QgPSBOT19QUk9KRUNUOwotCQlBZGFwdGVyRmFjdG9yeSByZXN1bHQgPSBnZXRGYWN0b3J5Rm9yUGFja2FnZShhUHJvamVjdCwgZVBhY2thZ2UpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJU2V0IGZhaWxlZFBhY2thZ2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJZmFpbGVkUGFja2FnZVNldC5hZGQoZVBhY2thZ2UpOwotCQkJSXRlcmF0b3Igc3VwZXJ0eXBlcyA9IGVDbGFzcy5nZXRFQWxsU3VwZXJUeXBlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoc3VwZXJ0eXBlcy5oYXNOZXh0KCkpIHsKLQkJCQllQ2xhc3MgPSAoRUNsYXNzKSBzdXBlcnR5cGVzLm5leHQoKTsKLQkJCQlpZiAoZUNsYXNzICE9IG51bGwpIHsKLQkJCQkJZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJCQkJaWYgKGZhaWxlZFBhY2thZ2VTZXQuYWRkKGVQYWNrYWdlKSkgewotCQkJCQkJcmVzdWx0ID0gZ2V0RmFjdG9yeUZvclBhY2thZ2UoYVByb2plY3QsIGVQYWNrYWdlKTsKLQkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclBhY2thZ2UoT2JqZWN0IGFQcm9qZWN0LCBFUGFja2FnZSBhUGFja2FnZSkgewotCQlpZiAoYVByb2plY3QgPT0gbnVsbCB8fCBhUGFja2FnZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JQYWNrYWdlKGFQcm9qZWN0LCBhUGFja2FnZSk7Ci0JCWlmIChmYWN0b3J5ID09IE5VTExfRkFDVE9SWSkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KGFQcm9qZWN0LCBhUGFja2FnZSk7Ci0KLQkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgYVBhY2thZ2UsIE5VTExfRkFDVE9SWSk7Ci0JCQkJZWxzZQotCQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgYVBhY2thZ2UsIGZhY3RvcnkpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihyZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRGYWN0b3J5Rm9yVHlwZXMoT2JqZWN0IHAsIExpc3QgdHlwZXMpIHsKLQkJTWFwIGFNYXAgPSAoTWFwKSBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlLmdldChwKTsKLQkJaWYgKGFNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdFJlc291cmNlVHlwZXModHlwZXMpOwotCi0JCUl0ZXJhdG9yIGZhY3RvcmllcyA9IGFNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCXdoaWxlIChmYWN0b3JpZXMuaGFzTmV4dCgpKSB7Ci0JCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBmYWN0b3JpZXMubmV4dCgpOwotCQkJaWYgKGlzRmFjdG9yeUZvckFsbFR5cGVzKGZhY3RvcnksIHR5cGVzKSkgewotCQkJCXJldHVybiBmYWN0b3J5OwotCQkJfQotCQl9Ci0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0UmVzb3VyY2VUeXBlcyhMaXN0IHR5cGVzKSB7Ci0JCS8vICAgICAgYWRhcHQgdGhlIHJlc291cmNlIHRvIGl0cyBjb250ZW50cwotCQlpZiAoaXNGYWN0b3J5Rm9yQWxsVHlwZXMoZ2V0UmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLCB0eXBlcykpCi0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRmFjdG9yeUZvclR5cGVzKE9iamVjdCBwLCBMaXN0IHR5cGVzKSB7Ci0JCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZS5nZXQocCk7Ci0JCWlmIChhTWFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGZhY3RvcmllcyA9IGFNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCXdoaWxlIChmYWN0b3JpZXMuaGFzTmV4dCgpKSB7Ci0JCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBmYWN0b3JpZXMubmV4dCgpOwotCQkJaWYgKGlzRmFjdG9yeUZvckFsbFR5cGVzKGZhY3RvcnksIHR5cGVzKSkgewotCQkJCWFNYXAucmVtb3ZlKGZhY3RvcnkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNGYWN0b3J5Rm9yQWxsVHlwZXMoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgTGlzdCB0eXBlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoIWZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlcy5nZXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JQYWNrYWdlKE9iamVjdCBwLCBFUGFja2FnZSBhUGFja2FnZSkgewotCQlpZiAocCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZS5nZXQocCk7Ci0JCWlmIChhTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBZGFwdGVyRmFjdG9yeSkgYU1hcC5nZXQoYVBhY2thZ2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyRmFjdG9yeShPYmplY3QgcCwgRVBhY2thZ2UgYVBhY2thZ2UsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU1hcCBhTWFwID0gZ2V0T3JDcmVhdGVNYXAocCwgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZSk7Ci0KLQkJYU1hcC5wdXQoYVBhY2thZ2UsIGFkYXB0ZXJGYWN0b3J5KTsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgPT0gTlVMTF9GQUNUT1JZKQotCQkJcmV0dXJuOwotCi0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDaGFuZ2VOb3RpZmllcikgewotCQkJKChJQ2hhbmdlTm90aWZpZXIpIGFkYXB0ZXJGYWN0b3J5KS5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlhbGxGYWN0b3JpZXMuYWRkKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRPckNyZWF0ZU1hcChPYmplY3QgcCwgTWFwIGNvbnRhaW5lcikgewotCQlNYXAgYU1hcCA9IChNYXApIGNvbnRhaW5lci5nZXQocCk7Ci0JCWlmIChhTWFwID09IG51bGwpIHsKLQkJCWFNYXAgPSBuZXcgSGFzaE1hcCgxMCk7Ci0JCQljb250YWluZXIucHV0KHAsIGFNYXApOwotCQl9Ci0JCXJldHVybiBhTWFwOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyRmFjdG9yeShPYmplY3QgcCwgT2JqZWN0IHR5cGUsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU1hcCBhTWFwID0gZ2V0T3JDcmVhdGVNYXAocCwgYWRhcHRlckZhY3Rvcmllc0J5VHlwZSk7Ci0JCWFNYXAucHV0KHR5cGUsIGFkYXB0ZXJGYWN0b3J5KTsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgPT0gTlVMTF9GQUNUT1JZKQotCQkJcmV0dXJuOwotCi0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDaGFuZ2VOb3RpZmllcikgewotCQkJKChJQ2hhbmdlTm90aWZpZXIpIGFkYXB0ZXJGYWN0b3J5KS5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlhbGxGYWN0b3JpZXMuYWRkKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gdGFyZ2V0OwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm90aWZpZXIpIHsKLQkJCWFkYXB0ZXIgPSBhZGFwdCgoTm90aWZpZXIpIHRhcmdldCwgdHlwZSk7Ci0JCX0KLQotCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCXJlc3VsdCA9IGFkYXB0KChFT2JqZWN0KSB0YXJnZXQsIHR5cGUpOwotCQllbHNlIHsKLQkJCU9iamVjdCBwID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHRhcmdldCk7Ci0JCQlpZiAocCA9PSBudWxsKQotCQkJCXAgPSBOT19QUk9KRUNUOwotCQkJcmVzdWx0ID0gYWRhcHQocCwgdGFyZ2V0LCB0eXBlLCBuZXcgSGFzaFNldCgpLCB0YXJnZXQuZ2V0Q2xhc3MoKSk7Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoRU9iamVjdCB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0KLQkJRUNsYXNzIGVDbGFzcyA9IHRhcmdldC5lQ2xhc3MoKTsKLQkJaWYgKGVDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJQWRhcHRlciByZXN1bHQgPSBhZGFwdCh0YXJnZXQsIGVQYWNrYWdlLCB0eXBlKTsKLQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCVNldCBmYWlsZWRQYWNrYWdlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZhaWxlZFBhY2thZ2VTZXQuYWRkKGVQYWNrYWdlKTsKLQkJCUl0ZXJhdG9yIHN1cGVydHlwZXMgPSBlQ2xhc3MuZ2V0RUFsbFN1cGVyVHlwZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHN1cGVydHlwZXMuaGFzTmV4dCgpKSB7Ci0JCQkJZUNsYXNzID0gKEVDbGFzcykgc3VwZXJ0eXBlcy5uZXh0KCk7Ci0JCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJCWVQYWNrYWdlID0gZUNsYXNzLmdldEVQYWNrYWdlKCk7Ci0JCQkJCWlmIChmYWlsZWRQYWNrYWdlU2V0LmFkZChlUGFja2FnZSkpIHsKLQkJCQkJCXJlc3VsdCA9IGFkYXB0KHRhcmdldCwgZVBhY2thZ2UsIHR5cGUpOwotCQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGFkYXB0KEVPYmplY3QgdGFyZ2V0LCBFUGFja2FnZSBlUGFja2FnZSwgT2JqZWN0IHR5cGUpIHsKLQkJT2JqZWN0IGFQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHRhcmdldCk7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsKQotCQkJYVByb2plY3QgPSBOT19QUk9KRUNUOwotCQlBZGFwdGVyRmFjdG9yeSBkZWxlZ2F0ZSA9IGdldEZhY3RvcnlGb3JQYWNrYWdlKGFQcm9qZWN0LCBlUGFja2FnZSk7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsICYmIGRlbGVnYXRlLmlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBDb2RlIGJvcnJvd2VkIGZyb20ge0BsaW5rIENvbXBvc2VkQWRhcHRlckZhY3Rvcnl9Ci0JICogIAotCSAqLwotCXByaXZhdGUgQWRhcHRlciBhZGFwdChPYmplY3QgcCwgTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSwgQ29sbGVjdGlvbiBmYWlsZWRQYWNrYWdlcywgQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCWlmIChwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0KLQkJUGFja2FnZSBqYXZhUGFja2FnZSA9IGphdmFDbGFzcy5nZXRQYWNrYWdlKCk7Ci0JCWlmIChmYWlsZWRQYWNrYWdlcy5hZGQoamF2YVBhY2thZ2UpKSB7Ci0JCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJCXR5cGVzLmFkZChqYXZhUGFja2FnZSk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJdHlwZXMuYWRkKHR5cGUpOwotCQkJfQotCi0JCQkvKiB3aGVuIGFuIGVycm9yIG9jY3VycywgcmVtb3ZlIHRoZSBkZWxlZ2F0ZSBhbmQgdHJ5IGFnYWluICovCi0JCQlib29sZWFuIGF0dGVtcHRBZGFwdEFnYWluID0gdHJ1ZTsKLQkJCXdoaWxlIChyZXN1bHQgPT0gbnVsbCAmJiBhdHRlbXB0QWRhcHRBZ2FpbikgewotCQkJCWF0dGVtcHRBZGFwdEFnYWluID0gZmFsc2U7Ci0KLQkJCQlBZGFwdGVyRmFjdG9yeSBkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5ID0gZ2V0RmFjdG9yeUZvclR5cGVzKHAsIHR5cGVzKTsKLQkJCQlpZiAoZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHQgPSBkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5LmFkYXB0KHRhcmdldCwgdHlwZSk7Ci0JCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihyZSk7Ci0JCQkJCQlyZW1vdmVGYWN0b3J5Rm9yVHlwZXMocCwgdHlwZXMpOwotCQkJCQkJYXR0ZW1wdEFkYXB0QWdhaW4gPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlDbGFzcyBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBhZGFwdChwLCB0YXJnZXQsIHR5cGUsIGZhaWxlZFBhY2thZ2VzLCBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKTsKLQkJCX0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCUNsYXNzW10gaW50ZXJmYWNlcyA9IGphdmFDbGFzcy5nZXRJbnRlcmZhY2VzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCXJlc3VsdCA9IGFkYXB0KHAsIHRhcmdldCwgdHlwZSwgZmFpbGVkUGFja2FnZXMsIGludGVyZmFjZXNbaV0pOwotCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0KLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlKHRhcmdldCk7Ci0KLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWN0b3J5LmFkYXB0TmV3KHRhcmdldCwgdHlwZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0QWxsTmV3KE5vdGlmaWVyIHRhcmdldCkgewotCi0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5Rm9yVHlwZSh0YXJnZXQpOwotCi0JCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQlmYWN0b3J5LmFkYXB0QWxsTmV3KHRhcmdldCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGQobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmUobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChjaGFuZ2VOb3RpZmllciA9PSBudWxsIHx8IGNoYW5nZU5vdGlmaWVyLmlzRW1wdHkoKSB8fCBjaGFuZ2VOb3RpZmllci5nZXQoMCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJdGVyYXRvciBpdGVyID0gYWxsRmFjdG9yaWVzLml0ZXJhdG9yKCk7Ci0JCU9iamVjdCBmYWN0b3J5ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlmYWN0b3J5ID0gaXRlci5uZXh0KCk7Ci0JCQlkaXNwb3NlRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGdldEVuYWJsZW1lbnRJZGVudGlmaWVycygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkoKElFbmFibGVtZW50SWRlbnRpZmllcikgaXRyLm5leHQoKSkucmVtb3ZlSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWlmIChyZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpCi0JCQlyZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwb3NlRmFjdG9yeShPYmplY3QgZmFjdG9yeSkgewotCQlpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkoKElEaXNwb3NhYmxlKSBmYWN0b3J5KS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vRm93YXJkIHRoZSBub3RpZmljYXRpb24gb24gdG8gYWxsIG15IGxpc3RlbmVycwotCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFkYXB0ZXJGYWN0b3JpZXMoT2JqZWN0IHByb2plY3QpIHsKLQkJYWRhcHRlckZhY3Rvcmllc0J5VHlwZS5yZW1vdmUocHJvamVjdCk7Ci0JCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZS5yZW1vdmUocHJvamVjdCk7Ci0JCWlmIChhTWFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSXRlcmF0b3IgZmFjdG9yaWVzID0gYU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlPYmplY3QgYWRhcHRlckZhY3Rvcnk7Ci0JCXdoaWxlIChmYWN0b3JpZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IGZhY3Rvcmllcy5uZXh0KCk7Ci0JCQlhbGxGYWN0b3JpZXMucmVtb3ZlKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWRpc3Bvc2VGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoT2JqZWN0IHByb2plY3QsIEVQYWNrYWdlIGVQYWNrYWdlKSB7Ci0JCWlmIChlUGFja2FnZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkR5bmFtaWNBZGFwdGVyRmFjdG9yeV9FUlJPUl8wKTsKLQotCQlyZXR1cm4gY3JlYXRlQWRhcHRlckZhY3RvcnkocHJvamVjdCwgQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5pbnN0YW5jZSgpLmdldERlc2NyaXB0b3JzKGVQYWNrYWdlLCB2aWV3SUQpKTsKLQotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoT2JqZWN0IHByb2plY3QsIExpc3QgZGVzY3JpcHRvcnMpIHsKLQkJaWYgKGRlc2NyaXB0b3JzID09IG51bGwgfHwgZGVzY3JpcHRvcnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQWRhcHRlckZhY3RvcnkgZmFjdCA9IG51bGw7Ci0JCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gbnVsbDsKLQkJQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2MgPSBudWxsOwotCQlpZiAoZGVzY3JpcHRvcnMuc2l6ZSgpID09IDEpIHsKLQkJCWRlc2MgPSAoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoMCk7Ci0JCQlpZGVudGlmaWVyID0gZ2V0SWRlbnRpZmllcihwcm9qZWN0LCBkZXNjKTsKLQkJCWFkZExpc3RlbmVySWZOZWNlc3NhcnkoaWRlbnRpZmllcik7Ci0JCQlpZiAocHJvamVjdC5lcXVhbHMoTk9fUFJPSkVDVCkgfHwgKGlkZW50aWZpZXIgIT0gbnVsbCAmJiBpZGVudGlmaWVyLmlzRW5hYmxlZCgpKSkKLQkJCQlyZXR1cm4gZGVzYy5jcmVhdGVJbnN0YW5jZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KGRlc2NyaXB0b3JzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWRlc2MgPSAoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoaSk7Ci0JCQlpZGVudGlmaWVyID0gZ2V0SWRlbnRpZmllcihwcm9qZWN0LCBkZXNjKTsKLQkJCWFkZExpc3RlbmVySWZOZWNlc3NhcnkoaWRlbnRpZmllcik7Ci0JCQlpZiAocHJvamVjdC5lcXVhbHMoTk9fUFJPSkVDVCkgfHwgKGlkZW50aWZpZXIgIT0gbnVsbCAmJiBpZGVudGlmaWVyLmlzRW5hYmxlZCgpKSkgewotCQkJCWZhY3QgPSBkZXNjLmNyZWF0ZUluc3RhbmNlKCk7Ci0JCQkJaWYgKGZhY3QgIT0gbnVsbCkKLQkJCQkJZmFjdG9yaWVzLmFkZChmYWN0KTsKLQkJCX0KLQkJfQotCQlpZiAoZmFjdG9yaWVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBuZXcgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KGZhY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gZGVzYwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElFbmFibGVtZW50SWRlbnRpZmllciBnZXRJZGVudGlmaWVyKE9iamVjdCBwcm9qZWN0LCBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzYykgewotCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IG51bGw7Ci0JCWlmIChpc1Jlc3BlY3RpbmdBY3Rpdml0aWVzKCkgJiYgcHJvamVjdCBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJaWRlbnRpZmllciA9IElFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKGRlc2MuZ2V0SUQoKSwgKElQcm9qZWN0KSBwcm9qZWN0KTsKLQkJZWxzZSBpZiAocHJvamVjdCBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJaWRlbnRpZmllciA9IEVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZGVzYy5nZXRJRCgpLCAoSVByb2plY3QpIHByb2plY3QpOwotCQlyZXR1cm4gaWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVzcGVjdGluZ0FjdGl2aXRpZXMoKSB7Ci0JCXJldHVybiByZXNwZWN0aW5nQWN0aXZpdGllczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcklmTmVjZXNzYXJ5KElFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyKSB7Ci0JCWlmIChpZGVudGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQlnZXRFbmFibGVtZW50SWRlbnRpZmllcnMoKS5hZGQoaWRlbnRpZmllcik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMaXN0ZW5pbmdUbyhJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcikgewotCQlyZXR1cm4gZ2V0RW5hYmxlbWVudElkZW50aWZpZXJzKCkuY29udGFpbnMoaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBlbmFibGVtZW50SWRlbnRpZmllcnMuCi0JICovCi0JcHJvdGVjdGVkIFNldCBnZXRFbmFibGVtZW50SWRlbnRpZmllcnMoKSB7Ci0JCWlmIChlbmFibGVtZW50SWRlbnRpZmllcnMgPT0gbnVsbCkKLQkJCWVuYWJsZW1lbnRJZGVudGlmaWVycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXJldHVybiBlbmFibGVtZW50SWRlbnRpZmllcnM7Ci0JfQotCi0JcHJpdmF0ZSBTZXQgZW5hYmxlbWVudElkZW50aWZpZXJzOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciNpZGVudGlmaWVyQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllckV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlkZW50aWZpZXJDaGFuZ2VkKEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgaWRlbnRpZmllckV2ZW50KSB7Ci0JCWlmIChpZGVudGlmaWVyRXZlbnQuaGFzRW5hYmxlZENoYW5nZWQoKSB8fCBpZGVudGlmaWVyRXZlbnQuaGFzRnVuY3Rpb25Hcm91cElkc0NoYW5nZWQoKSkgewotCQkJT2JqZWN0IHByb2plY3QgPSAoKEVuYWJsZW1lbnRJZGVudGlmaWVyKSBpZGVudGlmaWVyRXZlbnQuZ2V0SWRlbnRpZmllcigpKS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlQWRhcHRlckZhY3Rvcmllcyhwcm9qZWN0KTsKLQkJCQkvKgotCQkJCSAqIGZpbmFsIE5vdGlmaWVyIG5vdGlmaWVyID0gKE5vdGlmaWVyKSBnZXRDYWNoZWRSb290cygpLmdldChwcm9qZWN0KTsKLQkJCQkgKi8KLQkJCQkvKiBmb3JjZSBhIHZpZXdlciByZWZyZXNoICovCi0JCQkJbm90aWZ5Q2hhbmdlZChuZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uQURELCBudWxsLCBudWxsKSB7Ci0KLQkJCQkJLyoKLQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkgKiAKLQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGwjZ2V0Tm90aWZpZXIoKQotCQkJCQkgKi8KLQkJCQkJcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJCQkJCXJldHVybiBudWxsOyAvLyBub3RpZmllcjsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJLyogZWxzZSByZXBsYWNlIGVudGlyZSBzdHJ1Y3R1cmUgKi8KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAocmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5ID0gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCXJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDA5YjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VNRldvcmtiZW5jaEVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guUGFzc3RocnVSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9GQUNUT1JJRVNfRVhURU5TSU9OX1BPSU5UID0gImVkaXRNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0VYVEVOU0lPTl9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQgPSAiZWRpdE1vZGVsRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfRkFDVE9SWV9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQgPSAiYWRhcHRlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luIHBsdWdpbjsgCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7IAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUV4dGVuZGVkRWNvcmVVdGlsLnNldEZpbGVOb3RGb3VuZERldGVjdG9yKG5ldyBFeHRlbmRlZEVjb3JlVXRpbC5GaWxlTm90Rm91bmREZXRlY3RvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRmlsZU5vdEZvdW5kKFdyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7Ci0JCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1Jlc291cmNlTm90Rm91bmQod3JhcHBlZEV4KSB8fCB3cmFwcGVkRXguZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0JCQl9Ci0JCX0pOwotCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pbml0aWFsaXplRmlsZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBjcmVhdGVJc29sYXRlZFJlc291cmNlU2V0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBQYXNzdGhydVJlc291cmNlU2V0KHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlV29ya3NwYWNlUGFzc3RocnVSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIG5ldyBQYXNzdGhydVJlc291cmNlU2V0KCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMmQ2NDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklTYXZlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUhhbmRsZXJIZWFkbGVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUhhbmRsZXJSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5JV0ZUV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5DbGllbnRBY2Nlc3NSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVkaXRNb2RlbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRWRpdE1vZGVsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5SZWFkT25seUNsaWVudEFjY2Vzc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXI7Ci0KLQotcHVibGljIGNsYXNzIEVkaXRNb2RlbCBpbXBsZW1lbnRzIENvbW1hbmRTdGFja0xpc3RlbmVyLCBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciwgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciwgSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjazsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCXByaXZhdGUgTWFwIHBhcmFtczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBlZGl0TW9kZWxJRDsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVhZE9ubHk7Ci0JLy8gVGhlc2UgYXJlIHRoZSBjdXJyZW50IHJlc291cmNlIHVyaXMgd2UgbmVlZCB0byB0cmFjawotCXByb3RlY3RlZCBMaXN0IGtub3duUmVzb3VyY2VVcmlzOwotCS8vIFRoZXNlIGFyZSB0aGUgY3VycmVudCByZXNvdXJjZSBleHRlbnNpb25zIHRvIHRyYWNrCi0JcHJvdGVjdGVkIExpc3Qga25vd25SZXNvdXJjZUV4dGVuc2lvbnM7Ci0JLy8gVGhpcyBpcyBhIHN1YnNldCBvZiB0aGUga25vd24gcmVzb3VyY2UgdXJpcywgd2hpY2ggd2UgaGF2ZSByZXF1ZXN0ZWQgYmUgYXV0b2xvYWRlZAotCXByb3RlY3RlZCBMaXN0IHByZWxvYWRSZXNvdXJjZVVyaXM7Ci0JLy8gVGhpcyBpcyBhIG1hcCBvZiBpZGVudGlmaWVycyB0byByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkIHRvIGxpc3RlbiB0byBpbiBvcmRlciB0byBsaXN0ZW4gZm9yCi0JLy8gdXBkYXRlcyB0byB0aGUgZWRpdCBtb2RlbCByZXNvdXJjZXMKLQlwcm90ZWN0ZWQgTWFwIHJlc291cmNlSWRlbnRpZmllcnM7Ci0KLQlwcm90ZWN0ZWQgRWRpdE1vZGVsRXZlbnQgZGlydHlNb2RlbEV2ZW50OwotCXByb3RlY3RlZCBib29sZWFuIGlzTm90aWZpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkaXNwb3NpbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBzdGF0ZVZhbGlkYXRvcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJczsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VBZGFwdGVyIHJlc291cmNlQWRhcHRlciA9IG5ldyBSZXNvdXJjZUFkYXB0ZXIoKTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JldmVydGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBMaXN0IHJlc291cmNlczsKLQlwcml2YXRlIENsaWVudEFjY2Vzc1JlZ2lzdHJ5IHJlZ2lzdHJ5OwotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0IGVtZkNvbnRleHQgPSBudWxsOwotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCXByaXZhdGUgUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQlwcml2YXRlIExpc3QgcmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbjsKLQotCXByb3RlY3RlZCBjbGFzcyBSZXNvdXJjZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKCFpc0Rpc3Bvc2luZygpICYmIG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUICYmIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCkgewotCQkJCXJlc291cmNlSXNMb2FkZWRDaGFuZ2VkKChSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIG5vdGlmaWNhdGlvbi5nZXRPbGRCb29sZWFuVmFsdWUoKSwgbm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVNRiBjb250ZXh0IGNhbid0IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmVkaXRNb2RlbElEID0gZWRpdE1vZGVsSUQ7Ci0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQkJaWYgKHJlYWRPbmx5KQotCQkJdGhpcy5yZWdpc3RyeSA9IG5ldyBSZWFkT25seUNsaWVudEFjY2Vzc1JlZ2lzdHJ5KCk7Ci0JCWVsc2UKLQkJCXRoaXMucmVnaXN0cnkgPSBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnkoKTsKLQkJdGhpcy5lbWZDb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5wcm9qZWN0ID0gY29udGV4dC5nZXRQcm9qZWN0KCk7Ci0JCWluaXRpYWxpemVLbm93blJlc291cmNlVXJpcygpOwotCQlwcm9jZXNzTG9hZGVkUmVzb3VyY2VzKCk7Ci0JCXByb2Nlc3NQcmVsb2FkUmVzb3VyY2VzKCk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgYm9vbGVhbiByZWFkT25seSwgYm9vbGVhbiBhY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSkgewotCQl0aGlzKGVkaXRNb2RlbElELCBjb250ZXh0LCByZWFkT25seSk7Ci0JCXRoaXMuYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMgPSBhY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGVkaXRNb2RlbElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0TW9kZWxJRCgpIHsKLQkJcmV0dXJuIGVkaXRNb2RlbElEOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zaW5nKCkgewotCQlyZXR1cm4gZGlzcG9zaW5nOwotCX0KLQotCQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBtYWRlCi0JICogZmluYWwgaW4gdGhlIG5leHQgcmVsZWFzZS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgZG9EaXNwb3NlKCkgYXMKLQkgKiBuZWNlc3NhcnkgdG8gZGlzcG9zZSBhbnkgYWRkaXRpb25hbCBhcnRpZmFjdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChkaXNwb3NpbmcgfHwgZGlzcG9zZWQpCi0JCQkJcmV0dXJuOwotCQkJZGlzcG9zaW5nID0gdHJ1ZTsKLQkJCi0JCQlpZiAoaGFzTGlzdGVuZXJzKCkpCi0JCQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSwgdGhpcykpOwotCQkJCi0JCQlyZWxlYXNlUmVzb3VyY2VzKCk7Ci0KLQkJCWlmIChjb21tYW5kU3RhY2sgIT0gbnVsbCkKLQkJCQljb21tYW5kU3RhY2sucmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIodGhpcyk7Ci0JCQlpZiAoZ2V0RW1mQ29udGV4dCgpICE9IG51bGwpCi0JCQkJZ2V0RW1mQ29udGV4dCgpLnJlbW92ZUVkaXRNb2RlbCh0aGlzLCBpc1JlYWRPbmx5KCkpOwotCQkJcmVsZWFzZVByZWxvYWRSZXNvdXJjZXMoKTsKLQkJCXJlbGVhc2VJZGVudGlmaWVycygpOwotCQkJZG9EaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihyZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQllbWZDb250ZXh0ID0gbnVsbDsKLQkJCXJlc291cmNlcyA9IG51bGw7Ci0JCQlwcm9qZWN0ID0gbnVsbDsKLQkJCWRpc3Bvc2VkID0gdHJ1ZTsKLQkJCWRpc3Bvc2luZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VJZGVudGlmaWVycygpIHsKLQkJaWYgKHJlc291cmNlSWRlbnRpZmllcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXRlciA9IHJlc291cmNlSWRlbnRpZmllcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlkZW50aWZpZXIgPSAoSUVuYWJsZW1lbnRJZGVudGlmaWVyKSBpdGVyLm5leHQoKTsKLQkJCWlkZW50aWZpZXIucmVtb3ZlSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBnZXRSZXNvdXJjZVNldFN5bmNocm9uaXplcigpIHsKLQkJaWYgKGVtZkNvbnRleHQgPT0gbnVsbCB8fCAhZW1mQ29udGV4dC5oYXNSZXNvdXJjZVNldCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRFbWZDb250ZXh0KCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlUHJlbG9hZFJlc291cmNlcygpIHsKLQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmMgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSBnZXRSZXNvdXJjZVNldFN5bmNocm9uaXplcigpOwotCQlpZiAoc3luYyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWxvYWRSZXNvdXJjZVVyaXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlVUkkgdXJpID0gKFVSSSkgcHJlbG9hZFJlc291cmNlVXJpcy5nZXQoaSk7Ci0JCQkJc3luYy5kaXNhYmxlQXV0b2xvYWQodXJpKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwga25vd25SZXNvdXJjZUV4dGVuc2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJpbmcgZXh0ID0gKFN0cmluZykga25vd25SZXNvdXJjZUV4dGVuc2lvbnMuZ2V0KGkpOwotCQkJCXN5bmMuZGlzYWJsZUF1dG9sb2FkKGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKiAqKiBCRUdJTiBDb21tYW5kIFN0YWNrIE1hbmlwdWxhdGlvbiAqKiogKi8KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQ29tbWFuZFN0YWNrLgotCSAqLwotCXByb3RlY3RlZCBCYXNpY0NvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCUJhc2ljQ29tbWFuZFN0YWNrIHN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7Ci0JCXJldHVybiBzdGFjazsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIHRoZSB7QGxpbmtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrfSdzIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoamF2YS51dGlsLkV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCWlmIChkaXJ0eU1vZGVsRXZlbnQgPT0gbnVsbCkKLQkJCWRpcnR5TW9kZWxFdmVudCA9IG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5ESVJUWSwgdGhpcyk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkKLQkJCW5vdGlmeUxpc3RlbmVycyhkaXJ0eU1vZGVsRXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEZsdXNoIHRoZSBDb21tYW5kcyBmcm9tIHRoZSBDb21tYW5kU3RhY2suCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmx1c2hDb21tYW5kU3RhY2soKSB7Ci0JCWdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCWdldENvbW1hbmRTdGFjaygpLnNhdmVJc0RvbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENvbW1hbmRTdGFjay4KLQkgKi8KLQlwdWJsaWMgQmFzaWNDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlpZiAoY29tbWFuZFN0YWNrID09IG51bGwpIHsKLQkJCWNvbW1hbmRTdGFjayA9IGNyZWF0ZUNvbW1hbmRTdGFjaygpOwotCQkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kU3RhY2s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gIWxpc3RlbmVycy5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqICoqIEVORCBDb21tYW5kIFN0YWNrIE1hbmlwdWxhdGlvbiAqKiogKi8KLQotCS8qKiAqKiBCRUdJTiBMaXN0ZW5lcnMgKioqICovCi0KLQkvKioKLQkgKiBBZGQKLQkgKiAKLQkgKiBAYUxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJaWYgKGFMaXN0ZW5lciAhPSBudWxsKQotCQkJbGlzdGVuZXJzLmFkZChhTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YKLQkgKiAKLQkgKiBAYW5FdmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQkKLQkJTm90aWZ5UnVubmVyIG5vdGlmaWVyID0gbmV3IE5vdGlmeVJ1bm5lcihhbkV2ZW50KTsgCi0JCQotCQlPYmplY3RbXSBub3RpZnlMaXN0ID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOyAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZnlMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlub3RpZmllci5zZXRMaXN0ZW5lciggKEVkaXRNb2RlbExpc3RlbmVyKSBub3RpZnlMaXN0W2ldICk7Ci0JCQlTYWZlUnVubmVyLnJ1bihub3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUKLQkgKiAKLQkgKiBAYUxpc3RlbmVyIGZyb20gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUxpc3RlbmVyKEVkaXRNb2RlbExpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKiAqKiBFTkQgTGlzdGVuZXJzICoqKiAqLwotCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUZpbGVFZGl0YWJsZShJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYUZpbGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuc2V0UmVhZE9ubHkoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2YgSUZpbGU7IGFueSByZWFkLW9ubHkgZmlsZXMgdGhhdCB3aWxsIGJlIHRvdWNoZWQgaWYgdGhpcyBlZGl0IG1vZGVsCi0JICogICAgICAgICBzYXZlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlYWRPbmx5QWZmZWN0ZWRGaWxlcygpIHsKLQkJSXRlcmF0b3IgYWZmZWN0ZWQgPSBnZXRBZmZlY3RlZEZpbGVzKCkuaXRlcmF0b3IoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChhZmZlY3RlZC5oYXNOZXh0KCkpIHsKLQkJCUlGaWxlIGFGaWxlID0gKElGaWxlKSBhZmZlY3RlZC5uZXh0KCk7Ci0JCQlpZiAoYUZpbGUuaXNSZWFkT25seSgpKQotCQkJCXJlc3VsdC5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqICoqIEJFR0lOIFNhdmUgSGFuZGxlcnMgKioqICovCi0KLQlwcm90ZWN0ZWQgSVNhdmVIYW5kbGVyIGdldFNhdmVIYW5kbGVyKCkgewotCQlyZXR1cm4gU2F2ZUhhbmRsZXJSZWdpc3Rlci5nZXRTYXZlSGFuZGxlcigpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgc2F2ZUlmTmVjZXNzYXJ5IG9yCi0JICogc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdCBkZXRlcm1pbmVzIG5vdCB0byBzYXZlLiBUaGlzIHByb3ZpZGVzIHN1YmNsYXNzZXMgd2l0aCBhbgotCSAqIG9wcG9ydHVuaXR5IHRvIGRvIHNvbWUgb3RoZXIgYWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZm9yY2UgYWxsIG9mIHRoZSByZWZlcmVuY2VkIFJlc291cmNlcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlzYXZlKG51bGwsIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZm9yY2UgYWxsIG9mIHRoZSByZWZlcmVuY2VkIFJlc291cmNlcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yIHsKLQkJLy8gc2F2ZQotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHtAbGluayAjcHJpbVNhdmV9Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlhc3NlcnRQZXJtaXNzaW9uVG9TYXZlKGFjY2Vzc29yS2V5KTsKLQkJZ2V0U2F2ZUhhbmRsZXIoKS5hY2Nlc3MoKTsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJCQkJcHJpbVNhdmUoYU1vbml0b3IpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5TYXZlT3BlcmF0aW9uKHJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCkgewotCQkJZ2V0U2F2ZUhhbmRsZXIoKS5oYW5kbGVTYXZlRmFpbGVkKGV4LCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFNhdmVIYW5kbGVyKCkucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUgc2F2ZWQgKGkuZS4sIG5vIG90aGVyIHJlZmVyZW5jZXMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJc2F2ZUlmTmVjZXNzYXJ5KG51bGwsIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgbmVlZCB0byBiZSBzYXZlZCAoaS5lLiwgbm8gb3RoZXIgcmVmZXJlbmNlcykuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCWlmIChzaG91bGRTYXZlKCkpCi0JCQlzYXZlKG1vbml0b3IsIGFjY2Vzc29yS2V5KTsKLQkJZWxzZQotCQkJaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG9ubHkgaWYgbmVjZXNzYXJ5LiBJZiB0eXBpY2FsbHkgYSBzYXZlIHdvdWxkIG5vdCBvY2N1ciBiZWNhdXNlIHRoaXMgZWRpdCBtb2RlbCBpcwotCSAqIHNoYXJlZCwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB1c2luZyB0aGUKLQkgKiAKLQkgKiBAb3BlcmF0aW9uSGFuZGxlci4gSWYgdGhlIHByb21wdCByZXR1cm5zIHRydWUgKHRoZSB1c2VyIHdhbnRzIHRvIHNhdmUpIHRoZSBlbnRpcmUgZWRpdCBtb2RlbAotCSAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQobnVsbCwgb3BlcmF0aW9uSGFuZGxlciwgYWNjZXNzb3JLZXkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgb25seSBpZiBuZWNlc3NhcnkuIElmIHR5cGljYWxseSBhIHNhdmUgd291bGQgbm90IG9jY3VyIGJlY2F1c2UgdGhpcyBlZGl0IG1vZGVsIGlzCi0JICogc2hhcmVkLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHVzaW5nIHRoZQotCSAqIAotCSAqIEBvcGVyYXRpb25IYW5kbGVyLiBJZiB0aGUgcHJvbXB0IHJldHVybnMgdHJ1ZSAodGhlIHVzZXIgd2FudHMgdG8gc2F2ZSkgdGhlIGVudGlyZSBlZGl0IG1vZGVsCi0JICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc2F2ZWQuIFlvdSBtYXkgcGFzcyBpbiBhIGJvb2xlYW4gPGNvZGU+d2FzRGlydHk8L2NvZGU+IHRvCi0JICogICAgICAgICAgICAgICAgICAgIGluZGljYXRlIHdoZXRoZXIgdGhpcyBlZGl0IG1vZGVsIHdhcyBkaXJ0eSBwcmlvciB0byBtYWtpbmcgYW55IGNoYW5nZXMgYW5kCi0JICogICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgdGhpcyBtZXRob2QuIHtAbGluayBFZGl0TW9kZWwjaXNEaXJ0eSgpfQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgYm9vbGVhbiB3YXNEaXJ0eSwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQobnVsbCwgb3BlcmF0aW9uSGFuZGxlciwgd2FzRGlydHksIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG9ubHkgaWYgbmVjZXNzYXJ5LiBJZiB0eXBpY2FsbHkgYSBzYXZlIHdvdWxkIG5vdCBvY2N1ciBiZWNhdXNlIHRoaXMgZWRpdCBtb2RlbCBpcwotCSAqIHNoYXJlZCwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB1c2luZyB0aGUKLQkgKiAKLQkgKiBAb3BlcmF0aW9uSGFuZGxlci4gSWYgdGhlIHByb21wdCByZXR1cm5zIHRydWUgKHRoZSB1c2VyIHdhbnRzIHRvIHNhdmUpIHRoZSBlbnRpcmUgZWRpdCBtb2RlbAotCSAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdChtb25pdG9yLCBvcGVyYXRpb25IYW5kbGVyLCB0cnVlLCBhY2Nlc3NvcktleSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IGlmIG5lY2Vzc2FyeS4gSWYgdHlwaWNhbGx5IGEgc2F2ZSB3b3VsZCBub3Qgb2NjdXIgYmVjYXVzZSB0aGlzIGVkaXQgbW9kZWwgaXMKLQkgKiBzaGFyZWQsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdXNpbmcgdGhlCi0JICogCi0JICogQG9wZXJhdGlvbkhhbmRsZXIuIElmIHRoZSBwcm9tcHQgcmV0dXJucyB0cnVlICh0aGUgdXNlciB3YW50cyB0byBzYXZlKSB0aGUgZW50aXJlIGVkaXQgbW9kZWwKLQkgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzYXZlZC4gWW91IG1heSBwYXNzIGluIGEgYm9vbGVhbiA8Y29kZT53YXNEaXJ0eTwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGUgd2hldGhlciB0aGlzIGVkaXQgbW9kZWwgd2FzIGRpcnR5IHByaW9yIHRvIG1ha2luZyBhbnkgY2hhbmdlcyBhbmQKLQkgKiAgICAgICAgICAgICAgICAgICAgY2FsbGluZyB0aGlzIG1ldGhvZC4ge0BsaW5rIEVkaXRNb2RlbCNpc0RpcnR5KCl9Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIGJvb2xlYW4gd2FzRGlydHksIE9iamVjdCBhY2Nlc3NvcktleSkgewotCi0JCWlmIChzaG91bGRTYXZlKG9wZXJhdGlvbkhhbmRsZXIsIHdhc0RpcnR5KSkKLQkJCXNhdmUobW9uaXRvciwgYWNjZXNzb3JLZXkpOwotCQllbHNlCi0JCQloYW5kbGVTYXZlSWZOZWNlc3NhcnlEaWROb3RTYXZlKG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFBlcm1pc3Npb25Ub1NhdmUoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCWlmIChyZWdpc3RyeSAhPSBudWxsKQotCQkJcmVnaXN0cnkuYXNzZXJ0QWNjZXNzKGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW5TYXZlT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgU2F2ZUZhaWxlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIHJlc291cmNlcyBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIGJvb2xlYW4gd2FzRGlydHkpIHsKLQkJcmV0dXJuICF3YXNEaXJ0eSA/IHNob3VsZFNhdmUoKSA6IHNob3VsZFNhdmUob3BlcmF0aW9uSGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHVyaSBmb3IKLQkgKiAKLQkgKiBAYVJlc291cmNlIGlzIG9uZSBvZiB0aGUga25vd24gcmVzb3VyY2UgdXJpcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5SZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGlzSW50ZXJyZXN0ZWRJblJlc291cmNlVXJpKGFSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcnJlc3RlZEluUmVzb3VyY2VVcmkoVVJJIHJlc1VSSSkgewotCQlVUkkgdXJpOwotCQlMaXN0IHVyaVN0cmluZ3MgPSBnZXRLbm93blJlc291cmNlVXJpcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaVN0cmluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCXVyaSA9IChVUkkpIHVyaVN0cmluZ3MuZ2V0KGkpOwotCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmVuZHNXaXRoKHJlc1VSSSwgdXJpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhbmQgYWRkIFVSSXMgKHR5cGUgVVJJKSBvZiBrbm93biByZXNvdXJjZXMuIFlvdSBtdXN0IGFkZCByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgcmVmZXJlbmNlcyB0byBvdGhlciBrbm93biByZXNvdXJjZXMgZmlyc3Qgc28gdGhleSB3aWxsIGJlIHJlbGVhc2VkIGZpcnN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVLbm93blJlc291cmNlVXJpcygpIHsKLQkJa25vd25SZXNvdXJjZVVyaXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByZWxvYWRSZXNvdXJjZVVyaXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVkaXRNb2RlbFJlc291cmNlIHJlcyA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gZWRpdE1vZGVsUmVzb3VyY2VzID0gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFZGl0TW9kZWxSZXNvdXJjZXMoZ2V0RWRpdE1vZGVsSUQoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBlZGl0TW9kZWxSZXNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlyZXMgPSAoRWRpdE1vZGVsUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJYWRkRWRpdE1vZGVsUmVzb3VyY2UocmVzKTsKLQkJfQotCQlDb2xsZWN0aW9uIHJlc291cmNlRXh0ZW5zaW9ucyA9IEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWRpdE1vZGVsRXh0ZW5zaW9ucyhnZXRFZGl0TW9kZWxJRCgpKTsKLQkJLyogYnVnIDE3MDY5MCAtIGluaXRpYWxpemUga25vd25SZXNvdXJjZUV4dGVuc2lvbnMgaWYgbmVjZXNzYXJ5LCBhbmQgY2hhbmdlIHJlZmVyZW5jZSBmcm9tIGl0ZXIgdG8gaXQgKi8KLQkJaWYgKGtub3duUmVzb3VyY2VFeHRlbnNpb25zID09IG51bGwpCi0JCXsKLQkJCWtub3duUmVzb3VyY2VFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWlmICghcmVzb3VyY2VFeHRlbnNpb25zLmlzRW1wdHkoKSkKLQkJewotCQkJa25vd25SZXNvdXJjZUV4dGVuc2lvbnMuYWRkQWxsKHJlc291cmNlRXh0ZW5zaW9ucyk7Ci0JCQlJdGVyYXRvciBpdCA9IHJlc291cmNlRXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotCQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmMgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSBnZXRFbWZDb250ZXh0KCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlzeW5jLmVuYWJsZUF1dG9sb2FkKGl0Lm5leHQoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFZGl0TW9kZWxSZXNvdXJjZShFZGl0TW9kZWxSZXNvdXJjZSByZXMpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzLmlzQ29yZSgpKSB7Ci0JCQkJZW5hYmxlZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gcmVzLmdldEVuYWJsZW1lbnRJZGVudGlmaWVyKGdldFByb2plY3QoKSk7Ci0JCQkJcmVnaXN0ZXJJbnRlcmVzdChpZGVudGlmaWVyLCByZXMpOwotCQkJCWVuYWJsZWQgPSBpZGVudGlmaWVyLmlzRW5hYmxlZCgpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhyZSk7Ci0JCX0KLQkJaWYgKGVuYWJsZWQpIHsKLQkJCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCQlrbm93blJlc291cmNlVXJpcy5hZGQodXJpKTsKLQkJCWlmIChyZXMuaXNBdXRvTG9hZCgpKSB7Ci0JCQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmMgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSBnZXRFbWZDb250ZXh0KCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQkJCQlzeW5jLmVuYWJsZUF1dG9sb2FkKHVyaSk7Ci0JCQkJcHJlbG9hZFJlc291cmNlVXJpcy5hZGQodXJpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJJbnRlcmVzdChJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciwgRWRpdE1vZGVsUmVzb3VyY2UgcmVzKSB7Ci0JCWdldEVkaXRNb2RlbFJlc291cmNlcyhpZGVudGlmaWVyKS5hZGQocmVzKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKElFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyKSB7Ci0JCWlmIChyZXNvdXJjZUlkZW50aWZpZXJzID09IG51bGwpCi0JCQlyZXNvdXJjZUlkZW50aWZpZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCB0UmVzb3VyY2VzID0gKExpc3QpIHJlc291cmNlSWRlbnRpZmllcnMuZ2V0KGlkZW50aWZpZXIpOwotCQlpZiAodFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQl0UmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJCXJlc291cmNlSWRlbnRpZmllcnMucHV0KGlkZW50aWZpZXIsIHRSZXNvdXJjZXMpOwotCQkJaWRlbnRpZmllci5hZGRJZGVudGlmaWVyTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHRSZXNvdXJjZXM7Ci0JfQotCi0KLQotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRLbm93blJlc291cmNlVXJpcygpIHsKLQkJaWYgKGtub3duUmVzb3VyY2VVcmlzID09IG51bGwpCi0JCQlpbml0aWFsaXplS25vd25SZXNvdXJjZVVyaXMoKTsKLQotCQlyZXR1cm4ga25vd25SZXNvdXJjZVVyaXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiByZWdpc3RyeS5zaXplKCkgPiAxOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjYWNoZU5vblJlc291cmNlVmFsaWRhdGVTdGF0ZShMaXN0IHJvTm9uUmVzb3VyY2VGaWxlcykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciNnZXROb25SZXNvdXJjZUZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXROb25SZXNvdXJjZUZpbGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2dldE5vblJlc291cmNlSW5jb25zaXN0ZW50RmlsZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE5vblJlc291cmNlSW5jb25zaXN0ZW50RmlsZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN0YXRlVmFsaWRhdG9yLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFJlc291cmNlU3RhdGVWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBnZXRTdGF0ZVZhbGlkYXRvcigpIHsKLQkJaWYgKHN0YXRlVmFsaWRhdG9yID09IG51bGwpCi0JCQlzdGF0ZVZhbGlkYXRvciA9IGNyZWF0ZVN0YXRlVmFsaWRhdG9yKCk7Ci0JCXJldHVybiBzdGF0ZVZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlU3RhdGVWYWxpZGF0b3IuCi0JICogCi0JICogQHJldHVybiBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yCi0JICovCi0JcHJpdmF0ZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIGNyZWF0ZVN0YXRlVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciNjaGVja0FjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0FjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZ2V0U3RhdGVWYWxpZGF0b3IoKS5jaGVja0FjdGl2YXRpb24ocHJlc2VudGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IjbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb3N0QWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlnZXRTdGF0ZVZhbGlkYXRvcigpLmxvc3RBY3RpdmF0aW9uKHByZXNlbnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI3ZhbGlkYXRlU3RhdGUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVN0YXRlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwcmVzZW50ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlyZXR1cm4gZ2V0U3RhdGVWYWxpZGF0b3IoKS52YWxpZGF0ZVN0YXRlKHByZXNlbnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrU2F2ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrU2F2ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0U3RhdGVWYWxpZGF0b3IoKS5jaGVja1NhdmUocHJlc2VudGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IjY2hlY2tSZWFkT25seSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tSZWFkT25seSgpIHsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tSZWFkT25seSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVzb3VyY2VTZXQgZnJvbSB0aGUgTmF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ci0JICovCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCWlmIChnZXRFbWZDb250ZXh0KCkgIT0gbnVsbCkKLQkJCXJlc291cmNlU2V0ID0gZ2V0RW1mQ29udGV4dCgpLmdldFJlc291cmNlU2V0KCk7Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZChSZXNvdXJjZSBhUmVzb3VyY2UsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJaWYgKCFpc1JldmVydGluZyAmJiAhZGlzcG9zaW5nICYmIGhhc0xpc3RlbmVycygpKSB7Ci0JCQlpbnQgZXZlbnRDb2RlID0gbmV3VmFsdWUgPyBFZGl0TW9kZWxFdmVudC5MT0FERURfUkVTT1VSQ0UgOiBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRTsKLQkJCUVkaXRNb2RlbEV2ZW50IGV2dCA9IG5ldyBFZGl0TW9kZWxFdmVudChldmVudENvZGUsIHRoaXMpOwotCQkJZXZ0LmFkZFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZXZ0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgYVVyaSkgewotCQlSZXNvdXJjZSByZXMgPSBnZXRBbmRMb2FkTG9jYWxSZXNvdXJjZShhVXJpKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0T3JDcmVhdGVSZXNvdXJjZShhVXJpLCBnZXRSZXNvdXJjZVNldCgpKTsKLQkJaWYgKHJlcyAhPSBudWxsKQotCQkJcHJvY2Vzc1Jlc291cmNlKHJlcyk7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Jlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwgJiYgIWdldFJlc291cmNlcygpLmNvbnRhaW5zKGFSZXNvdXJjZSkpIHsKLQkJCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBSZWZlcmVuY2VkUmVzb3VyY2UpIHsKLQkJCQlhY2Nlc3MoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKTsKLQkJCQkvLyBXZSBuZWVkIGEgYmV0dGVyIHdheSB0byBwYXNzIHRoaXMgdGhyb3VnaCB0aGUgc2F2ZSBvcHRpb25zIGluc3RlYWQuCi0JCQkJLy8gV2UgYWxzbyBuZWVkIHRvIG1ha2UgdGhpcyBkeW5hbWljIGJhc2VkIG9uIHRoZSBwcm9qZWN0IHRhcmdldAotCQkJCSgoUmVmZXJlbmNlZFJlc291cmNlKSBhUmVzb3VyY2UpLnNldEZvcm1hdChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX01PRjUpOwotCQkJfSBlbHNlIGlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIHsKLQkJCQkoKENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkgYVJlc291cmNlKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJCX0KLQotCQkJYWRkUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlnZXRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKLQkJYVJlc291cmNlLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlIGZvcgotCSAqIAotCSAqIEBhVXJpLgotCSAqLwotCS8vIFRPRE8gVGhlIGZvbGxvd2luZyBtZXRob2Qgd2lsbCBvbmx5IHVzZSB0aGUgbGFzdCBzZWdtZW50IHdoZW4gbG9va2luZyBmb3IgYSByZXNvdXJjZS4KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoTGlzdCB0UmVzb3VyY2VzLCBVUkkgYVVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0UmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgdFJlc291cmNlcy5nZXQoaSk7Ci0JCQlpZiAoRXh0ZW5kZWRFY29yZVV0aWwuZW5kc1dpdGgocmVzb3VyY2UuZ2V0VVJJKCksIGFVcmkpKQotCQkJCXJldHVybiByZXNvdXJjZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlwcm9jZXNzUmVzb3VyY2UocmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgY2FjaGVkIFJlc291cmNlLCBlaXRoZXIgbG9jYWwgb3IgaW4gdGhlIFJlc291cmNlU2V0LCBiZWZvcmUgY3JlYXRpbmcgYSBSZXNvdXJjZS4gVGhpcwotCSAqIGFwaSBoYW5kbGVzIHRoZSBjYXNlIHRoYXQgdGhlIFJlc291cmNlIG1heSBiZSBjcmVhdGVkIGR1cmluZyBhIGRlbWFuZCBsb2FkIHRoYXQgZmFpbGVkLgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXMgPSBnZXRBbmRMb2FkTG9jYWxSZXNvdXJjZSh1cmkpOwotCQlpZiAocmVzID09IG51bGwpCi0JCQlyZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKHVyaSwgZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgUmVzb3VyY2UgZm9yCi0JICogCi0JICogQGFVcmkuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldEFuZExvYWRMb2NhbFJlc291cmNlKFVSSSBhVXJpKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0TG9jYWxSZXNvdXJjZShhVXJpKTsKLQkJaWYgKG51bGwgIT0gcmVzb3VyY2UgJiYgIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOyAvLyByZWxvYWQgaXQKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgUmVzb3VyY2UgZm9yCi0JICogCi0JICogQGFVcmkuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldExvY2FsUmVzb3VyY2UoVVJJIGFVcmkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKGdldFJlc291cmNlcygpLCBhVXJpKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBSZWFkT25seSBFZGl0TW9kZWwgb3IgaWYgd2Ugc2hvdWxkIG9ubHkgYWNjZXNzIHVua25vd24gVVJJcyBhcwotCSAqIFJlYWRPbmx5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFjY2Vzc0ZvclJlYWQoUmVmZXJlbmNlZFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlyZXR1cm4gaXNSZWFkT25seSgpIHx8IChhY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyAmJiAhaXNJbnRlcnJlc3RlZEluUmVzb3VyY2UoYVJlc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUgc2F2ZWQgKGkuZS4sIG5vIG90aGVyIHJlZmVyZW5jZXMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCWludCBjb2RlID0gYW5FdmVudC5nZXRFdmVudENvZGUoKTsKLQkJc3dpdGNoIChjb2RlKSB7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UgOiB7Ci0JCQkJaWYgKCFpc1JldmVydGluZyAmJiBoYXNSZXNvdXJjZVJlZmVyZW5jZShhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKSkpCi0JCQkJCXJlbW92ZVJlc291cmNlcyhhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LkFEREVEX1JFU09VUkNFIDoKLQkJCQlpZiAoIXByb2Nlc3NSZXNvdXJjZXNJZkludGVycmVzdGVkKGFuRXZlbnQuZ2V0Q2hhbmdlZFJlc291cmNlcygpKSkKLQkJCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJYW5FdmVudC5zZXRFZGl0TW9kZWwodGhpcyk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoYW5FdmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhUmVzb3VyY2UgaXMgcmVmZXJlbmNlZCBieSBtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNSZXNvdXJjZVJlZmVyZW5jZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFJlc291cmNlcygpLmNvbnRhaW5zKGFSZXNvdXJjZSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgUmVzb3VyY2UgaW4gdGhlIGxpc3Qgb2YKLQkgKiAKLQkgKiBAcmVzb3VyY2VzIGlzIHJlZmVyZW5jZWQgYnkgbWUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVzb3VyY2VSZWZlcmVuY2UoTGlzdCB0UmVzb3VyY2VzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJaWYgKGhhc1Jlc291cmNlUmVmZXJlbmNlKChSZXNvdXJjZSkgdFJlc291cmNlcy5nZXQoaSkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgcmVmZXJlbmNlIHRvIHRoZSBSZXNvdXJjZSBvYmplY3RzIGluCi0JICogCi0JICogQGFMaXN0LiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBSZXNvdXJjZSBvYmplY3RzIGFyZSByZW1vdmVkIGZyb20gdGhlCi0JICogICAgICAgICBSZXNvdXJjZVNldCB3aXRob3V0IHRoZSByZWZlcmVuY2UgY291bnQgZ29pbmcgdG8gemVyby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZXMoTGlzdCBhTGlzdCkgewotCQlSZXNvdXJjZSByZXM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgYUxpc3QuZ2V0KGkpOwotCQkJaWYgKHJlbW92ZVJlc291cmNlKHJlcykgJiYgcmVzIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlKQotCQkJCXJlbW92ZWRSZXNvdXJjZSgoUmVmZXJlbmNlZFJlc291cmNlKSByZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHJlbW92ZWRSZXNvdXJjZShSZWZlcmVuY2VkUmVzb3VyY2UgcmVmZXJlbmNlZFJlc291cmNlKSB7Ci0JCWlmICghaXNSZWFkT25seSgpICYmIHJlZmVyZW5jZWRSZXNvdXJjZS53YXNSZXZlcnRlZCgpKSB7Ci0JCQlpc1JldmVydGluZyA9IHRydWU7Ci0JCQl0cnkgewotCQkJCXJldmVydGVkKHJlZmVyZW5jZWRSZXNvdXJjZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlzUmV2ZXJ0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlcyA9IGdldExvY2FsUmVzb3VyY2UodXJpKTsKLQkJcmV0dXJuIHJlbW92ZVJlc291cmNlKHJlcyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgYVJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWFSZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VBZGFwdGVyKTsKLQkJCXJldHVybiBnZXRSZXNvdXJjZXMoKS5yZW1vdmUoYVJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcG9zdCBwcm9jZXNzIGEgcmVtb3ZlZCBSZWZlcmVuY2VkUmVzb3VyY2UuCi0JICogCi0JICogQHNlZSBKMkVFRWRpdE1vZGVsI3JldmVydEFsbFJlc291cmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmV2ZXJ0ZWQoUmVmZXJlbmNlZFJlc291cmNlIHJldmVydGVkUmVzb3VyY2UpIHsKLQkJcmV2ZXJ0QWxsUmVzb3VyY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmV2ZXJ0QWxsUmVzb3VyY2VzKCkgewotCQlMaXN0IHNvbWVSZXNvdXJjZXMgPSBnZXRTb3J0ZWRSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb21lUmVzb3VyY2VzLnNpemUoKTsgaSsrKQotCQkJKChSZXNvdXJjZSkgc29tZVJlc291cmNlcy5nZXQoaSkpLnVubG9hZCgpOwotCQlnZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoc29tZVJlc291cmNlcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc29tZVJlc291cmNlcy5zaXplKCk7IGkrKykKLQkJCSgoUmVzb3VyY2UpIHNvbWVSZXNvdXJjZXMuZ2V0KGkpKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBncm91cCB0aGUgcmVzb3VyY2VzIGJ5IFhNSSBmaXJzdCwgdGhlbiBYTUwKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTb3J0ZWRSZXNvdXJjZXMoKSB7Ci0KLQkJTGlzdCB0aGVSZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMoKTsKLQkJaW50IHNpemUgPSB0aGVSZXNvdXJjZXMuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCVJlc291cmNlW10gc29ydGVkID0gbmV3IFJlc291cmNlW3NpemVdOwotCQlpbnQgeG1sSW5zZXJ0UG9zID0gc2l6ZSAtIDE7Ci0JCWludCB4bWlJbnNlcnRQb3MgPSAwOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSB0aGVSZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKHJlcyBpbnN0YW5jZW9mIFRyYW5zbGF0b3JSZXNvdXJjZSkKLQkJCQlzb3J0ZWRbeG1sSW5zZXJ0UG9zLS1dID0gcmVzOwotCQkJZWxzZQotCQkJCXNvcnRlZFt4bWlJbnNlcnRQb3MrK10gPSByZXM7Ci0JCX0KLQotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChzb3J0ZWQpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgUmVzb3VyY2VzIHRoYXQgd2UgYXJlIGludGVycmVzdGVkIGluLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NSZXNvdXJjZXNJZkludGVycmVzdGVkKExpc3Qgc29tZVJlc291cmNlcykgewotCQlpbnQgc2l6ZSA9IHNvbWVSZXNvdXJjZXMuc2l6ZSgpOwotCQlSZXNvdXJjZSByZXM7Ci0JCWJvb2xlYW4gcHJvY2Vzc2VkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIHNvbWVSZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKChyZXMgIT0gbnVsbCkgJiYgKGlzSW50ZXJyZXN0ZWRJblJlc291cmNlKHJlcykpKSB7Ci0JCQkJcHJvY2Vzc1Jlc291cmNlKHJlcyk7Ci0JCQkJcHJvY2Vzc2VkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvY2Vzc2VkOwotCX0KLQotCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0IGdldEVtZkNvbnRleHQoKSB7Ci0JCWlmIChpc0Rpc3Bvc2VkKCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFZGl0IE1vZGVsIGFscmVhZHkgZGlzcG9zZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW1mQ29udGV4dCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRU1GIGNvbnRleHQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbWZDb250ZXh0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBkaXNwb3NlZDsKLQl9Ci0KLQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgRU1GV29ya2JlbmNoQ29udGV4dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3MoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXJlZ2lzdHJ5LmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JfQotCi0JLyoqCi0JICogQWNjZXNzCi0JICogCi0JICogQGFSZXNvdXJjZSBmb3IgcmVhZCBvciB3cml0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2Nlc3MoUmVmZXJlbmNlZFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoc2hvdWxkQWNjZXNzRm9yUmVhZChhUmVzb3VyY2UpKQotCQkJYVJlc291cmNlLmFjY2Vzc0ZvclJlYWQoKTsKLQkJZWxzZQotCQkJYVJlc291cmNlLmFjY2Vzc0ZvcldyaXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGVhY2ggY2xpZW50IHdoZW4gdGhleSBhcmUgZmluaXNoZWQgd29ya2luZyB3aXRoIHRoZQotCSAqIEVkaXRNb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlQWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgewotCi0JCXJlZ2lzdHJ5LnJlbGVhc2UoYWNjZXNzb3JLZXkpOwotCi0JCWlmICghaXNEaXNwb3NpbmcoKSkgewotCQkJYm9vbGVhbiBzaG91bGREaXNwb3NlID0gZmFsc2U7Ci0JCQlzaG91bGREaXNwb3NlID0gcmVnaXN0cnkuc2l6ZSgpID09IDA7Ci0JCQlpZiAoc2hvdWxkRGlzcG9zZSkgewotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgZWFjaCBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQotCQlyZW1vdmVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQlpZiAoYVJlc291cmNlICE9IG51bGwgJiYgYVJlc291cmNlIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlKQotCQkJcmVsZWFzZSgoUmVmZXJlbmNlZFJlc291cmNlKSBhUmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgZWFjaCBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZShSZWZlcmVuY2VkUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChpc1JlYWRPbmx5KCkpCi0JCQlhUmVzb3VyY2UucmVsZWFzZUZyb21SZWFkKCk7Ci0JCWVsc2UKLQkJCWFSZXNvdXJjZS5yZWxlYXNlRnJvbVdyaXRlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgdFJlc291cmNlcyA9IGdldFNvcnRlZFJlc291cmNlcygpOwotCQlSZXNvdXJjZSByZXNvdXJjZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0UmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgdFJlc291cmNlcy5nZXQoaSk7Ci0JCQlyZWxlYXNlKHJlc291cmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlID09IG51bGwgfHwgcmVzb3VyY2VzID09IG51bGwgfHwgIWdldFJlc291cmNlcygpLmNvbnRhaW5zKGFSZXNvdXJjZSkpCi0JCQlyZXR1cm47Ci0JCWdldFJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24oKS5hZGQoYVJlc291cmNlKTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uKCkgewotCQlpZiAocmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbiA9PSBudWxsKQotCQkJcmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbiA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCXJldHVybiByZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uOwotCX0KLQotCi0KLQkvKioKLQkgKiBSZW1vdmUgbXkgcmVmZXJlbmNlIHRvIGFSZXNvdXJjZSwgcmVtb3ZlIGl0IGZyb20gdGhlIFJlc291cmNlU2V0LCBhbmQgZGVsZXRlIGl0cyBmaWxlIGZyb20KLQkgKiB0aGUgV29ya2JlbmNoLiBUaGlzIG9ubHkgaGFwcGVucyBpZiB0aGVyZSBpcyBjdXJyZW50bHkgYSByZWZlcmVuY2UgdG8KLQkgKiAKLQkgKiBAYVJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1EZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKHByaW1GbHVzaFJlc291cmNlKGFSZXNvdXJjZSkpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0RW1mQ29udGV4dCgpLmRlbGV0ZVJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3aGF0IHNob3VsZCB3ZSBkbyBoZXJlPwotCQkJfQotCQkJaWYgKGhhc0xpc3RlbmVycygpKSB7Ci0JCQkJRWRpdE1vZGVsRXZlbnQgZXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSwgdGhpcyk7Ci0JCQkJZXZlbnQuYWRkUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG15IHJlZmVyZW5jZSB0byBhUmVzb3VyY2UgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBSZXNvdXJjZVNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaFJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAocHJpbUZsdXNoUmVzb3VyY2UoYVJlc291cmNlKSkgewotCQkJaWYgKGhhc0xpc3RlbmVycygpKSB7Ci0JCQkJRWRpdE1vZGVsRXZlbnQgZXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSwgdGhpcyk7Ci0JCQkJZXZlbnQuYWRkUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlTZXQgYVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgbW9mUmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9mUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSBhUmVzb3VyY2UgPSAoUmVzb3VyY2UpIG1vZlJlc291cmNlcy5nZXQoaSk7Ci0JCQlJRmlsZSBvdXRwdXQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKGFSZXNvdXJjZSk7Ci0JCQlpZiAob3V0cHV0ICE9IG51bGwpCi0JCQkJYVNldC5hZGQob3V0cHV0KTsKLQkJfQotCQlyZXR1cm4gYVNldDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCByZXNldEtub3duUmVzb3VyY2VVcmlzKCkgewotCi0JCWluaXRpYWxpemVLbm93blJlc291cmNlVXJpcygpOwotCi0JCXJldHVybiBrbm93blJlc291cmNlVXJpczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgNDoxNDoyNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VzKCkgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KDUpOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZVVSSXMoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVVSSXMoZmFsc2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZVVSSXMoYm9vbGVhbiBvbmx5RGlydHkpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCWludCBkaXJ0eUNvdW50ID0gMDsKLQkJU3RyaW5nW10gdXJpcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlSZXNvdXJjZSByZXM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSBsaXN0LmdldChpKTsKLQkJCWlmICghb25seURpcnR5KQotCQkJCXVyaXNbaV0gPSByZXMuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCWVsc2UgaWYgKHJlcy5pc01vZGlmaWVkKCkpIHsKLQkJCQl1cmlzW2ldID0gcmVzLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJZGlydHlDb3VudCsrOwotCQkJfQotCQl9Ci0JCWlmIChvbmx5RGlydHkgJiYgZGlydHlDb3VudCA+IDApIHsKLQkJCVN0cmluZ1tdIGRpcnR5ID0gbmV3IFN0cmluZ1tkaXJ0eUNvdW50XTsKLQkJCWludCBqID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh1cmlzW2ldICE9IG51bGwpIHsKLQkJCQkJZGlydHlbal0gPSB1cmlzW2ldOwotCQkJCQlqKys7Ci0JCQkJfQotCQkJfQotCQkJdXJpcyA9IGRpcnR5OwotCQl9Ci0JCXJldHVybiB1cmlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGV4dGVudCBvZiB0aGUgcmVzb3VyY2U7IGxvZ3MgYW4gZXJyb3IgYW5kIHJldHVybnMgbnVsbCBpZgotCSAqIHRoZSBleHRlbnQgaXMgZW1wdHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0Um9vdChSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJRUxpc3QgZXh0ZW50ID0gYVJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JCWlmIChleHRlbnQuc2l6ZSgpIDwgMSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEVPYmplY3QpIGV4dGVudC5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBmYWlsdXJlIG9mCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTYXZlRmFpbGVkKFJlc291cmNlIGFSZXNvdXJjZSwgRXhjZXB0aW9uIGUpIHsKLQkJYVJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQlpZiAoaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKGUpICYmIHNob3VsZFNhdmVSZWFkT25seShhUmVzb3VyY2UpKQotCQkJc2F2ZVJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCWVsc2UKLQkJCXByaW1IYW5kbGVTYXZlRmFpbGVkKGFSZXNvdXJjZSwgZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IG9mIG15IHJlc291cmNlcyBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FueVJlc291cmNlRGlydHkoKSB7Ci0JCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWlmICgoKFJlc291cmNlKSBsaXN0LmdldChpKSkuaXNNb2RpZmllZCgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIHNhdmUgaXMgbmVlZGVkIG9uIHRoZSBDb21tYW5kU3RhY2sKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gaXNBbnlSZXNvdXJjZURpcnR5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKEV4Y2VwdGlvbiBleCkgewotCQlyZXR1cm4gU2F2ZUhhbmRsZXJIZWFkbGVzcy5pc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHlvdSBjYW4gb25seSByZWFkIHRoZSByZXNvdXJjZXMgYW5kIG5vdCB3cml0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gcmVhZE9ubHk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seUZhaWx1cmUoRXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWFkT25seVJlc291cmNlKCkgewotCQl0cnkgewotCQkJTGlzdCBsaXN0ID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJCUlGaWxlIGZpbGU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0JCQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlUmVzb3VyY2UoVVJJKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VSZXNvdXJjZShTdHJpbmcgYVVyaSkgewotCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShhVXJpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IG9mIG15IHJlc291cmNlcyBoYXMgYSByZWZlcmVuY2UgY291bnQgb2Ygb25lIGFuZCBpdCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1RvU2F2ZSgpIHsKLQkJcmV0dXJuICFpc1NoYXJlZCgpICYmIGlzRGlydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbXkgcmVmZXJlbmNlIHRvIGFSZXNvdXJjZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIFJlc291cmNlU2V0LiBSZXR1cm4gdHJ1ZSBpZiBhUmVzb3VyY2UKLQkgKiB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltRmx1c2hSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmIGhhc1Jlc291cmNlUmVmZXJlbmNlKGFSZXNvdXJjZSkpIHsKLQkJCXJlbW92ZVJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQlyZW1vdmVSZXNvdXJjZVNldFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBmYWlsdXJlIG9mCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltSGFuZGxlU2F2ZUZhaWxlZChSZXNvdXJjZSBhUmVzb3VyY2UsIEV4Y2VwdGlvbiBlKSB7Ci0JCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCUV4Y2VwdGlvbiBuZXN0ZWQgPSBudWxsOwotCQlpZiAoZSBpbnN0YW5jZW9mIElXRlRXcmFwcGVkRXhjZXB0aW9uKQotCQkJbmVzdGVkID0gKChJV0ZUV3JhcHBlZEV4Y2VwdGlvbikgZSkuZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCWVsc2UKLQkJCW5lc3RlZCA9IGU7Ci0KLQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQW5fZXJyb3Jfb2NjdXJyZWRfd2hpbGVfc2FfRVJST1JfIiksIG5lc3RlZCk7IC8vJE5PTi1OTFMtMSQgPSAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2F2aW5nLiIKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHQgZm9yIGEgc2F2ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9tcHRUb1NhdmUoSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlcikgewotCQlpZiAob3BlcmF0aW9uSGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb3BlcmF0aW9uSGFuZGxlci5jYW5Db250aW51ZShFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZm9sbG93aW5nX3Jlc291cmNlc19uZV9VSV8iKSwgZ2V0UmVzb3VyY2VVUklzKHRydWUpKTsgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZm9sbG93aW5nIHJlc291cmNlcyBuZWVkIHRvIGJlIHNhdmVkIGJ1dCBhcmUgY3VycmVudGx5IHNoYXJlZCwgZG8geW91IHdhbnQgdG8gc2F2ZSBub3c/IgotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBmb3JjZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgUmVzb3VyY2VzIHRvIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoaXNSZWFkT25seSgpKQotCQkJcmV0dXJuOyAvLyBkbyBub3RoaW5nCi0JCWRlbGV0ZVJlc291cmNlc0lmTmVjZXNzYXJ5KCk7Ci0JCVJlc291cmNlIHJlc291cmNlOwotCQlpZiAoZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOyAvLyBub3RoaW5nIHRvIHNhdmUKLQkJTGlzdCBsb2NhbFJlc291cmNlcyA9IGdldFNvcnRlZFJlc291cmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgbG9jYWxSZXNvdXJjZXMuZ2V0KGkpOwotCQkJc2F2ZVJlc291cmNlKHJlc291cmNlKTsKLQkJfQotCQlnZXRDb21tYW5kU3RhY2soKS5zYXZlSXNEb25lKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJRWRpdE1vZGVsRXZlbnQgZXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuU0FWRSwgdGhpcyk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVzb3VyY2VzSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChyZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uID09IG51bGwgfHwgcmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbi5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJUmVzb3VyY2UgZGVhZHJlcyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpLnNpemUoKTsgaSsrKSB7Ci0JCQlkZWFkcmVzID0gKFJlc291cmNlKSBnZXRSZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uKCkuZ2V0KGkpOwotCQkJcHJpbURlbGV0ZVJlc291cmNlKGRlYWRyZXMpOwotCi0JCQlnZXRSZXNvdXJjZXMoKS5yZW1vdmUoZGVhZHJlcyk7Ci0JCQlnZXRSZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uKCkucmVtb3ZlKGRlYWRyZXMpOwotCQl9Ci0JfQotCi0KLQotCS8qKgotCSAqIFNhdmUKLQkgKiAKLQkgKiBAYVJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1TYXZlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGFSZXNvdXJjZS5pc01vZGlmaWVkKCkpCi0JCQlhUmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NMb2FkZWRSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgbG9hZGVkID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJaWYgKCFsb2FkZWQuaXNFbXB0eSgpKQotCQkJcHJvY2Vzc1Jlc291cmNlc0lmSW50ZXJyZXN0ZWQobG9hZGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1ByZWxvYWRSZXNvdXJjZXMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlbG9hZFJlc291cmNlVXJpcy5zaXplKCk7IGkrKykgewotCQkJVVJJIHVyaSA9IChVUkkpIHByZWxvYWRSZXNvdXJjZVVyaXMuZ2V0KGkpOwotCQkJZ2V0UmVzb3VyY2UodXJpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhUmVzb3VyY2UgZnJvbSBteSBSZXNvdXJjZVNldC4gUmV0dXJuIHRydWUgaWYgYVJlc291cmNlIHdhcyByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZVJlc291cmNlU2V0UmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWFSZXNvdXJjZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCWFSZXNvdXJjZS51bmxvYWQoKTsKLQkJYVJlc291cmNlLmVTZXREZWxpdmVyKHRydWUpOwotCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoYVJlc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCXByaW1TYXZlUmVzb3VyY2UocmVzb3VyY2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlU2F2ZUZhaWxlZChyZXNvdXJjZSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIHJlc291cmNlcyBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKCkgewotCQlyZXR1cm4gIWlzUmVhZE9ubHkoKSAmJiAhaXNTaGFyZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIHJlc291cmNlcyBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIpIHsKLQkJcmV0dXJuIHNob3VsZFNhdmUoKSB8fCBwcm9tcHRUb1NhdmUob3BlcmF0aW9uSGFuZGxlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZVJlYWRPbmx5KFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoYVJlc291cmNlKTsKLQkJaWYgKGFGaWxlID09IG51bGwgfHwgIWFGaWxlLmlzUmVhZE9ubHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZ2V0U2F2ZUhhbmRsZXIoKS5zaG91bGRDb250aW51ZUFuZE1ha2VGaWxlRWRpdGFibGUoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIEZvcmNlIGFsbCBvZiB0aGUga25vd24gcmVzb3VyY2UgVVJJcyB0byBiZSBsb2FkZWQgaWYgdGhleSBhcmUgbm90IGFscmVhZHkuCi0JICovCi0JcHVibGljIHZvaWQgZm9yY2VMb2FkS25vd25SZXNvdXJjZXMoKSB7Ci0JCUxpc3QgdXJpcyA9IGdldEtub3duUmVzb3VyY2VVcmlzKCk7Ci0JCVVSSSB1cmkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMuc2l6ZSgpOyBpKyspIHsKLQkJCXVyaSA9IChVUkkpIHVyaXMuZ2V0KGkpOwotCQkJZ2V0UmVzb3VyY2UodXJpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB5b3Ugd2FudCB0byBleHRlbmQgdGhpcyBlZGl0IG1vZGVsIHRvIGhhbmRsZSBhIHJlc291cmNlCi0JICogd2l0aCBhIFVSSSBlcXVhbCB0byA8Y29kZT5hUmVsYXRpdmVVUkk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIG1hbmFnZUV4dGVuc2lvblJlc291cmNlVVJJKFN0cmluZyBhUmVsYXRpdmVVUkkpIHsKLQkJaWYgKGFSZWxhdGl2ZVVSSSAhPSBudWxsICYmIGFSZWxhdGl2ZVVSSS5sZW5ndGgoKSA+IDApIHsKLQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKGFSZWxhdGl2ZVVSSSk7Ci0JCQlpZiAoIWlzSW50ZXJyZXN0ZWRJblJlc291cmNlVXJpKHVyaSkpIHsKLQkJCQlnZXRLbm93blJlc291cmNlVXJpcygpLmFkZCh1cmkpOwotCQkJCS8vIFByb2Nlc3MgdGhlIHJlc291cmNlIGlmIGl0IGlzIGFscmVhZHkgbG9hZGVkLgotCQkJCXRyeSB7Ci0JCQkJCVJlc291cmNlIHJlcyA9IGdldEVtZkNvbnRleHQoKS5nZXRSZXNvdXJjZSh1cmkpOwotCQkJCQlpZiAocmVzICE9IG51bGwpCi0JCQkJCQlwcm9jZXNzUmVzb3VyY2UocmVzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBJZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBjYWNoZWQgUmVzb3VyY2Ugb3IgdHJ5IHRvIGxvYWQgdGhlIFJlc291cmNlIHByaW9yIHRvIGNyZWF0aW5nIGEgUmVzb3VyY2UuIFRoaXMgYXBpCi0JICogaGFuZGxlcyB0aGUgY2FzZSB0aGF0IHRoZSBSZXNvdXJjZSBtYXkgYmUgY3JlYXRlZCBkdXJpbmcgdGhlIGxvYWQuCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldE9yQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc0FzUmVhZEZvclVuS25vd25VUklzKCkgewotCQlyZXR1cm4gYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXM7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoaXMgYXBpIHRvIGluZGljYXRlIHRoYXQgeW91IHdhbnQgYWxsIHVua25vd24gUmVzb3VyY2VzIHRvIGJlIGFjY2Vzc2VkIGZvciBSZWFkT25seS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc0FzUmVhZEZvclVuS25vd25VUklzKGJvb2xlYW4gYikgewotCQlhY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyA9IGI7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpc1JlYWRPbmx5KCkpCi0JCQlidWZmZXIuYXBwZW5kKCIgUiA9ICIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIiBXID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRSZWdpc3RyeSgpLnNpemUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIltJRDogXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldEVkaXRNb2RlbElEKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcIiBLbm93biBSZXNvdXJjZXM6IFsiKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IHVyaXMgPSBnZXRLbm93blJlc291cmNlVXJpcygpOwotCQlpZiAodXJpcyAhPSBudWxsKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgKHVyaXMuc2l6ZSgpIC0gMSk7IGkrKykKLQkJCQlidWZmZXIuYXBwZW5kKHVyaXMuZ2V0KGkpICsgIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQodXJpcy5nZXQoaSkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZQotCQkJYnVmZmVyLmFwcGVuZCgibm9uZSIpOyAvLyROT04tTkxTLTEkCi0KLQotCQlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQlpZiAocmVmZXJlbmNlID09IG51bGwpCi0JCQlyZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlKCk7Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBDbGllbnRBY2Nlc3NSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyBjbGFzcyBSZWZlcmVuY2UgewotCi0JCXByb3RlY3RlZCBTdHJpbmcgdG9zdHJpbmcgPSBudWxsOwotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKHRvc3RyaW5nID09IG51bGwpIHsKLQkJCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigiRWRpdE1vZGVsLlJlZmVyZW5jZSBbIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKGdldEVkaXRNb2RlbElEKCkpOwotCQkJCXJlc3VsdC5hcHBlbmQoIn0geyIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCJ9XSIpOyAvLyROT04tTkxTLTEkCi0JCQkJdG9zdHJpbmcgPSByZXN1bHQudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXJldHVybiB0b3N0cmluZzsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIHRvU3RyaW5nKCkuaGFzaENvZGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIC0gYnkgZGVmYXVsdCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCByb290IG9iamVjdCBmcm9tIHRoZSBmaXJzdAotCSAqIHJlc291cmNlIHJlZmVyZW5jZWQgYnkgdGhlIGtub3duIHJlc291cmNlIFVSSXMgZm9yIHRoaXMgRWRpdE1vZGVsCi0JICogCi0JICogQHJldHVybiBhbiBFT2JqZWN0IG9yIE51bGwKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRQcmltYXJ5Um9vdE9iamVjdCgpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0UHJpbWFyeVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCB8fCByZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgLSBieSBkZWZhdWx0IHRoaXMgd2lsbCByZXR1cm4gdGhlIGZpcnN0IHJlc291cmNlIHJlZmVyZW5jZWQgYnkgdGhlCi0JICoga25vd24gcmVzb3VyY2UgVVJJcyBmb3IgdGhpcyBFZGl0TW9kZWwKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFByaW1hcnlSZXNvdXJjZSgpIHsKLQkJaWYgKGtub3duUmVzb3VyY2VVcmlzID09IG51bGwpCi0JCQlnZXRLbm93blJlc291cmNlVXJpcygpOwotCQlpZiAoa25vd25SZXNvdXJjZVVyaXMgPT0gbnVsbCB8fCBrbm93blJlc291cmNlVXJpcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlVUkkgdXJpID0gKFVSSSkga25vd25SZXNvdXJjZVVyaXMuZ2V0KDApOwotCQlyZXR1cm4gZ2V0UmVzb3VyY2UodXJpKTsKLQl9Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciNpZGVudGlmaWVyQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllckV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlkZW50aWZpZXJDaGFuZ2VkKEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgZXZ0KSB7Ci0JCWlmIChldnQuaGFzRW5hYmxlZENoYW5nZWQoKSkgewotCQkJRWRpdE1vZGVsRXZlbnQgZWRpdE1vZGVsRXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuS05PV05fUkVTT1VSQ0VTX0FCT1VUX1RPX0NIQU5HRSwgdGhpcyk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZWRpdE1vZGVsRXZlbnQpOwotCQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkID0gZXZ0LmdldElkZW50aWZpZXIoKTsKLQkJCWlmIChpZC5pc0VuYWJsZWQoKSkKLQkJCQlhZGRLbm93blJlc291cmNlcyhpZCk7Ci0JCQllbHNlCi0JCQkJcmVtb3ZlS25vd25SZXNvdXJjZXMoaWQpOwotCQkJZWRpdE1vZGVsRXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuS05PV05fUkVTT1VSQ0VTX0NIQU5HRUQsIHRoaXMpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGVkaXRNb2RlbEV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVLbm93blJlc291cmNlcyhJRW5hYmxlbWVudElkZW50aWZpZXIgaWQpIHsKLQkJTGlzdCBlZGl0TW9kZWxSZXNvdXJjZXMgPSBnZXRFZGl0TW9kZWxSZXNvdXJjZXMoaWQpOwotCQlFZGl0TW9kZWxSZXNvdXJjZSBlZGl0TW9kZWxSZXNvdXJjZSA9IG51bGw7Ci0JCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgZ2V0UmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0TW9kZWxSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWVkaXRNb2RlbFJlc291cmNlID0gKEVkaXRNb2RlbFJlc291cmNlKSBlZGl0TW9kZWxSZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKGVkaXRNb2RlbFJlc291cmNlLmlzQXV0b0xvYWQoKSAmJiBzeW5jICE9IG51bGwpIHsKLQkJCQlzeW5jLmRpc2FibGVBdXRvbG9hZChlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJcHJlbG9hZFJlc291cmNlVXJpcy5yZW1vdmUoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJfQotCQkJa25vd25SZXNvdXJjZVVyaXMucmVtb3ZlKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKLQkJCXJlbW92ZVJlc291cmNlKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKLQkJfQotCi0JfQotCi0KLQotCXByaXZhdGUgdm9pZCBhZGRLbm93blJlc291cmNlcyhJRW5hYmxlbWVudElkZW50aWZpZXIgaWQpIHsKLQkJTGlzdCBlZGl0TW9kZWxSZXNvdXJjZXMgPSBnZXRFZGl0TW9kZWxSZXNvdXJjZXMoaWQpOwotCQlFZGl0TW9kZWxSZXNvdXJjZSBlZGl0TW9kZWxSZXNvdXJjZSA9IG51bGw7Ci0JCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgZ2V0UmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0TW9kZWxSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWVkaXRNb2RlbFJlc291cmNlID0gKEVkaXRNb2RlbFJlc291cmNlKSBlZGl0TW9kZWxSZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKGVkaXRNb2RlbFJlc291cmNlLmlzQXV0b0xvYWQoKSAmJiBzeW5jICE9IG51bGwpIHsKLQkJCQlzeW5jLmVuYWJsZUF1dG9sb2FkKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKLQkJCQlwcmVsb2FkUmVzb3VyY2VVcmlzLmFkZChlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJZ2V0UmVzb3VyY2UoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJfQotCQkJa25vd25SZXNvdXJjZVVyaXMuYWRkKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKLQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmFtcy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFBhcmFtcygpIHsKLQkJcmV0dXJuIHBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1zIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbXMoTWFwIHBhcmFtcykgewotCQl0aGlzLnBhcmFtcyA9IHBhcmFtczsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIE5vdGlmeVJ1bm5lciBpbXBsZW1lbnRzIElTYWZlUnVubmFibGUgeyAKLQkJCi0JCXByaXZhdGUgZmluYWwgRWRpdE1vZGVsRXZlbnQgZXZlbnQ7Ci0JCXByaXZhdGUgRWRpdE1vZGVsTGlzdGVuZXIgbGlzdGVuZXI7Ci0JCQotCQlwdWJsaWMgTm90aWZ5UnVubmVyKEVkaXRNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGV2ZW50KTsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKEVkaXRNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeyAKLQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4uSUQsIDAsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCWlmKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJbGlzdGVuZXIuZWRpdE1vZGVsQ2hhbmdlZChldmVudCk7IAotCQl9Ci0JCQotCX07Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZWVkOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMi8wMSA4OjU3OjAwIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFZGl0TW9kZWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIHsKLQlwcm90ZWN0ZWQgRWRpdE1vZGVsQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsQ29tbWFuZChDb21tYW5kIHRhcmdldENvbW1hbmQpIHsKLQkJc3VwZXIodGFyZ2V0Q29tbWFuZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGdldFRhcmdldCgpLmNhblVuZG8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBleGVjdXRlSW5Nb2RlbChBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgY21kKTsKLQotCXB1YmxpYyBFZGl0TW9kZWxDb21tYW5kIGdldEVkaXRNb2RlbENvbW1hbmQoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKS5nZXRMYWJlbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGludmVydEFuZFB1c2goKSB7Ci0JCWV4ZWN1dGVJbk1vZGVsKHRoaXMuaW52ZXJ0ZWQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjBhODRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsRXZlbnQgewotCS8vVGhlc2UgYXJlIHRoZSBldmVudCBjb2Rlcy4KLQotCS8vIFVzZWQgd2hlbiB0aGUgZWRpdCBtb2RlbCBpcyBzYXZlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFID0gMTsKLQkvLyBVc2VkIHdoZW4gdGhlIGNvbW1hbmQgc3RhY2sgYmVjb21lcyBkaXJ0eS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJUWSA9IDI7Ci0JLy8gVXNlZCB3aGVuIGEgcmVmZXJlbmNlZCByZXNvdXJjZSBpcyByZW1vdmVkIGZyb20gdGhlIFJlc291cmNlU2V0LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRURfUkVTT1VSQ0UgPSAzOwotCS8vIFVzZWQgd2hlbiBhIHJlZmVyZW5jZWQgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlIFJlc291cmNlU2V0LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEX1JFU09VUkNFID0gNDsKLQkvLyBVc2VkIHdoZW4gdGhlIGVkaXQgbW9kZWwgaXMgZGlzcG9zZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfRElTUE9TRSA9IDU7Ci0JLy8gVXNlZCB3aGVuIGEgUmVzb3VyY2UgaXMgbG9hZGVkIG9yIHRoZSBmaXJzdCBvYmplY3QKLQkvLyBpcyBhZGRlZCB0byB0aGUgY29udGVudHMgd2hlbiBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURFRF9SRVNPVVJDRSA9IDY7Ci0JLy8gVXNlZCB3aGVuIGEgUmVzb3VyY2UgaXMgdW5sb2FkZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5MT0FERURfUkVTT1VSQ0UgPSA3OwotCS8vIEluZGljYXRlcyB0aGF0IHRoZSBsaXN0IG9mIGtub3duIHJlc291cmNlcyBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsIGlzIGFib3V0IHRvIGNoYW5nZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtOT1dOX1JFU09VUkNFU19BQk9VVF9UT19DSEFOR0UgPSA4OwotCS8vIEluZGljYXRlcyB0aGF0IHRoZSBsaXN0IG9mIGtub3duIHJlc291cmNlcyBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsIGhhcyBjaGFuZ2VkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS05PV05fUkVTT1VSQ0VTX0NIQU5HRUQgPSA5OwotCi0JcHJpdmF0ZSBpbnQgZXZlbnRDb2RlOwotCXByaXZhdGUgRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQlwcml2YXRlIExpc3QgY2hhbmdlZFJlc291cmNlczsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTIvMjAwMSAyOjQ2OjU5IFBNKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWxFdmVudChpbnQgYW5FdmVudENvZGUsIEVkaXRNb2RlbCBtb2RlbCkgewotCQlzZXRFdmVudENvZGUoYW5FdmVudENvZGUpOwotCQlzZXRFZGl0TW9kZWwobW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlnZXRDaGFuZ2VkUmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VzKENvbGxlY3Rpb24gc29tZVJlc291cmNlcykgewotCQlpZiAoc29tZVJlc291cmNlcyAhPSBudWxsKQotCQkJZ2V0Q2hhbmdlZFJlc291cmNlcygpLmFkZEFsbChzb21lUmVzb3VyY2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEyLzIwMDEgMjo0Njo0MyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjaGFuZ2VkUmVzb3VyY2VzID09IG51bGwpCi0JCQljaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMS8wMSA5OjAxOjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guRWRpdE1vZGVsCi0JICovCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWwoKSB7Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMi8yMDAxIDI6NDY6NDMgUE0pCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV2ZW50Q29kZSgpIHsKLQkJcmV0dXJuIGV2ZW50Q29kZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEyLzIwMDEgMjo0Njo0MyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q2hhbmdlZFJlc291cmNlcwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VkUmVzb3VyY2VzKGphdmEudXRpbC5MaXN0IG5ld0NoYW5nZWRSZXNvdXJjZXMpIHsKLQkJY2hhbmdlZFJlc291cmNlcyA9IG5ld0NoYW5nZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjEvMDEgOTowMTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RWRpdE1vZGVsCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5qMmVlLndvcmtiZW5jaC5FZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0TW9kZWwoRWRpdE1vZGVsIG5ld0VkaXRNb2RlbCkgewotCQllZGl0TW9kZWwgPSBuZXdFZGl0TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMi8yMDAxIDI6NDY6NDMgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V2ZW50Q29kZQotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXZlbnRDb2RlKGludCBuZXdFdmVudENvZGUpIHsKLQkJZXZlbnRDb2RlID0gbmV3RXZlbnRDb2RlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5N2JiZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotCi0gCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsRmFjdG9yeSBpbXBsZW1lbnRzIElFZGl0TW9kZWxGYWN0b3J5IHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5ID0gdHJ1ZTsKLQotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxJRCwgY29udGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsSUQsIGNvbnRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbmV3IEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgdHJ1ZSk7Ci0JCWVkaXRNb2RlbC5zZXRBY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyhsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KTsKLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKSB7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBuZXcgRWRpdE1vZGVsKGVkaXRNb2RlbElELCBjb250ZXh0LCBmYWxzZSk7Ci0JCWVkaXRNb2RlbC5zZXRBY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyhsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KTsKLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhY2hlSUQoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zKSB7Ci0JCXJldHVybiBlZGl0TW9kZWxJRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLklFZGl0TW9kZWxGYWN0b3J5I3NldExvYWRLbm93blJlc291cmNlc0FzUmVhZE9ubHkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5sb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5ID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGxvYWRLbm93blJlc291cmNlc0FzUmVhZE9ubHk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmZTllNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSA0OjQ1OjEzIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWRpdE1vZGVsTGlzdGVuZXIgewotCS8qKgotCSAqIEFuIGV2ZW50IG9jdXJyZWQgb24gdGhlIEoyRUVFZGl0TW9kZWwuCi0JICovCi0Jdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbE5hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MGE4ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFZGl0TW9kZWxOYXR1cmUgZXh0ZW5kcyBFTUZOYXR1cmUgewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRWRpdE1vZGVsTmF0dXJlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsS2V5LCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsS2V5LCBhY2Nlc3NvcktleSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsS2V5LCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbEtleSwgYWNjZXNzb3JLZXksIG51bGwpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsS2V5LCBPYmplY3QgYWNjZXNzb3JLZXksIE1hcCBwYXJhbXMpIHsKLQkJRWRpdE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChnZXRFbWZDb250ZXh0KCkgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGdldEVtZkNvbnRleHQoKS5nZXRFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbEtleSwgYWNjZXNzb3JLZXksIHBhcmFtcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsS2V5LCBPYmplY3QgYWNjZXNzb3JLZXksIE1hcCBwYXJhbXMpIHsKLQkJRWRpdE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChnZXRFbWZDb250ZXh0KCkgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGdldEVtZkNvbnRleHQoKS5nZXRFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxLZXksIGFjY2Vzc29yS2V5LCBwYXJhbXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0IGdldEVtZkNvbnRleHQoKSB7Ci0JCXJldHVybiAoRU1GV29ya2JlbmNoQ29udGV4dCkgZ2V0RW1mQ29udGV4dEJhc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0lFZGl0TW9kZWxGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9JRWRpdE1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzMyMDlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0lFZGl0TW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRNb2RlbEZhY3RvcnkgewotCi0JcHVibGljIGFic3RyYWN0IEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0KTsKLQotCXB1YmxpYyBhYnN0cmFjdCBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcyk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0KTsKLQotCXB1YmxpYyBhYnN0cmFjdCBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpOwotCi0JcHVibGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcyk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KGJvb2xlYW4gdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTG9vc2VDb21wb3NlZEVkaXRNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTG9vc2VDb21wb3NlZEVkaXRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWE1ZjgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0xvb3NlQ29tcG9zZWRFZGl0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIExvb3NlQ29tcG9zZWRFZGl0TW9kZWwgZXh0ZW5kcyBDb21wb3NlZEVkaXRNb2RlbCB7Ci0KLQlwdWJsaWMgTG9vc2VDb21wb3NlZEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihlZGl0TW9kZWxJRCwgY29udGV4dCk7Ci0KLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsLlJlZmVyZW5jZSBhZGRDaGlsZChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCWdldENoaWxkcmVuKCkuYWRkKGVkaXRNb2RlbCk7Ci0JCVJlZmVyZW5jZSByZWYgPSBlZGl0TW9kZWwuZ2V0UmVmZXJlbmNlKCk7Ci0JCWdldENoaWxkcmVuTWFwKCkucHV0KHJlZiwgZWRpdE1vZGVsKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCWdldENoaWxkcmVuKCkucmVtb3ZlKGVkaXRNb2RlbCk7Ci0JCWdldENoaWxkcmVuTWFwKCkucmVtb3ZlKGVkaXRNb2RlbC5nZXRSZWZlcmVuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGVsTW9kaWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGVsTW9kaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkODhlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RlbE1vZGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6NDA6MzUgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsTW9kaWZpZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfUEFUVEVSTiA9ICJTZXQgezB9IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfUEFUVEVSTiA9ICJBZGQgezB9IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfUEFUVEVSTiA9ICJSZW1vdmUgezB9IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTU1BTkRfTEFCRUwgPSAiQ29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQlwcml2YXRlIExpc3QgaGVscGVyczsKLQlwcml2YXRlIExpc3QgZXh0ZW5kZWRIZWxwZXJzOwotCXByb3RlY3RlZCBMaXN0IGFkZGl0aW9uYWxDb21tYW5kczsKLQlwcm90ZWN0ZWQgaW50IHN0YXR1czsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19WQUxVRV9DSEFOR0UgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0NIQU5HRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSAyOwotCi0JLyoqCi0JICogSjJFRU1vZGVsTW9kaWZpZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxNb2RpZmllcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFTW9kZWxNb2RpZmllciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhRG9tYWluCi0JICogICAgICAgICAgICBFZGl0aW5nRG9tYWluCi0JICovCi0JcHVibGljIE1vZGVsTW9kaWZpZXIoRWRpdGluZ0RvbWFpbiBhRG9tYWluKSB7Ci0JCXNldEVkaXRpbmdEb21haW4oYURvbWFpbik7Ci0JfQotCi0JLyoqCi0JICogQWRkCi0JICogCi0JICogQGFIZWxwZXIgdG8gdGhlIGxpc3Qgb2YgaGVscGVyIHRoYXQgd2lsbCBiZSBleGVjdXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIZWxwZXIoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoYUhlbHBlciAhPSBudWxsICYmICFnZXRIZWxwZXJzKCkuY29udGFpbnMoYUhlbHBlcikpCi0JCQlnZXRIZWxwZXJzKCkuYWRkKGFIZWxwZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEFkZGl0aW9uYWxDb21tYW5kKENvbW1hbmQgYUNvbW1hbmQpIHsKLQkJaWYgKGFDb21tYW5kICE9IG51bGwgJiYgIWdldEFkZGl0aW9uYWxDb21tYW5kcygpLmNvbnRhaW5zKGFDb21tYW5kKSkKLQkJCWFkZGl0aW9uYWxDb21tYW5kcy5hZGQoYUNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgbW9kaWZpZXIgY2FuIGNyZWF0ZSBhIGNvbW1hbmQgdGhhdCB3aWxsIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBnZXRFZGl0aW5nRG9tYWluKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGV4ZWN1dGVXaXRoU3RhdHVzKCkgewotCQl0cnkgewotCQkJZXhlY3V0ZSgpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfSBmaW5hbGx5IHsKLQkJCXN0YXR1cyA9IC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGlzIG1vZGlmaWVyIHVzaW5nIHRoZSByZWNvcmRpbmcgbWVjaGFuaXNtIG9mIHRoZSBTdHJ1Y3RlZFRleHRVbmRvTWFuYWdlci4gSWYgdGhpcwotCSAqIG1vZGlmaWVyIGNhbm5vdCByZWNvcmQsIHRyeSB0byBleGVjdXRlIHVzaW5nIHRoZSBDb21tYW5kU3RhY2sgKGlmIGl0IGNhbiBleGVjdXRlIGNvbW1hbmRzKS4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhlY3V0aW9uIHdhcyBhdHRlbXB0ZWQuCi0JICogCi0JICogQHNlZSBjYW5FeGVjdXRlQ29tbWFuZCgpCi0JICogQHNlZSBjYW5SZWNvcmQoKQotCSAqIEBzZWUgcnVuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJYWRkSGVscGVyKGFIZWxwZXIpOwotCQlyZXR1cm4gZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhpcyBtb2RpZmllciB1c2luZyB0aGUgcmVjb3JkaW5nIG1lY2hhbmlzbSBvZiB0aGUgU3RydWN0ZWRUZXh0VW5kb01hbmFnZXIuIElmIHRoaXMKLQkgKiBtb2RpZmllciBjYW5ub3QgcmVjb3JkLCB0cnkgdG8gZXhlY3V0ZSB1c2luZyB0aGUgQ29tbWFuZFN0YWNrIChpZiBpdCBjYW4gZXhlY3V0ZSBjb21tYW5kcykuCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGV4ZWN1dGlvbiB3YXMgYXR0ZW1wdGVkLgotCSAqIAotCSAqIEBzZWUgY2FuRXhlY3V0ZUNvbW1hbmQoKQotCSAqIEBzZWUgY2FuUmVjb3JkKCkKLQkgKiBAc2VlIHJ1bigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShMaXN0IHNvbWVIZWxwZXJzKSB7Ci0JCXNldEhlbHBlcnMoc29tZUhlbHBlcnMpOwotCQlyZXR1cm4gZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhpcyBtb2RpZmllciBieSBjcmVhdGluZyBhIENvbW1hbmQgdGhhdCBpcyBleGVjdXRlZCBvbiB0aGUgQ29tbWFuZFN0YWNrLiBJZiB0aGlzCi0JICogbW9kaWZpZXIgY2Fubm90IGV4ZWN1dGUgY29tbWFuZHMsIHRoZSBleGVjdXRpb24gd2lsbCBub3QgdGFrZSBwbGFjZS4gUmV0dXJuIHRydWUgaWYgdGhlCi0JICogZXhlY3V0aW9uIHdhcyBhdHRlbXB0ZWQuCi0JICogCi0JICogQHNlZSBjYW5FeGVjdXRlQ29tbWFuZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGNhbkV4ZWN1dGVDb21tYW5kKCkpIHsKLQkJCXRyeSB7Ci0JCQkJQ29tbWFuZCBjb21tYW5kID0gY3JlYXRlQ29tbWFuZCgpOwotCQkJCXJlc3VsdCA9IGNvbW1hbmQgIT0gbnVsbDsKLQkJCQlpZiAocmVzdWx0KSB7Ci0JCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlyZWxlYXNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzZXRTdGF0dXMoRVJST1IpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCWlmIChnZXRFZGl0aW5nRG9tYWluKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDI6NTM6MTcgUE0pCi0JICogCi0JICogQHJldHVybiBFZGl0aW5nRG9tYWluCi0JICovCi0JcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDg6NDY6MzUgQU0pCi0JICogCi0JICogQHJldHVybiBKMkVFTW9kaWZpZXJIZWxwZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIgZ2V0Rmlyc3RIZWxwZXIoKSB7Ci0JCWlmIChoZWxwZXJzICE9IG51bGwgJiYgZ2V0SGVscGVycygpLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKE1vZGlmaWVySGVscGVyKSBnZXRIZWxwZXJzKCkuZ2V0KDApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgODo0NjozNSBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEhlbHBlcnMoKSB7Ci0JCWlmIChoZWxwZXJzID09IG51bGwpCi0JCQloZWxwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gaGVscGVyczsKLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QWRkaXRpb25hbENvbW1hbmRzKCkgewotCQlpZiAoYWRkaXRpb25hbENvbW1hbmRzID09IG51bGwpCi0JCQlhZGRpdGlvbmFsQ29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBhZGRpdGlvbmFsQ29tbWFuZHM7Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSBhbGwgbW9kZWwgYXJ0aWZhY3RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoKSB7Ci0JCXNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0JCXNldEhlbHBlcnMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMjo1MzoxNyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RWRpdGluZ0RvbWFpbgotCSAqICAgICAgICAgICAgRWRpdGluZ0RvbWFpbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRpbmdEb21haW4oRWRpdGluZ0RvbWFpbiBuZXdFZGl0aW5nRG9tYWluKSB7Ci0JCWVkaXRpbmdEb21haW4gPSBuZXdFZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSA4OjQ2OjM1IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdIZWxwZXJzCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlbHBlcnMoamF2YS51dGlsLkxpc3QgbmV3SGVscGVycykgewotCQloZWxwZXJzID0gbmV3SGVscGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1c0NvZGUpIHsKLQkJaWYgKHN0YXR1c0NvZGUgPiBzdGF0dXMpCi0JCQlzdGF0dXMgPSBzdGF0dXNDb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBBZGRDb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSBhIENvbW1hbmRTdGFjay4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsdWUoYUhlbHBlcik7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0JCWlmICh2YWx1ZUNoYW5nZWQoYUhlbHBlci5nZXRPd25lcigpLCBhSGVscGVyLmdldEZlYXR1cmUoKSwgdmFsdWUsIGZhbHNlKSkgewotCQkJY29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGdldEVkaXRpbmdEb21haW4oKSwgYUhlbHBlci5nZXRPd25lcigpLCBhSGVscGVyLmdldEZlYXR1cmUoKSwgdmFsdWUpOwotCQkJKChBYnN0cmFjdENvbW1hbmQpIGNvbW1hbmQpLnNldExhYmVsKGNyZWF0ZUNvbW1hbmRMYWJlbChBRERfUEFUVEVSTiwgYUhlbHBlci5nZXRGZWF0dXJlKCkpKTsKLQkJCXNldFN0YXR1cyhWQUxVRV9DSEFOR0UpOwotCQl9IGVsc2UgewotCQkJc2V0U3RhdHVzKE5PX1ZBTFVFX0NIQU5HRSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suIFRoZSBkZWZhdWx0IGlzIHRvIHJldHVybiBudWxsLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKSB7Ci0JCUNvbW1hbmQgY2hhaW5lZENvbW1hbmQgPSBjcmVhdGVDb21tYW5kKG51bGwsIGdldEhlbHBlcnMoKSk7Ci0JCWlmIChudWxsID09IGNoYWluZWRDb21tYW5kICYmIGFkZGl0aW9uYWxDb21tYW5kcyAhPSBudWxsICYmIGFkZGl0aW9uYWxDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCXNldFN0YXR1cyhFUlJPUik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQljaGFpbmVkQ29tbWFuZCA9IGFwcGVuZEFkZGl0aW9uYWxDb21tYW5kcyhjaGFpbmVkQ29tbWFuZCk7Ci0JCXJldHVybiBjaGFpbmVkQ29tbWFuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbW1hbmQgY2hhaW5lZENvbW1hbmQsIExpc3QgaGVscGVyc0FyZykgewotCQlpZiAobnVsbCA9PSBleHRlbmRlZEhlbHBlcnMpIHsKLQkJCWV4dGVuZGVkSGVscGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCWlmICghaGVscGVyc0FyZy5pc0VtcHR5KCkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gaGVscGVyc0FyZy5pdGVyYXRvcigpOwotCQkJQ29tbWFuZCBuZXh0Q29tbWFuZCA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJbmV4dENvbW1hbmQgPSBjcmVhdGVDb21tYW5kKChNb2RpZmllckhlbHBlcikgaXQubmV4dCgpKTsKLQkJCQlpZiAoY2hhaW5lZENvbW1hbmQgPT0gbnVsbCkKLQkJCQkJY2hhaW5lZENvbW1hbmQgPSBuZXh0Q29tbWFuZDsKLQkJCQllbHNlIGlmIChuZXh0Q29tbWFuZCAhPSBudWxsKQotCQkJCQljaGFpbmVkQ29tbWFuZCA9IGNoYWluZWRDb21tYW5kLmNoYWluKG5leHRDb21tYW5kKTsKLQkJCX0KLQkJfQotCQlpZiAoIWV4dGVuZGVkSGVscGVycy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgY29weSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvcHkuYWRkQWxsKGV4dGVuZGVkSGVscGVycyk7Ci0JCQlleHRlbmRlZEhlbHBlcnMuY2xlYXIoKTsKLQkJCWNoYWluZWRDb21tYW5kID0gY3JlYXRlQ29tbWFuZChjaGFpbmVkQ29tbWFuZCwgY29weSk7Ci0JCX0KLQkJcmV0dXJuIGNoYWluZWRDb21tYW5kOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGFwcGVuZEFkZGl0aW9uYWxDb21tYW5kcyhDb21tYW5kIGNoYWluZWRDb21tYW5kKSB7Ci0JCWlmIChhZGRpdGlvbmFsQ29tbWFuZHMgIT0gbnVsbCAmJiAhYWRkaXRpb25hbENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJQ29tbWFuZCBjb21tYW5kOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsQ29tbWFuZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQljb21tYW5kID0gKENvbW1hbmQpIGFkZGl0aW9uYWxDb21tYW5kcy5nZXQoaSk7Ci0JCQkJaWYgKGNoYWluZWRDb21tYW5kID09IG51bGwpCi0JCQkJCWNoYWluZWRDb21tYW5kID0gY29tbWFuZDsKLQkJCQllbHNlCi0JCQkJCWNoYWluZWRDb21tYW5kID0gY2hhaW5lZENvbW1hbmQuY2hhaW4oY29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoYWluZWRDb21tYW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoYUhlbHBlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbW1hbmQgY29tbWFuZDEsIGNvbW1hbmQyOwotCQlNb2RpZmllckhlbHBlciBvd25lckhlbHBlciA9IGFIZWxwZXIuZ2V0T3duZXJIZWxwZXIoKTsKLQkJaWYgKGFIZWxwZXIuc2hvdWxkVW5zZXRWYWx1ZSgpICYmIG93bmVySGVscGVyICE9IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy93ZSBhcmUgdW5zZXR0aW5nIGEgdmFsdWUgb24gYW4gb3duZXIgdGhhdCBkb2VzIG5vdCBleGlzdCBzbyBkbyBub3QKLQkJLy8gY3JlYXRlIHRoZSBvd25lcgotCQljb21tYW5kMSA9IGNyZWF0ZUNvbW1hbmQob3duZXJIZWxwZXIpOwotCQljb21tYW5kMiA9IHByaW1DcmVhdGVDb21tYW5kKGFIZWxwZXIpOwotCi0JCWlmIChjb21tYW5kMSAhPSBudWxsKSB7Ci0JCQlpZiAoY29tbWFuZDIgPT0gbnVsbCkKLQkJCQljb21tYW5kMiA9IGNvbW1hbmQxOwotCQkJZWxzZQotCQkJCWNvbW1hbmQyID0gY29tbWFuZDIuY2hhaW4oY29tbWFuZDEpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUNvbW1hbmRMYWJlbChTdHJpbmcgYVBhdHRlcm4sIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCVN0cmluZyByZXBsYWNlbWVudCA9IGZlYXR1cmUgPT0gbnVsbCA/IERFRkFVTFRfQ09NTUFORF9MQUJFTCA6IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGFQYXR0ZXJuLCBuZXcgU3RyaW5nW117cmVwbGFjZW1lbnR9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBDb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSBhIENvbW1hbmRTdGFjay4gVGhlIGRlZmF1bHQgaXMgdG8gcmV0dXJuIG51bGwuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTWFueUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkpCi0JCQlyZXR1cm4gY3JlYXRlUmVtb3ZlQ29tbWFuZChhSGVscGVyKTsKLQkJcmV0dXJuIGNyZWF0ZUFkZENvbW1hbmQoYUhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlT2JqZWN0RnJvbUhlbHBlcihNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCXJldHVybiBhSGVscGVyLmNyZWF0ZU5ld09iamVjdEZyb21GZWF0dXJlKCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIFByb3h5V3JhcHBpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQkJcHJvdGVjdGVkIENvbW1hbmQgYmFzZUNvbW1hbmQgPSBudWxsOwotCQlwcm90ZWN0ZWQgRU9iamVjdCBlT2JqZWN0ID0gbnVsbDsKLQkJcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlwdWJsaWMgUHJveHlXcmFwcGluZ0NvbW1hbmQoQ29tbWFuZCBiYXNlQ29tbWFuZCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCQl0aGlzLmJhc2VDb21tYW5kID0gYmFzZUNvbW1hbmQ7Ci0JCQl0aGlzLmVPYmplY3QgPSBlT2JqZWN0OwotCQkJdGhpcy5yZXNvdXJjZSA9IGVPYmplY3QuZVJlc291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJcmV0dXJuIGJhc2VDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlFeHRlbmRlZEVjb3JlVXRpbC5iZWNvbWVQcm94eShlT2JqZWN0LCByZXNvdXJjZSk7Ci0JCQliYXNlQ29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQkJcmV0dXJuIGJhc2VDb21tYW5kLmNhblVuZG8oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQliYXNlQ29tbWFuZC51bmRvKCk7Ci0JCQlFeHRlbmRlZEVjb3JlVXRpbC5yZW1vdmVQcm94eShlT2JqZWN0LCByZXNvdXJjZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkJYmFzZUNvbW1hbmQucmVkbygpOwotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQkJcmV0dXJuIGJhc2VDb21tYW5kLmdldFJlc3VsdCgpOwotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQkJcmV0dXJuIGJhc2VDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5nZXRMYWJlbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5nZXREZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCWJhc2VDb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlbW92ZSBDb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSBhIENvbW1hbmRTdGFjay4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVSZW1vdmVDb21tYW5kKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsdWUoYUhlbHBlcik7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYUhlbHBlci5nZXRGZWF0dXJlKCk7Ci0JCWlmICh2YWx1ZUNoYW5nZWQoYUhlbHBlci5nZXRPd25lcigpLCBmZWF0dXJlLCB2YWx1ZSwgdHJ1ZSkpIHsKLQkJCWlmIChpc1ZhbHVlRXF1YWwoYUhlbHBlciwgdmFsdWUpKSB7Ci0JCQkJY29tbWFuZCA9IFJlbW92ZUNvbW1hbmQuY3JlYXRlKGdldEVkaXRpbmdEb21haW4oKSwgYUhlbHBlci5nZXRPd25lcigpLCBmZWF0dXJlLCAoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQljb21tYW5kID0gUmVtb3ZlQ29tbWFuZC5jcmVhdGUoZ2V0RWRpdGluZ0RvbWFpbigpLCBhSGVscGVyLmdldE93bmVyKCksIGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJCSgoQWJzdHJhY3RDb21tYW5kKSBjb21tYW5kKS5zZXRMYWJlbChjcmVhdGVDb21tYW5kTGFiZWwoUkVNT1ZFX1BBVFRFUk4sIGZlYXR1cmUpKTsKLQkJCXNldFN0YXR1cyhWQUxVRV9DSEFOR0UpOwotCQl9IGVsc2UgewotCQkJc2V0U3RhdHVzKE5PX1ZBTFVFX0NIQU5HRSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsdWVFcXVhbChNb2RpZmllckhlbHBlciBhSGVscGVyLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGFIZWxwZXIuZ2V0T3duZXIoKS5lR2V0KGFIZWxwZXIuZ2V0RmVhdHVyZSgpKSA9PSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBTZXRDb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSBhIENvbW1hbmRTdGFjay4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVTaW5nbGVDb21tYW5kKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsdWUoYUhlbHBlcik7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0JCWlmICh2YWx1ZUNoYW5nZWQoYUhlbHBlci5nZXRPd25lcigpLCBhSGVscGVyLmdldEZlYXR1cmUoKSwgdmFsdWUsIGFIZWxwZXIuc2hvdWxkVW5zZXRWYWx1ZSgpKSkgewotCQkJY29tbWFuZCA9IFNldENvbW1hbmQuY3JlYXRlKGdldEVkaXRpbmdEb21haW4oKSwgYUhlbHBlci5nZXRPd25lcigpLCBhSGVscGVyLmdldEZlYXR1cmUoKSwgdmFsdWUpOwotCQkJKChBYnN0cmFjdENvbW1hbmQpIGNvbW1hbmQpLnNldExhYmVsKGNyZWF0ZUNvbW1hbmRMYWJlbChTRVRfUEFUVEVSTiwgYUhlbHBlci5nZXRGZWF0dXJlKCkpKTsKLQkJCXNldFN0YXR1cyhWQUxVRV9DSEFOR0UpOwotCQl9IGVsc2UgewotCQkJc2V0U3RhdHVzKE5PX1ZBTFVFX0NIQU5HRSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWx1ZUZyb21IZWxwZXIoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlFT2JqZWN0IG5ld09iamVjdCA9IGNyZWF0ZU9iamVjdEZyb21IZWxwZXIoYUhlbHBlcik7Ci0JCXNldE5ld09iamVjdEF0dHJpYnV0ZXMobmV3T2JqZWN0LCBhSGVscGVyKTsKLQkJcmV0dXJuIG5ld09iamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnVtVmFsdWVDaGFuZ2VkKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoIWFuT2JqZWN0LmVJc1NldChhRmVhdHVyZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJRW51bWVyYXRvciBleGlzdGluZ0VudW1lcmF0b3IgPSAoRW51bWVyYXRvcikgYW5PYmplY3QuZUdldChhRmVhdHVyZSk7Ci0JCUVudW1lcmF0b3IgbmV3RW51bWVyYXRvciA9IGdldEVudW1lcmF0b3IoYUZlYXR1cmUsIGFWYWx1ZSk7Ci0JCXJldHVybiBleGlzdGluZ0VudW1lcmF0b3IgIT0gbmV3RW51bWVyYXRvcjsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0b3IgZ2V0RW51bWVyYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEVudW1lcmF0b3IpCi0JCQlyZXR1cm4gKEVudW1lcmF0b3IpIGFWYWx1ZTsKLQkJRUVudW0gYW5FbnVtID0gKEVFbnVtKSBhRmVhdHVyZS5nZXRFVHlwZSgpOwotCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9IG51bGw7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlsaXRlcmFsID0gYW5FbnVtLmdldEVFbnVtTGl0ZXJhbCgoU3RyaW5nKSBhVmFsdWUpOwotCQllbHNlIGlmIChhVmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJbGl0ZXJhbCA9IGFuRW51bS5nZXRFRW51bUxpdGVyYWwoKChJbnRlZ2VyKSBhVmFsdWUpLmludFZhbHVlKCkpOwotCQlpZiAobGl0ZXJhbCAhPSBudWxsKQotCQkJcmV0dXJuIGxpdGVyYWwuZ2V0SW5zdGFuY2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZShNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCWlmIChhSGVscGVyLm11c3RDcmVhdGVWYWx1ZSgpKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBjcmVhdGVWYWx1ZUZyb21IZWxwZXIoYUhlbHBlcik7Ci0JCQlhSGVscGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gYUhlbHBlci5nZXRWYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hbnlWYWx1ZUNoYW5nZWQoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlLCBib29sZWFuIGlzVW5zZXQpIHsKLQkJTGlzdCBsaXN0ID0gKExpc3QpIGFuT2JqZWN0LmVHZXQoYUZlYXR1cmUpOwotCQlpZiAoaXNVbnNldCkKLQkJCXJldHVybiBsaXN0LmNvbnRhaW5zKGFWYWx1ZSkgfHwgKGxpc3QgPT0gYVZhbHVlICYmICFsaXN0LmlzRW1wdHkoKSk7Ci0JCXJldHVybiAhbGlzdC5jb250YWlucyhhVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLiBUaGUgZGVmYXVsdCBpcyB0byByZXR1cm4gbnVsbC4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBwcmltQ3JlYXRlQ29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IGRvQ3JlYXRlQ29tbWFuZChhSGVscGVyKTsKLQkJaWYgKGFIZWxwZXIuc2hvdWxkVW5zZXRWYWx1ZSgpKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBhSGVscGVyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0ICYmICEoKEVPYmplY3QpIHZhbHVlKS5lSXNQcm94eSgpKSB7Ci0JCQkJY29tbWFuZCA9IG5ldyBQcm94eVdyYXBwaW5nQ29tbWFuZChjb21tYW5kLCAoRU9iamVjdCkgdmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGRvQ3JlYXRlQ29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCWlmICghYUhlbHBlci5pc0NvbXBsZXRlKCkpIHsKLQkJCXNldFN0YXR1cyhFUlJPUik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCQlpZiAoYUhlbHBlci5nZXRGZWF0dXJlKCkuaXNNYW55KCkpCi0JCQljb21tYW5kID0gY3JlYXRlTWFueUNvbW1hbmQoYUhlbHBlcik7Ci0JCWVsc2UKLQkJCWNvbW1hbmQgPSBjcmVhdGVTaW5nbGVDb21tYW5kKGFIZWxwZXIpOwotCi0JCWlmIChudWxsICE9IGNvbW1hbmQpIHsKLQkJCUxpc3QgbG9jYWxIZWxwZXJzID0gTW9kaWZpZXJIZWxwZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEhlbHBlcnMoYUhlbHBlcik7Ci0JCQlpZiAobnVsbCAhPSBsb2NhbEhlbHBlcnMpIHsKLQkJCQlleHRlbmRlZEhlbHBlcnMuYWRkQWxsKGxvY2FsSGVscGVycyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSdW4gdXNpbmcKLQkgKiAKLQkgKiBAYUhlbHBlci4gVGhpcyB3aWxsIHNldCBhIE1PRiBhdHRpYnV0ZSB2YWx1ZSB0byB0aGUgb3duZXIgb2YgdGhlIGhlbHBlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJaWYgKGFIZWxwZXIuaXNDb21wbGV0ZSgpKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZShhSGVscGVyKTsKLQkJCWlmICh2YWx1ZUNoYW5nZWQoYUhlbHBlci5nZXRPd25lcigpLCBhSGVscGVyLmdldEZlYXR1cmUoKSwgdmFsdWUsIGFIZWxwZXIuc2hvdWxkVW5zZXRWYWx1ZSgpKSkKLQkJCQlzZXRPYmplY3RBdHRyaWJ1dGUoYUhlbHBlci5nZXRPd25lcigpLCBhSGVscGVyLmdldEZlYXR1cmUoKSwgdmFsdWUsIGFIZWxwZXIuc2hvdWxkVW5zZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgYXJlIHVzaW5nCi0JICogcmVjb3JkYWJsZSBjb21tYW5kcy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCB1cGRhdGUgdGhlIE1PRiBtb2RlbCBkaXJlY3RseS4KLQkgKiBBbnkgbW9kaWZpY2F0aW9uIHdpbGwgYmUgcmVjb3JkZWQuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoIWdldEhlbHBlcnMoKS5pc0VtcHR5KCkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gZ2V0SGVscGVycygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKQotCQkJCXJ1bigoTW9kaWZpZXJIZWxwZXIpIGl0Lm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSdW4gdXNpbmcKLQkgKiAKLQkgKiBAYUhlbHBlcidzIG93bmVySGVscGVyIGZpcnN0IGJlZm9yZSBydW5uaW5nIHdpdGgKLQkgKiBAYUhlbHBlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW4oTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoYUhlbHBlciAhPSBudWxsKSB7Ci0JCQlydW4oYUhlbHBlci5nZXRPd25lckhlbHBlcigpKTsKLQkJCXByaW1SdW4oYUhlbHBlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROZXdPYmplY3RBdHRyaWJ1dGVzKEVPYmplY3QgYW5PYmplY3QsIE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJSGFzaE1hcCBhdHRyaWJ1dGVzID0gYUhlbHBlci5nZXRBdHRyaWJ1dGVzKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCXZhbHVlID0gYXR0cmlidXRlcy5nZXQoZmVhdHVyZSk7Ci0JCQlzZXRPYmplY3RBdHRyaWJ1dGUoYW5PYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RBdHRyaWJ1dGUoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlLCBib29sZWFuIHNob3VsZFVuc2V0VmFsdWUpIHsKLQkJaWYgKGFGZWF0dXJlLmlzTWFueSgpKQotCQkJc2V0T2JqZWN0TWFueUF0dHJpYnV0ZShhbk9iamVjdCwgYUZlYXR1cmUsIGFWYWx1ZSwgc2hvdWxkVW5zZXRWYWx1ZSk7Ci0JCWVsc2UKLQkJCXNldE9iamVjdFNpbmdsZUF0dHJpYnV0ZShhbk9iamVjdCwgYUZlYXR1cmUsIGFWYWx1ZSwgc2hvdWxkVW5zZXRWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0RW51bUF0dHJpYnV0ZShFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUpIHsKLQkJRW51bWVyYXRvciBlbnVtZXJhdG9yID0gZ2V0RW51bWVyYXRvcihhRmVhdHVyZSwgYVZhbHVlKTsKLQkJYW5PYmplY3QuZVNldChhRmVhdHVyZSwgZW51bWVyYXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0TWFueUF0dHJpYnV0ZShFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gc2hvdWxkVW5zZXRWYWx1ZSkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgYW5PYmplY3QuZUdldChhRmVhdHVyZSk7Ci0JCWlmIChzaG91bGRVbnNldFZhbHVlKQotCQkJbGlzdC5yZW1vdmUoYVZhbHVlKTsKLQkJZWxzZQotCQkJbGlzdC5hZGQoYVZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RTaW5nbGVBdHRyaWJ1dGUoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlLCBib29sZWFuIHNob3VsZFVuc2V0VmFsdWUpIHsKLQkJaWYgKHNob3VsZFVuc2V0VmFsdWUpCi0JCQlhbk9iamVjdC5lVW5zZXQoYUZlYXR1cmUpOwotCQllbHNlIGlmIChhRmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUVudW0pCi0JCQlzZXRPYmplY3RFbnVtQXR0cmlidXRlKGFuT2JqZWN0LCBhRmVhdHVyZSwgYVZhbHVlKTsKLQkJZWxzZQotCQkJYW5PYmplY3QuZVNldChhRmVhdHVyZSwgYVZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaW5nbGVWYWx1ZUNoYW5nZWQoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlLCBib29sZWFuIGlzVW5zZXQpIHsKLQkJaWYgKGFGZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFRW51bSkKLQkJCXJldHVybiBlbnVtVmFsdWVDaGFuZ2VkKGFuT2JqZWN0LCBhRmVhdHVyZSwgYVZhbHVlKTsKLQotCQlPYmplY3QgZXhpc3RpbmdWYWx1ZSA9IGFuT2JqZWN0LmVHZXQoYUZlYXR1cmUpOwotCQlpZiAoZXhpc3RpbmdWYWx1ZSA9PSBudWxsICYmIGFWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZXhpc3RpbmdWYWx1ZSAhPSBudWxsICYmICFleGlzdGluZ1ZhbHVlLmVxdWFscyhhVmFsdWUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChhVmFsdWUgIT0gbnVsbCAmJiAhYVZhbHVlLmVxdWFscyhleGlzdGluZ1ZhbHVlKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWVDaGFuZ2VkKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBpc1Vuc2V0KSB7Ci0JCWlmIChhRmVhdHVyZS5pc01hbnkoKSkKLQkJCXJldHVybiBtYW55VmFsdWVDaGFuZ2VkKGFuT2JqZWN0LCBhRmVhdHVyZSwgYVZhbHVlLCBpc1Vuc2V0KTsKLQkJcmV0dXJuIHNpbmdsZVZhbHVlQ2hhbmdlZChhbk9iamVjdCwgYUZlYXR1cmUsIGFWYWx1ZSwgaXNVbnNldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTQ5YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkZlYXR1cmVWYWx1ZUNvbnZlcnRlcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyMzozNiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTW9kaWZpZXJIZWxwZXIgewotCi0JcHJpdmF0ZSBFT2JqZWN0IG93bmVyOwotCXByaXZhdGUgTW9kaWZpZXJIZWxwZXIgb3duZXJIZWxwZXI7Ci0JcHJpdmF0ZSBPd25lclByb3ZpZGVyIG93bmVyUHJvdmlkZXI7Ci0JcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQlwcml2YXRlIEhhc2hNYXAgYXR0cmlidXRlczsKLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVW5zZXRWYWx1ZSA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlWFNJVHlwZU5hbWU7Ci0JcHJpdmF0ZSBGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgZmVhdHVyZVZhbHVlQ29udmVydGVyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NFVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1VOU0VUID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQk9USCA9IDI7Ci0KLQkvKioKLQkgKiBKMkVFTW9kaWZpZXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRU1vZGlmaWVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vZGlmaWVySGVscGVyKEVPYmplY3QgYW5Pd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCXNldE93bmVyKGFuT3duZXIpOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQkJc2V0VmFsdWUoYVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFTW9kaWZpZXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIoTW9kaWZpZXJIZWxwZXIgYW5Pd25lckhlbHBlciwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCXNldE93bmVySGVscGVyKGFuT3duZXJIZWxwZXIpOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQkJc2V0VmFsdWUoYVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFTW9kaWZpZXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIoT3duZXJQcm92aWRlciBhbk93bmVyUHJvdmlkZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgewotCQlzZXRPd25lclByb3ZpZGVyKGFuT3duZXJQcm92aWRlcik7Ci0JCXNldEZlYXR1cmUoYUZlYXR1cmUpOwotCQlzZXRWYWx1ZShhVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuSGFzaE1hcAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFGZWF0dXJlICE9IG51bGwgJiYgYVZhbHVlICE9IG51bGwpCi0JCQlnZXRBdHRyaWJ1dGVzKCkucHV0KGFGZWF0dXJlLCBhVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VmFsdWUoamF2YS5sYW5nLk9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gZ2V0RmVhdHVyZVZhbHVlQ29udmVydGVyKCkuY29udmVydFZhbHVlKG5ld1ZhbHVlLCBnZXRGZWF0dXJlKCkpOwotCX0KLQotCS8vQ2FsbGluZyB0aGlzIHdpbGwgY2F1c2UgdGhlIHZhbHVlIHRvIGJlIHJlbW92ZWQgb3IgdW5zZXQgZnJvbSB0aGUgb3duZXIuCi0JcHVibGljIHZvaWQgZG9VbnNldFZhbHVlKCkgewotCQlzaG91bGRVbnNldFZhbHVlID0gdHJ1ZTsKLQkJaWYgKHZhbHVlICE9IFNldENvbW1hbmQuVU5TRVRfVkFMVUUgJiYgZmVhdHVyZSAhPSBudWxsICYmICFmZWF0dXJlLmlzTWFueSgpKQotCQkJcHJpbVNldFZhbHVlKFNldENvbW1hbmQuVU5TRVRfVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuSGFzaE1hcAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuSGFzaE1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3RvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBFUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gKChFQ2xhc3NJbXBsKSBnZXRGZWF0dXJlVHlwZSgpKS5nZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRGZWF0dXJlVHlwZSgpIHsKLQkJcmV0dXJuIGdldEZlYXR1cmUoKS5nZXRFVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvMTAvMjAwMSA0OjUxOjU4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS5jb21tYW5kcy5GZWF0dXJlVmFsdWVDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVZhbHVlQ29udmVydGVyIGdldEZlYXR1cmVWYWx1ZUNvbnZlcnRlcigpIHsKLQkJaWYgKGZlYXR1cmVWYWx1ZUNvbnZlcnRlciA9PSBudWxsKQotCQkJZmVhdHVyZVZhbHVlQ29udmVydGVyID0gRmVhdHVyZVZhbHVlQ29udmVydGVyLkRFRkFVTFQ7Ci0JCXJldHVybiBmZWF0dXJlVmFsdWVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3VmFsdWVUeXBlTmFtZSgpIHsKLQkJaWYgKGdldFZhbHVlWFNJVHlwZU5hbWUoKSAhPSBudWxsICYmIGdldFZhbHVlWFNJVHlwZU5hbWUoKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gZ2V0VmFsdWVYU0lUeXBlTmFtZSgpOwotCQlyZXR1cm4gKCgoRUNsYXNzKSBnZXRGZWF0dXJlVHlwZSgpKS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBnZXRPd25lcigpIHsKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCU93bmVyUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRPd25lclByb3ZpZGVyKCk7Ci0JCQlFT2JqZWN0IHByb3ZpZGVyT3duZXIgPSBudWxsOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpCi0JCQkJcHJvdmlkZXJPd25lciA9IHByb3ZpZGVyLmdldE93bmVyKCk7Ci0JCQlpZiAocHJvdmlkZXJPd25lciA9PSBudWxsICYmIGdldE93bmVySGVscGVyKCkgIT0gbnVsbCkKLQkJCQlwcm92aWRlck93bmVyID0gKEVPYmplY3QpIGdldE93bmVySGVscGVyKCkuZ2V0VmFsdWUoKTsKLQkJCXJldHVybiBwcm92aWRlck93bmVyOwotCQl9Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzgvMjAwMSAyOjQ3OjU0IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS5jb21tYW5kcy5KMkVFTW9kaWZpZXJIZWxwZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIgZ2V0T3duZXJIZWxwZXIoKSB7Ci0JCWlmIChvd25lckhlbHBlciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0T3duZXJQcm92aWRlcigpICE9IG51bGwgJiYgZ2V0T3duZXJQcm92aWRlcigpLmdldE93bmVyKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZ2V0T3duZXJQcm92aWRlcigpLmdldE93bmVySGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG93bmVySGVscGVyOwotCX0KLQotCXB1YmxpYyBNb2RpZmllckhlbHBlciBwcmltR2V0T3duZXJIZWxwZXIoKSB7Ci0JCXJldHVybiBvd25lckhlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzE4LzIwMDEgMTozMToxNCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUudWkuSjJFRU93bmVyUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgT3duZXJQcm92aWRlciBnZXRPd25lclByb3ZpZGVyKCkgewotCQlyZXR1cm4gb3duZXJQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDM6Mzk6MzEgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWVYU0lUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHZhbHVlWFNJVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0IGNhbGxlZCBmcm9tIHRoZSBKMkVFTW9kZWxNb2RpZmllciBiZWZvcmUgZXhlY3V0aW5nIHNvIGl0IGlzIG5vdAotCSAqIG5lY2Vzc2FyeSB0byBjYWxsIGl0IGRpcmVjdGx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaWYgKGdldE93bmVySGVscGVyKCkgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGdldE93bmVySGVscGVyKCkuaXNDb21wbGV0ZSgpOwotCQlpZiAoIW11c3RDcmVhdGVWYWx1ZSgpKQotCQkJcmVzdWx0ID0gZ2V0VmFsdWUoKSAhPSBudWxsIHx8IHNob3VsZFVuc2V0VmFsdWUoKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gZ2V0RmVhdHVyZVR5cGUoKSAhPSBudWxsOwotCQlyZXR1cm4gcmVzdWx0ICYmIGdldEZlYXR1cmUoKSAhPSBudWxsICYmIChnZXRPd25lcigpICE9IG51bGwgfHwgZ2V0T3duZXJIZWxwZXIoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtdXN0Q3JlYXRlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZSgpID09IG51bGwgJiYgZ2V0RmVhdHVyZSgpICE9IG51bGwgJiYgIXNob3VsZFVuc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1TZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmVhdHVyZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBuZXdGZWF0dXJlKSB7Ci0JCWZlYXR1cmUgPSBuZXdGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvMTAvMjAwMSA0OjUxOjU4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdGZWF0dXJlVmFsdWVDb252ZXJ0ZXIKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbWFuZHMuRmVhdHVyZVZhbHVlQ29udmVydGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVZhbHVlQ29udmVydGVyKEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBuZXdGZWF0dXJlVmFsdWVDb252ZXJ0ZXIpIHsKLQkJZmVhdHVyZVZhbHVlQ29udmVydGVyID0gbmV3RmVhdHVyZVZhbHVlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld093bmVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE93bmVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IG5ld093bmVyKSB7Ci0JCW93bmVyID0gbmV3T3duZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC84LzIwMDEgMjo0Nzo1NCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T3duZXJIZWxwZXIKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbWFuZHMuSjJFRU1vZGlmaWVySGVscGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3duZXJIZWxwZXIoTW9kaWZpZXJIZWxwZXIgbmV3T3duZXJIZWxwZXIpIHsKLQkJb3duZXJIZWxwZXIgPSBuZXdPd25lckhlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzE4LzIwMDEgMTozMToxNCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T3duZXJQcm92aWRlcgotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuajJlZS51aS5KMkVFT3duZXJQcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE93bmVyUHJvdmlkZXIoT3duZXJQcm92aWRlciBuZXdPd25lclByb3ZpZGVyKSB7Ci0JCW93bmVyUHJvdmlkZXIgPSBuZXdPd25lclByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCBuZXdWYWx1ZSkgewotCQl0cnkgewotCQkJcHJpbVNldFZhbHVlKGNvbnZlcnRWYWx1ZShuZXdWYWx1ZSkpOwotCQl9IGNhdGNoIChGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGZlYXR1cmVFeGNlcHRpb24pIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihmZWF0dXJlRXhjZXB0aW9uKTsKLQkJCXByaW1TZXRWYWx1ZShudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRyZWF0IGFuIGVtcHR5IFN0cmluZyBhcyBhIG51bGwgdmFsdWUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlRnJvbVdpZGdldChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJT2JqZWN0IGRhdGEgPSBuZXdWYWx1ZTsKLQkJaWYgKG5ld1ZhbHVlICE9IG51bGwgJiYgbmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLQkJCWRhdGEgPSBudWxsOwotCQlzZXRWYWx1ZShkYXRhKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRvVW5zZXRWYWx1ZSgpOwotCQllbHNlCi0JCQlzaG91bGRVbnNldFZhbHVlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDM6Mzk6MzEgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlWFNJVHlwZU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVhTSVR5cGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3VmFsdWVYU0lUeXBlTmFtZSkgewotCQl2YWx1ZVhTSVR5cGVOYW1lID0gbmV3VmFsdWVYU0lUeXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVbnNldFZhbHVlKCkgewotCQlyZXR1cm4gc2hvdWxkVW5zZXRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVOZXdPYmplY3RGcm9tRmVhdHVyZSgpIHsKLQkJRUNsYXNzIG1ldGFDbGFzcyA9IChFQ2xhc3MpIGdldFBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcihnZXROZXdWYWx1ZVR5cGVOYW1lKCkpOwotCQlyZXR1cm4gZ2V0RmFjdG9yeSgpLmNyZWF0ZShtZXRhQ2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyQ2hhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXJDaGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNjE0OGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXJDaGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIE1vZGlmaWVySGVscGVyQ2hhaW5lciB7Ci0KLQlNb2RpZmllckhlbHBlciBoZWxwZXI7Ci0KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXJDaGFpbmVyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFT2JqZWN0IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaGVscGVyID0gbmV3IE1vZGlmaWVySGVscGVyKCk7Ci0KLQkJaWYgKG93bmVyICE9IG51bGwpCi0JCQloZWxwZXIuc2V0T3duZXIob3duZXIpOwotCi0JCWhlbHBlci5zZXRGZWF0dXJlKGZlYXR1cmUpOwotCi0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJaGVscGVyLnNldFZhbHVlKHZhbHVlKTsKLQotCX0KLQotCXB1YmxpYyBNb2RpZmllckhlbHBlciBnZXRIZWxwZXIoKSB7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJCYXNlZE9uVHlwZShPYmplY3Qgb3duZXIpIHsKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCWhlbHBlci5zZXRPd25lcigoRU9iamVjdCkgb3duZXIpOwotCQllbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIE1vZGlmaWVySGVscGVyKQotCQkJaGVscGVyLnNldE93bmVySGVscGVyKChNb2RpZmllckhlbHBlcikgb3duZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQxYTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjcsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RpZmllckhlbHBlckZhY3RvcnkgewotCi0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZUhlbHBlcgotCSAqIEBwYXJhbSBhY3Rpb25GbGFnCi0JICogQHJldHVybgotCSAqLwotCU1vZGlmaWVySGVscGVyIGdldEhlbHBlcihNb2RpZmllckhlbHBlciBiYXNlSGVscGVyLCBpbnQgYWN0aW9uRmxhZyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXJSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWRhOGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDI3LCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLQotICogSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogIAotICovCi1wdWJsaWMgY2xhc3MgTW9kaWZpZXJIZWxwZXJSZWdpc3RyeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UID0gIk1vZGlmaWVySGVscGVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRSA9ICJwYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFID0gImZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQUNUSU9OID0gImFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9BQ1RJT05fU0VUID0gInNldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9BQ1RJT05fVU5TRVQgPSAidW5zZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQUNUSU9OX0JPVEggPSAiYm90aCI7IC8vZGVmYXVsdCAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgTW9kaWZpZXJIZWxwZXJSZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7Ci0JLy8gSGFzaHRhYmxlIG1hcHBpbmcgZmVhdHVyZXMgdG8gYSBsaXN0IG9mIEZhY3RvcnlIb2xkZXJzCi0JcHJpdmF0ZSBIYXNodGFibGUgZmVhdHVyZUhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBIYXNodGFibGUgZmFjdG9yeUhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIGNsYXNzIEZhY3RvcnlIb2xkZXIgewotCQlwcml2YXRlIGludCBhY3Rpb25UeXBlOwotCQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JCXB1YmxpYyBGYWN0b3J5SG9sZGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBpbnQgYWN0aW9uVHlwZSkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJCXRoaXMuYWN0aW9uVHlwZSA9IGFjdGlvblR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgTW9kaWZpZXJIZWxwZXJGYWN0b3J5IGdldEZhY3RvcnkoaW50IGFjdGlvblR5cGVBcmcpIHsKLQkJCWlmICh0aGlzLmFjdGlvblR5cGUgPT0gYWN0aW9uVHlwZUFyZyB8fCB0aGlzLmFjdGlvblR5cGUgPT0gTW9kaWZpZXJIZWxwZXIuQUNUSU9OX0JPVEgpIHsKLQkJCQlTdHJpbmcgaGFzaEtleSA9IGdldEZhY3RvcnlIYXNoKGVsZW1lbnQpOwotCQkJCU1vZGlmaWVySGVscGVyRmFjdG9yeSBmYWN0b3J5ID0gKE1vZGlmaWVySGVscGVyRmFjdG9yeSkgZmFjdG9yeUhhc2guZ2V0KGhhc2hLZXkpOwotCQkJCWlmIChudWxsID09IGZhY3RvcnkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZhY3RvcnkgPSAoTW9kaWZpZXJIZWxwZXJGYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oRkFDVE9SWV9DTEFTUyk7Ci0JCQkJCQlmYWN0b3J5SGFzaC5wdXQoaGFzaEtleSwgZmFjdG9yeSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWN0b3J5OwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHN1cGVyLmVxdWFscyhvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlGYWN0b3J5SG9sZGVyIGhvbGRlciA9IChGYWN0b3J5SG9sZGVyKSBvYmo7Ci0JCQlyZXR1cm4gZ2V0RmFjdG9yeUhhc2goZWxlbWVudCkuZXF1YWxzKGdldEZhY3RvcnlIYXNoKGhvbGRlci5lbGVtZW50KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWVySGVscGVyUmVnaXN0cnkoKSB7Ci0JCXJlYWRFeHRlbnNpb25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRFeHRlbnNpb25zKCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UKTsKLQkJaWYgKHBvaW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlYWRGYWN0b3J5KGVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRmFjdG9yeShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZmFjdG9yeUNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEZBQ1RPUllfQ0xBU1MpOwotCQlpZiAobnVsbCA9PSBmYWN0b3J5Q2xhc3NOYW1lKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiTm8gIiArIEZBQ1RPUllfQ0xBU1MgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHBhY2thZ2VzID0gZWxlbWVudC5nZXRDaGlsZHJlbihQQUNLQUdFKTsKLQkJaWYgKHBhY2thZ2VzLmxlbmd0aCA9PSAwKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiTm8gIiArIFBBQ0tBR0UgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcGFja2FnZXMubGVuZ3RoOyBqKyspIHsKLQkJCXJlYWRQYWNrYWdlKGVsZW1lbnQsIHBhY2thZ2VzW2pdKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkUGFja2FnZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZmFjdG9yeUVsZW1lbnQsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBwYWNrYWdlVVJJID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUEFDS0FHRV9VUkkpOwotCQlpZiAobnVsbCA9PSBwYWNrYWdlVVJJKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiTm8gIiArIFBBQ0tBR0VfVVJJICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybjsKLQkJfQotCQlFUGFja2FnZSBlUGFja2FnZSA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKHBhY2thZ2VVUkkpOwotCQlpZiAobnVsbCA9PSBlUGFja2FnZSkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgUEFDS0FHRSArICIgIiArIHBhY2thZ2VVUkkgKyAiIGNhbiBub3QgYmUgZm91bmQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuOwotCQl9Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHR5cGVzID0gZWxlbWVudC5nZXRDaGlsZHJlbihUWVBFKTsKLQkJaWYgKHR5cGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiTm8gIiArIFRZUEUgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlYWRUeXBlKGZhY3RvcnlFbGVtZW50LCBlUGFja2FnZSwgdHlwZXNbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRUeXBlKElDb25maWd1cmF0aW9uRWxlbWVudCBmYWN0b3J5RWxlbWVudCwgRVBhY2thZ2UgZVBhY2thZ2UsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKE5BTUUpOwotCQlpZiAobnVsbCA9PSB0eXBlTmFtZSkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBOQU1FICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybjsKLQkJfQotCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IGVQYWNrYWdlLmdldEVDbGFzc2lmaWVyKHR5cGVOYW1lKTsKLQkJaWYgKG51bGwgPT0gZUNsYXNzaWZpZXIpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsIFRZUEUgKyAiICIgKyB0eXBlTmFtZSArICIgY2FuIG5vdCBiZSBmb3VuZCBpbiAiICsgUEFDS0FHRSArICIgIiArIGVQYWNrYWdlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlyZXR1cm47Ci0JCX0KLQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVDbGFzc2lmaWVyOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmZWF0dXJlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRkVBVFVSRSk7Ci0JCWlmIChmZWF0dXJlcy5sZW5ndGggPT0gMCkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBGRUFUVVJFICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWFkRmVhdHVyZShmYWN0b3J5RWxlbWVudCwgZUNsYXNzLCBmZWF0dXJlc1tpXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEZlYXR1cmUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZhY3RvcnlFbGVtZW50LCBFQ2xhc3MgZUNsYXNzLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZmVhdHVyZU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FKTsKLQkJaWYgKG51bGwgPT0gZmVhdHVyZU5hbWUpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgTkFNRSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGFjdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEZFQVRVUkVfQUNUSU9OKTsKLQkJaWYgKG51bGwgPT0gYWN0aW9uKSB7Ci0JCQlhY3Rpb24gPSBGRUFUVVJFX0FDVElPTl9CT1RIOwotCQl9Ci0JCWludCBhY3Rpb25UeXBlID0gLTE7Ci0JCWlmIChhY3Rpb24uZXF1YWxzSWdub3JlQ2FzZShGRUFUVVJFX0FDVElPTl9CT1RIKSkgewotCQkJYWN0aW9uVHlwZSA9IE1vZGlmaWVySGVscGVyLkFDVElPTl9CT1RIOwotCQl9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHNJZ25vcmVDYXNlKEZFQVRVUkVfQUNUSU9OX1NFVCkpIHsKLQkJCWFjdGlvblR5cGUgPSBNb2RpZmllckhlbHBlci5BQ1RJT05fU0VUOwotCQl9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHNJZ25vcmVDYXNlKEZFQVRVUkVfQUNUSU9OX1VOU0VUKSkgewotCQkJYWN0aW9uVHlwZSA9IE1vZGlmaWVySGVscGVyLkFDVElPTl9VTlNFVDsKLQkJfQotCQlpZiAoYWN0aW9uVHlwZSA9PSAtMSkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIkludmFsaWQgIiArIEZFQVRVUkVfQUNUSU9OICsgIj0iICsgYWN0aW9uICsgIiBkZWZpbmVkLiAgVmFsaWQgdmFsdWVzIGFyZTogIiArIEZFQVRVUkVfQUNUSU9OX0JPVEggKyAiLCAiICsgRkVBVFVSRV9BQ1RJT05fU0VUICsgIiwgb3IgIiArIEZFQVRVUkVfQUNUSU9OX1VOU0VUKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQlyZXR1cm47Ci0JCX0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBudWxsOwotCQlFTGlzdCBhbGxGZWF0dXJlcyA9IGVDbGFzcy5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0ZW1wRmVhdHVyZSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsRmVhdHVyZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG51bGwgPT0gZmVhdHVyZSAmJiBpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXRlbXBGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRlbXBGZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKSB7Ci0JCQkJZmVhdHVyZSA9IHRlbXBGZWF0dXJlOwotCQkJfQotCQl9Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsIEZFQVRVUkUgKyAiICIgKyBmZWF0dXJlTmFtZSArICIgY2FuIG5vdCBiZSBmb3VuZCBpbiAiICsgVFlQRSArICIgIiArIGVDbGFzcy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJcmV0dXJuOwotCQl9Ci0JCUxpc3QgZmFjdG9yeUhvbGRlckxpc3QgPSAoTGlzdCkgZmVhdHVyZUhhc2guZ2V0KGZlYXR1cmUpOwotCQlpZiAobnVsbCA9PSBmYWN0b3J5SG9sZGVyTGlzdCkgewotCQkJZmFjdG9yeUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmZWF0dXJlSGFzaC5wdXQoZmVhdHVyZSwgZmFjdG9yeUhvbGRlckxpc3QpOwotCQl9Ci0JCUZhY3RvcnlIb2xkZXIgZmFjdG9yeUhvbGRlciA9IG5ldyBGYWN0b3J5SG9sZGVyKGZhY3RvcnlFbGVtZW50LCBhY3Rpb25UeXBlKTsKLQkJaWYgKGZhY3RvcnlIb2xkZXJMaXN0LmNvbnRhaW5zKGZhY3RvcnlIb2xkZXIpKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiRHVwbGljYXRlIiArIEZFQVRVUkUgKyAiOiIgKyBmZWF0dXJlTmFtZSArICIgZGVmaW5lZCBmb3IgIiArIEZBQ1RPUllfQ0xBU1MgKyAiOiIgKyBmYWN0b3J5RWxlbWVudC5nZXRBdHRyaWJ1dGUoRkFDVE9SWV9DTEFTUykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQlyZXR1cm47Ci0JCX0KLQkJZmFjdG9yeUhvbGRlckxpc3QuYWRkKGZhY3RvcnlIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEZhY3RvcnlIYXNoKElDb25maWd1cmF0aW9uRWxlbWVudCBmYWN0b3J5RWxlbWVudCkgewotCQlyZXR1cm4gZmFjdG9yeUVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkgKyBmYWN0b3J5RWxlbWVudC5nZXRBdHRyaWJ1dGUoRkFDVE9SWV9DTEFTUyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGlmaWVySGVscGVyUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChudWxsID09IElOU1RBTkNFKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBNb2RpZmllckhlbHBlclJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgYSBsaXN0IG9mIE1vZGlmaWVySGVscGVycwotCSAqIAotCSAqIEBwYXJhbSBiYXNlSGVscGVyCi0JICogQHBhcmFtIGFjdGlvbkZsYWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0SGVscGVycyhNb2RpZmllckhlbHBlciBiYXNlSGVscGVyKSB7Ci0JCWludCBhY3Rpb25GbGFnID0gYmFzZUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkgPyBNb2RpZmllckhlbHBlci5BQ1RJT05fVU5TRVQgOiBNb2RpZmllckhlbHBlci5BQ1RJT05fU0VUOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGJhc2VIZWxwZXIuZ2V0RmVhdHVyZSgpOwotCQlMaXN0IGZhY3RvcnlMaXN0ID0gZ2V0RmFjdG9yaWVzKGZlYXR1cmUsIGFjdGlvbkZsYWcpOwotCQlpZiAobnVsbCA9PSBmYWN0b3J5TGlzdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQXJyYXlMaXN0IGhlbHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZmFjdG9yeUxpc3QuaXRlcmF0b3IoKTsKLQkJTW9kaWZpZXJIZWxwZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlmYWN0b3J5ID0gKE1vZGlmaWVySGVscGVyRmFjdG9yeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IGhlbHBlciA9IGZhY3RvcnkuZ2V0SGVscGVyKGJhc2VIZWxwZXIsIGFjdGlvbkZsYWcpOwotCQkJaWYgKG51bGwgIT0gaGVscGVyKSB7Ci0JCQkJaGVscGVycy5hZGQoaGVscGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVscGVyczsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0RmFjdG9yaWVzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgYWN0aW9uRmxhZykgewotCQlMaXN0IGZhY3RvcnlIb2xkZXJMaXN0ID0gKExpc3QpIGZlYXR1cmVIYXNoLmdldChmZWF0dXJlKTsKLQkJaWYgKG51bGwgPT0gZmFjdG9yeUhvbGRlckxpc3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3QgZmFjdG9yeUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1vZGlmaWVySGVscGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmYWN0b3J5SG9sZGVyTGlzdC5zaXplKCk7IGkrKykgewotCQkJZmFjdG9yeSA9ICgoRmFjdG9yeUhvbGRlcikgZmFjdG9yeUhvbGRlckxpc3QuZ2V0KGkpKS5nZXRGYWN0b3J5KGFjdGlvbkZsYWcpOwotCQkJaWYgKG51bGwgIT0gZmFjdG9yeSkgewotCQkJCWZhY3RvcnlMaXN0LmFkZChmYWN0b3J5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeUxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vT3duZXJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vT3duZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDgyNDM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL093bmVyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjAvMjAwMSAxMDoyNDo0NiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE93bmVyUHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybiB0aGUgRU9iamVjdCB0aGF0IHdpbGwgc2VydmUgYXMgdGhlIG93bmVyIG9mIGEgZ2l2ZW4gSjJFRU1vZGlmaWVySGVscGVyLgotCSAqLwotCUVPYmplY3QgZ2V0T3duZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIEoyRUVNb2RpZmllckhlbHBlciBmb3IgdGhlIG93bmVyIGlmIHRoZSBvd25lciBkb2VzIG5vdCB5ZXQgZXhpc3QuCi0JICovCi0JTW9kaWZpZXJIZWxwZXIgZ2V0T3duZXJIZWxwZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Qcm9qZWN0UmVzb3VyY2VTZXRFZGl0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhMzI2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Qcm9qZWN0UmVzb3VyY2VTZXRFZGl0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA0LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVzb3VyY2VTZXRFZGl0SW1wbCBleHRlbmRzIFByb2plY3RSZXNvdXJjZVNldEltcGwgewotCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICovCi0JcHVibGljIFByb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXN1cGVyKGFQcm9qZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJUmVzb3VyY2UgcmVzdWx0ID0gc3VwZXIuY3JlYXRlUmVzb3VyY2UodXJpLCBjb250ZW50VHlwZSk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXN1bHQpKQotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcCgoUmVmZXJlbmNlZFJlc291cmNlKSByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIENvbnRlbnRIYW5kbGVyLlVOU1BFQ0lGSUVEX0NPTlRFTlRfVFlQRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9SZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyODc5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9SZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgZXh0ZW5kcyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0VYVEVOU0lPTiA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FWFRFTlNJT04gPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9BUkNISVZFID0gImphciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFNldCByZWNlbnRseVNhdmVkRmlsZXMgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgTWFwIGlnbm9yZWRGaWxlc0NhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGNsYXNzIFNhdmVkRmlsZUtleSB7Ci0JCXByaXZhdGUgUmVzb3VyY2UgcmVzOwotCQlwcml2YXRlIElGaWxlIHNhdmVkRmlsZTsKLQkJcHVibGljIFNhdmVkRmlsZUtleShSZXNvdXJjZSByZXMsIElGaWxlIHNhdmVkRmlsZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucmVzID0gcmVzOwotCQkJdGhpcy5zYXZlZEZpbGUgPSBzYXZlZEZpbGU7Ci0JCX0KLQkJcHVibGljIFJlc291cmNlIGdldFJlcygpIHsKLQkJCXJldHVybiByZXM7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UmVzKFJlc291cmNlIHJlcykgewotCQkJdGhpcy5yZXMgPSByZXM7Ci0JCX0KLQkJcHVibGljIElGaWxlIGdldFNhdmVkRmlsZSgpIHsKLQkJCXJldHVybiBzYXZlZEZpbGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0U2F2ZWRGaWxlKElGaWxlIHNhdmVkRmlsZSkgewotCQkJdGhpcy5zYXZlZEZpbGUgPSBzYXZlZEZpbGU7Ci0JCX0KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQkJaW50IHJlc3VsdCA9IDE7Ci0JCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGdldE91dGVyVHlwZSgpLmhhc2hDb2RlKCk7Ci0JCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgocmVzID09IG51bGwpID8gMCA6IHJlcy5oYXNoQ29kZSgpKTsKLQkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChzYXZlZEZpbGUgPT0gbnVsbCkgPyAwIDogc2F2ZWRGaWxlLmhhc2hDb2RlKCkpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVNhdmVkRmlsZUtleSBvdGhlciA9IChTYXZlZEZpbGVLZXkpIG9iajsKLQkJCWlmICghZ2V0T3V0ZXJUeXBlKCkuZXF1YWxzKG90aGVyLmdldE91dGVyVHlwZSgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAocmVzID09IG51bGwpIHsKLQkJCQlpZiAob3RoZXIucmVzICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoIXJlcy5lcXVhbHMob3RoZXIucmVzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoc2F2ZWRGaWxlID09IG51bGwpIHsKLQkJCQlpZiAob3RoZXIuc2F2ZWRGaWxlICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoIXNhdmVkRmlsZS5lcXVhbHMob3RoZXIuc2F2ZWRGaWxlKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwcml2YXRlIFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBnZXRPdXRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyLnRoaXM7Ci0JCX0KLQl9Ci0KLQkvKiogVGhlIGVtZiByZXNvdXJjZXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNvdXJjZSBzZXQgYXMgYSByZXN1bHQgb2YgYSBkZWx0YSAqLwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkVW5sb2FkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkTG9hZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBMaXN0IGF1dG9sb2FkUmVzb3VyY2VzVVJJcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBhdXRvbG9hZFJlc291cmNlc0V4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKLQkJc3VwZXIoYVJlc291cmNlU2V0LCBhUHJvamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLnJlc291cmNlQ2hhbmdlZChldmVudCk7Ci0JCXRyeSB7Ci0JCQlhY2NlcHREZWx0YShldmVudCk7Ci0JCQlub3RpZnlFeHRlbmRlcnNJZk5lY2Vzc2FyeSgpOwotCQkJcHJvY2Vzc0RlZmVycmVkUmVzb3VyY2VzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJZGVmZXJyZWRSZW1vdmVSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCWRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQlkZWZlcnJlZExvYWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NEZWZlcnJlZFJlbW92ZWRSZXNvdXJjZXMoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZlcnJlZFJlbW92ZVJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzLmdldChpKTsKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZSk7Ci0JCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NEZWZlcnJlZFVubG9hZGVkUmVzb3VyY2VzKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlc291cmNlID0gKFJlc291cmNlKSBkZWZlcnJlZFVubG9hZFJlc291cmNlcy5nZXQoaSk7Ci0JCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGVmZXJyZWRMb2FkUmVzb3VyY2VzKCkgewotCQlVUkkgdXJpID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZlcnJlZExvYWRSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXVyaSA9IChVUkkpIGRlZmVycmVkTG9hZFJlc291cmNlcy5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJTG9jayBsb2NrOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgZGVsYXkgPSAzMDsKLQkKLSAgICBwcml2YXRlIElMb2NrIGdldExvY2soKSB7Ci0gICAgICAgIGlmIChsb2NrID09IG51bGwpCi0gICAgICAgICAgICBsb2NrID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLSAgICAgICAgcmV0dXJuIGxvY2s7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlTG9jaygpIHsKLSAgICAgICAgZ2V0TG9jaygpLnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBib29sZWFuIGFxdWlyZUxvY2soKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb257Ci0gICAgCXJldHVybiBnZXRMb2NrKCkuYWNxdWlyZShkZWxheSk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCB2b2lkIGFjY2VwdERlbHRhKGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJYm9vbGVhbiBoYXNMb2NrZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWhhc0xvY2tlZCA9IGFxdWlyZUxvY2soKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOwotCQl9CQkKLQkJCi0JCXRyeXsKLQkJCWZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkKLQkJCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNUcmVlTG9ja2VkKCkpIHsKLQkJCQlwcmltQWNjZXB0RGVsdGEoZGVsdGEsIGV2ZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCXByaW1BY2NlcHREZWx0YShkZWx0YSwgZXZlbnQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBwcm9qZWN0LCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX1maW5hbGx5ewotCQkJaWYoIGhhc0xvY2tlZCApCi0JCQkJcmVsZWFzZUxvY2soKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmltQWNjZXB0RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWN1cnJlbnRQcm9qZWN0RGVsdGEgPSBudWxsOwotCQkJCWRlbHRhLmFjY2VwdChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIudGhpcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBwcm9qZWN0IGlzIGdvaW5nIGF3YXkgc28gd2UgbmVlZCB0byBjbGVhbnVwIG91cnNlbGYgYW5kIHRoZSBSZXNvdXJjZVNldC4gVE9ETyBOZWVkIHRvCi0JICogcHVzaCB1cCB0aGlzIGNvZGUgdG8gUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgaW4gbmV4dCByZWxlYXNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChKRU1VdGlsUGx1Z2luLmlzQWN0aXZhdGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KQotCQkJCQkoKFByb2plY3RSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpLnJlbGVhc2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuSU5TVEFOQ0UucmVtb3ZlQ2FjaGVkUHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGVmZXJyZWRSZXNvdXJjZXMoKSB7Ci0JCXByb2Nlc3NEZWZlcnJlZFJlbW92ZWRSZXNvdXJjZXMoKTsKLQkJcHJvY2Vzc0RlZmVycmVkVW5sb2FkZWRSZXNvdXJjZXMoKTsKLQkJcHJvY2Vzc0RlZmVycmVkTG9hZFJlc291cmNlcygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCS8vIG9ubHkgcmVzcG9uZCB0byBwcm9qZWN0IGNoYW5nZXMKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCQlpZiAoaXNJbnRlcnJlc3RlZEluUHJvamVjdChwKSkgewotCQkJCQljdXJyZW50UHJvamVjdERlbHRhID0gZGVsdGE7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIGlzSW50ZXJyZXN0ZWRJbkZpbGUoKElGaWxlKSByZXNvdXJjZSkpIHsKLQkJCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotCQkJCQkJcmVtb3ZlZFJlc291cmNlKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgotCQkJCQkJYWRkZWRSZXNvdXJjZSgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgotCQkJCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCkKLQkJCQkJCQljaGFuZ2VkUmVzb3VyY2UoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwIHx8IChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApCi0JCQkJCQkJbW92ZWRSZXNvdXJjZSgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUXVldWUgdXAgdGhlIDxjb2RlPlJlc291cmNlPC9jb2RlPiB0aGF0IGNvcnJlc3BvbmRzIHRvIDxjb2RlPmFGaWxlPC9jb2RlPiwgZm9yIHJlbW92YWwKLQkgKiBmcm9tIHRoZSBjYWNoZSBvZiByZXNvdXJjZXMuCi0JICogCi0JICogQHBvc3QgUmV0dXJuIHRydWUgaWYgYSA8Y29kZT5SZXNvdXJjZTwvY29kZT4gd2FzIHF1ZXVlZCB1cCB0byBiZSByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZWRSZXNvdXJjZShJRmlsZSBhRmlsZSkgewotCQlyZXR1cm4gcHJvY2Vzc1Jlc291cmNlKGFGaWxlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBRdWV1ZSB1cCB0aGUgPGNvZGU+UmVzb3VyY2U8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gPGNvZGU+YUZpbGU8L2NvZGU+LCBmb3IgcmVsb2FkLgotCSAqIAotCSAqIEBwb3N0IFJldHVybiB0cnVlIGlmIGEgPGNvZGU+UmVzb3VyY2U8L2NvZGU+IHdhcyBxdWV1ZWQgdXAgdG8gYmUgcmVsb2FkZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkZWRSZXNvdXJjZShJRmlsZSBhRmlsZSkgewotICAgICAgICBib29sZWFuIGRpZFByb2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgTGlzdCByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMoYUZpbGUpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmICgocmVzb3VyY2UgIT0gbnVsbCkgfHwgKHJlY2VudGx5U2F2ZWRGaWxlc0NvbnRhaW5zKHJlc291cmNlKSkpIHsKLQkJCQkvKgotCQkJCSAqIFRoZSBJRmlsZSB3YXMganVzdCBhZGRlZCB0byB0aGUgd29ya3NwYWNlIGJ1dCB3ZSBoYXZlIGEKLQkJCQkgKiByZXNvdXJjZSBpbiBtZW1vcnkuIE5lZWQgdG8gZGVjaWRlIGlmIGl0IHNob3VsZCBiZSB1bmxvYWRlZC4KLQkJCQkgKi8KLQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXNvdXJjZSkpIHsKLQkJCQkJCVJlZmVyZW5jZWRSZXNvdXJjZSByZWZSZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZXNvdXJjZTsKLQkJCQkJCWlmIChyZWZSZXMuc2hvdWxkRm9yY2VSZWZyZXNoKCkpIHsKLQkJCQkJCQlkZWZlcnJlZFVubG9hZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCWRpZFByb2Nlc3MgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogVW5sb2FkIGlmIGZvdW5kIGFuZCBpcyBub3QgbW9kaWZpZWQgYnV0IGluY29uc2lzdGVudC4gKi8KLQkJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXNvdXJjZSkpIHsKLQkJCQkJCQlpZiAoIVdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzQ29uc2lzdGVudCgoUmVmZXJlbmNlZFJlc291cmNlKSByZXNvdXJjZSkpIHsKLQkJCQkJCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJZGlkUHJvY2VzcyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlkZWZlcnJlZFVubG9hZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCWRpZFByb2Nlc3MgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBQcm9jZXNzIHJlc291cmNlIGFzIGEgcmVmcmVzaC4KLQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoYUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQlpZiAoKGF1dG9sb2FkUmVzb3VyY2VzVVJJcy5jb250YWlucyh1cmkpKSB8fCAoYXV0b2xvYWRSZXNvdXJjZXNFeHRzLmNvbnRhaW5zKGFGaWxlLmdldEZpbGVFeHRlbnNpb24oKSkpKSB7Ci0JCQkJCWRlZmVycmVkTG9hZFJlc291cmNlcy5hZGQodXJpKTsKLQkJCQkJZGlkUHJvY2VzcyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICAgIHJldHVybiBkaWRQcm9jZXNzOwotfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWNlbnRseVNhdmVkRmlsZXNDb250YWlucyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVjZW50bHlTYXZlZEZpbGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVNhdmVkRmlsZUtleSBrZXkgPSAoU2F2ZWRGaWxlS2V5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoa2V5LnJlcy5lcXVhbHMocmVzb3VyY2UpKSAKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NSZXNvdXJjZShJRmlsZSBhRmlsZSwgYm9vbGVhbiBpc1JlbW92ZSkgewotCQlMaXN0IHJlc291cmNlcyA9IGdldFJlc291cmNlcyhhRmlsZSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICgocmVzb3VyY2UgIT0gbnVsbCkgfHwgKHJlY2VudGx5U2F2ZWRGaWxlc0NvbnRhaW5zKHJlc291cmNlKSkpIHsKLQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXNvdXJjZSkpIHsKLQkJCQkJCVJlZmVyZW5jZWRSZXNvdXJjZSByZWZSZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZXNvdXJjZTsKLQkJCQkJCWlmICghcmVmUmVzLnNob3VsZEZvcmNlUmVmcmVzaCgpKQotCQkJCQkJCWNvbnRpbnVlOyAvLyBEbyBub3QgZG8gYW55dGhpbmcKLQkJCQkJfSBlbHNlCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoaXNSZW1vdmUpCi0JCQkJCWRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNSZWZlcmVuY2VkUmVzb3VyY2UocmVzb3VyY2UpKSB7Ci0JCQkJCQlpZiAoIVdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzQ29uc2lzdGVudCgoUmVmZXJlbmNlZFJlc291cmNlKSByZXNvdXJjZSkpCi0JCQkJCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlkZWZlcnJlZFVubG9hZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRm9yIG5vdywgZG8gdGhlIHNhbWUgYXMgaWYgdGhlIDxjb2RlPmFGaWxlPC9jb2RlPiB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlZFJlc291cmNlKElGaWxlIGFGaWxlKSB7Ci0JCXJldHVybiByZW1vdmVkUmVzb3VyY2UoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb250ZW50cyBvZiA8Y29kZT5hRmlsZTwvY29kZT4gaGF2ZSBjaGFuZ2VkIGluIHRoZSBXb3JrYmVuY2ggYW5kIHdlIG1heSBuZWVkIHRvIHVwZGF0ZQotCSAqIG91ciBjYWNoZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIFdlIHdpbGwgcHJvY2VzcyB0aGlzIHJlc291cmNlIHRvIGJlIHJlZnJlc2hlZCBhbmQgbm90IHJlbW92ZWQuCi0JICogCi0JICogQHBvc3QgUmV0dXJuIHRydWUgaWYgYSA8Y29kZT5SZXNvdXJjZTwvY29kZT4gd2FzIGFjdHVhbGx5IHJlbW92ZWQuCi0JICovCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGFuZ2VkUmVzb3VyY2UoSUZpbGUgYUZpbGUpIHsKLQkJLy9Qcm9jZXNzIHJlc291cmNlIGFzIGEgcmVmcmVzaC4KLQkJcmV0dXJuIHByb2Nlc3NSZXNvdXJjZShhRmlsZSwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZShJRmlsZSBhRmlsZSkgewotCQkKLQkJcmV0dXJuIHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGFGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSksIGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVzb3VyY2VzKElGaWxlIGFGaWxlKSB7Ci0JCQotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhbGxSZXNvdXJjZXMgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVVSSSByZXNVUkkgPSByZXMuZ2V0VVJJKCk7Ci0JCQlJUGF0aCByZXNVUklQYXRoOwotCQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUGxhdGZvcm1SZXNvdXJjZVVSSShyZXNVUkkpKSAKLQkJCQlyZXNVUklQYXRoID0gbmV3IFBhdGgoVVJJLmRlY29kZShyZXNVUkkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygyKTsKLQkJCWVsc2UgCi0JCQkJcmVzVVJJUGF0aCA9IG5ldyBQYXRoKFVSSS5kZWNvZGUocmVzVVJJLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQlTdHJpbmcgcmVzVVJJU3RyaW5nID0gcmVzVVJJUGF0aC50b1N0cmluZygpOwotCQkJaWYgKCFyZXNVUklTdHJpbmcuZXF1YWxzKCIiKSAmJiBhRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuaW5kZXhPZihyZXNVUklTdHJpbmcpICE9IC0xKQotCQkJCXJlc291cmNlcy5hZGQocmVzKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byB3cml0aW5nIHRvIGFuIElGaWxlIGZyb20gYSBNT0YgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgcHJlU2F2ZShJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgIT0gbnVsbCkgewotCQkJcmVjZW50bHlTYXZlZEZpbGVzQWRkKGFGaWxlLG51bGwpOwotCQkJaWdub3JlZEZpbGVzQ2FjaGUucmVtb3ZlKGFGaWxlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHdyaXRpbmcgdG8gYW4gSUZpbGUgZnJvbSBhIE1PRiByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVTYXZlKElGaWxlIGFGaWxlLCBSZXNvdXJjZSByZXMpIHsKLQkJaWYgKGFGaWxlICE9IG51bGwpIHsKLQkJCXJlY2VudGx5U2F2ZWRGaWxlc0FkZChhRmlsZSwgcmVzKTsKLQkJCWlnbm9yZWRGaWxlc0NhY2hlLnJlbW92ZShhRmlsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHJlY2VudGx5U2F2ZWRGaWxlc0FkZChJRmlsZSBmaWxlLCBSZXNvdXJjZSByZXMpIHsKLQkJcmV0dXJuIHJlY2VudGx5U2F2ZWRGaWxlcy5hZGQobmV3IFNhdmVkRmlsZUtleShyZXMsIGZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgcHJlU2F2ZSBpZiB0aGUgc2F2ZSBmYWlscwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZWNlbnRseVNhdmVkTGlzdChJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgIT0gbnVsbCkgewotCQkJcmVjZW50bHlTYXZlZEZpbGVzRm9yY2VSZW1vdmUoYUZpbGUpOwotCQkJaWdub3JlZEZpbGVzQ2FjaGUucmVtb3ZlKGFGaWxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjZW50bHlTYXZlZEZpbGVzUmVtb3ZlKElGaWxlIGZpbGUpIHsKLQkJCi0JCWJvb2xlYW4gcmVtb3ZlZEZyb21MaXN0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZWNlbnRseVNhdmVkRmlsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU2F2ZWRGaWxlS2V5IGtleSA9IChTYXZlZEZpbGVLZXkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChrZXkuc2F2ZWRGaWxlICE9IG51bGwgJiYga2V5LnNhdmVkRmlsZS5lcXVhbHMoZmlsZSkpIHsKLQkJCQlMaXN0IHJlc291cmNlcyA9IGdldFJlc291cmNlcyhmaWxlKTsKLQkJCQlpZiAoa2V5LnJlcyA9PSBudWxsIHx8IHJlc291cmNlcy5jb250YWlucyhrZXkucmVzKSApIHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCXJlbW92ZWRGcm9tTGlzdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVtb3ZlZEZyb21MaXN0OwotCX0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHJlY2VudGx5U2F2ZWRGaWxlc0ZvcmNlUmVtb3ZlKElGaWxlIGZpbGUpIHsKLQkJCi0JCWJvb2xlYW4gcmVtb3ZlZEZyb21MaXN0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZWNlbnRseVNhdmVkRmlsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU2F2ZWRGaWxlS2V5IGtleSA9IChTYXZlZEZpbGVLZXkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChrZXkuc2F2ZWRGaWxlICE9IG51bGwgJiYga2V5LnNhdmVkRmlsZS5lcXVhbHMoZmlsZSkpIHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCXJlbW92ZWRGcm9tTGlzdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZWRGcm9tTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGp1c3QgYWZ0ZXIgd3JpdGluZyB0byBhbiBJRmlsZSBmcm9tIGEgTU9GIHJlc291cmNlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuCi0JICovCi0JcHVibGljIHZvaWQgcG9zdFNhdmUoSUZpbGUgYUZpbGUpIHsKLQkJLy9UT0RPIHJlbW92ZSB0aGlzIG1ldGhvZAotCX0KLQotCS8qKgotCSAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5hUHJvamVjdDwvY29kZT4gaGFzIHRoZSBwcm9qZWN0TmF0dXJlSUQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcnJlc3RlZEluUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gYVByb2plY3QuZXF1YWxzKGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogT3B0aW1pemVkIG5vdCB0byBiZSBub3QgaW50ZXJyZXN0ZWQgaW4gZmlsZXMgd2l0aCBhbiBleHRlbnNpb24gb2YgLmphdmEgb3IgLmNsYXNzIG9yIGlmIHRoZQotCSAqIGZpbGUgaGFzIGp1c3QgYmVlbiBzYXZlZCBieSBvdXIgb3duIGludGVybmFsIG1lY2hhbmlzbS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5GaWxlKElGaWxlIGFGaWxlKSB7Ci0JCVN0cmluZyBleHRlbnNpb24gPSBhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWlmIChDTEFTU19FWFRFTlNJT04uZXF1YWxzKGV4dGVuc2lvbikgfHwgSkFWQV9FWFRFTlNJT04uZXF1YWxzKGV4dGVuc2lvbikgfHwgSkFWQV9BUkNISVZFLmVxdWFscyhleHRlbnNpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocmVjZW50bHlTYXZlZEZpbGVzUmVtb3ZlKGFGaWxlKSkgewotCQkJCWNhY2hlSWdub3JlZChhRmlsZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAhaGFzSWdub3JlZChhRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGlnbm9yZWQgdGhpcyA8Y29kZT5maWxlPC9jb2RlPiBhbmQgdGhhdCBpdHMgbW9kaWZpY2F0aW9uCi0JICogc3RhbXAgaXMgdGhlIHNhbWUgYXMgd2hlbiB3ZSBwcm9jZXNzZWQgaXQuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc0lnbm9yZWQoSUZpbGUgZmlsZSkgewotCQlMb25nIGNhY2hlZFN0YW1wID0gKExvbmcpIGlnbm9yZWRGaWxlc0NhY2hlLmdldChmaWxlKTsKLQkJaWYgKGNhY2hlZFN0YW1wID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWxvbmcgc3RhbXAgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSk7Ci0JCXJldHVybiBjYWNoZWRTdGFtcC5sb25nVmFsdWUoKSA9PSBzdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIG9mIHRoZSA8Y29kZT5maWxlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZUlnbm9yZWQoSUZpbGUgZmlsZSkgewotCQlsb25nIHN0YW1wID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQlpZ25vcmVkRmlsZXNDYWNoZS5wdXQoZmlsZSwgbmV3IExvbmcoc3RhbXApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVBdXRvbG9hZChVUkkgdXJpKSB7Ci0JCVVSSSBub3JtYWxpemVkID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCWF1dG9sb2FkUmVzb3VyY2VzVVJJcy5hZGQobm9ybWFsaXplZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzYWJsZUF1dG9sb2FkKFVSSSB1cmkpIHsKLQkJVVJJIG5vcm1hbGl6ZWQgPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJYXV0b2xvYWRSZXNvdXJjZXNVUklzLnJlbW92ZShub3JtYWxpemVkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyI2luaXRpYWxpemUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0JcHVibGljIHZvaWQgZW5hYmxlQXV0b2xvYWQoU3RyaW5nIGV4dGVuc2lvbikgewotCQlhdXRvbG9hZFJlc291cmNlc0V4dHMuYWRkKGV4dGVuc2lvbik7Ci0JCQotCX0KLQlwdWJsaWMgdm9pZCBkaXNhYmxlQXV0b2xvYWQoU3RyaW5nIGV4dGVuc2lvbikgewotCQlhdXRvbG9hZFJlc291cmNlc0V4dHMucmVtb3ZlKGV4dGVuc2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQljdXJyZW50UHJvamVjdERlbHRhID0gbnVsbDsKLQkJZXh0ZW5kZXJzID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9JVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L0lWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjU5MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L0lWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxOCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aSBUaGlzIGlzIHRoZSBhYnN0cmFjdGlvbiBsYXllciBmb3IgdmFsaWRhdGUgZWRpdAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0ZUVkaXRDb250ZXh0IGV4dGVuZHMgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19LRVkgPSAiVmFsaWRhdGVFZGl0Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyB2b2lkIHNldEVkaXRNb2RlbChFZGl0TW9kZWwgZlZhbGlkYXRvcik7Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVN0YXRlKEVkaXRNb2RlbCBmVmFsaWRhdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjhiYzYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIGNvbnRyb2xsZWQgcmVzb3VyY2VzIG9yIGZpbGVzIGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgdGhlIE1PRiBSZXNvdXJjZXMgdGhhdCBhcmUgYmVpbmcgbWFuYWdlZC4gU3luY2hyb25pemF0aW9uCi0JICogY2hlY2tpbmcgd2lsbCBvbmx5IHdvcmsgaWYgeW91IGFyZSB1c2luZyB0aGUgZW1mLndvcmtiZW5jaCBwbHVnaW4gYXBpcyBmb3IgbG9hZGluZyByZXNvdXJjZXMuCi0JICogVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHlvdSBnZXQgYW4gaW5zdGFuY2Ugb2YgYSA8Y29kZT5SZWZlcmVuY2VkUmVzb3VyY2U8L2NvZGU+LiBUaGlzCi0JICogcmVzb3VyY2UgdHlwZSBpcyBjYXBhYmxlIG9mIGNhY2hpbmcgaXRzIGxhc3Qga25vd24gc3luY2hyb25pemF0aW9uIHN0YW1wIHRoYXQgbWF5IGJlIHVzZWQgdG8KLQkgKiB0ZXN0IGlmIHRoZSByZXNvdXJjZSBpcyBjb25zaXRlbnQgd2l0aCB0aGUgdW5kZXJseWluZyBJRmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgSUZpbGVzIHRoYXQgYXJlIG5vdCBNT0YgUmVzb3VyY2VzIHRoYXQgYXJlIGFsc28gYmVpbmcKLQkgKiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlMaXN0IGdldE5vblJlc291cmNlRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN1YnNldCBvZiB0aGUgTGlzdCBmcm9tIGdldE5vblJlc291cmNlRmlsZXMoKSB0aGF0IGFyZSBpbmNvbnNpc3RlbnQgd2l0aCB0aGUKLQkgKiB1bmRlcmx5aW5nIGphdmEuaW8uRmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2dldE5vblJlc291cmNlRmlsZXMoKQotCSAqLwotCUxpc3QgZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpOwotCi0JLyoqCi0JICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBwcm92aWRlciB0byBjYWNoZSB0aGUgc3luY2hyb25pemF0aW9uIHN0YW1wIGZvciB0aGUgTGlzdCBvZgotCSAqIDxjb2RlPnJvTm9uUmVzb3VyY2VGaWxlczwvY29kZT4uIFRoaXMgc3RhbXAgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgaW5jb25zaXN0ZW50Ci0JICogZmlsZXMuIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgb2YgSUZpbGVzIHRoYXQgYXJlIG5vdCBNT0YgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSByb05vblJlc291cmNlRmlsZXMKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2dldE5vblJlc291cmNlSW5jb25zaXN0ZW50RmlsZXMoKQotCSAqLwotCXZvaWQgY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCByb05vblJlc291cmNlRmlsZXMpOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzMzdjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIHsKLQlzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpFTVV0aWxQbHVnaW4uSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhIDxjb2RlPnByZXNlbnRlcjwvY29kZT4gaXMgYWN0aXZhdGVkIChiZWNvbWVzCi0JICogYWN0aXZlKS4gVGhpcyB3aWxsIGNoZWNrIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQKLQkgKiBmcm9tIHRoZSBsYXN0IGNhY2hlZCBtb2RpZmllZCB2YWx1ZS4gVGhlIDxjb2RlPnByZXNlbnRlcjwvY29kZT4gc2hvdWxkIGJlIHByZXBhcmVkIHRvCi0JICogcHJvbXB0IHRoZSB1c2VyIGlmIHRoZXkgd291bGQgbGlrZSB0byByZWZyZXNoIHdpdGggdGhlIGNvbnRlbnRzIG9uIGRpc2sgaWYgd2UgYXJlIGRpcnR5LgotCSAqLwotCXZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSA8Y29kZT5wcmVzZW50ZXI8L2NvZGU+IGxvb3NlcyBhY3RpdmF0aW9uLiBUaGlzIHdpbGwKLQkgKiBjaGVjayB0aGUgdGltZXN0YW1wcyBvZiB0aGUgdW5kZXJseWluZyBmaWxlcyB0byBzZWUgaWYgdGhleSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGxhc3QKLQkgKiBjYWNoZWQgbW9kaWZpZWQgdmFsdWUuIFRoZSA8Y29kZT5wcmVzZW50ZXI8L2NvZGU+IHNob3VsZCBiZSBwcmVwYXJlZCB0byBwcm9tcHQgdGhlIHVzZXIgaWYKLQkgKiB0aGV5IHdvdWxkIGxpa2UgdG8gcmVmcmVzaCB3aXRoIHRoZSBjb250ZW50cyBvbiBkaXNrIGlmIHdlIGFyZSBkaXJ0eS4KLQkgKi8KLQl2b2lkIGxvc3RBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgdGhlIGZpbGVzIGFyZSBhYm91dCB0byBiZSBtb2RpZmllZCBhZnRlciBhCi0JICogPGNvZGU+cHJlc2VudGVyPC9jb2RlPiBiZWNvbWVzIGFjdGl2ZS4gVGhlIHJldHVybmVkIElTdGF0dXMgbWF5IGhhdmUgYW4gRVJST1Igc3RhdHVzIHdoaWNoCi0JICogc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KLQkgKi8KLQlJU3RhdHVzIHZhbGlkYXRlU3RhdGUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byB0aGUgPGNvZGU+cHJlc2VudGVyPC9jb2RlPiBzYXZpbmcgdGhlIG1vZGlmaWVkCi0JICogY29udGVudHMuIFRoaXMgd2lsbCBjaGVjayB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIHVuZGVybHlpbmcgZmlsZXMgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUKLQkgKiBzeW5jaHJvbml6ZWQuIElmIHRydWUgaXMgcmV0dXJuZWQsIHRoZSBzYXZlIGNhbiBwcm9jZWVkLgotCSAqLwotCWJvb2xlYW4gY2hlY2tTYXZlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgcmVhZCBvbmx5IGZpbGVzLgotCSAqLwotCWJvb2xlYW4gY2hlY2tSZWFkT25seSgpOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDBiNmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGwgaW1wbGVtZW50cyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIHsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIgcHJvdmlkZXI7Ci0JcHJvdGVjdGVkIE1hcCBsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwOwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2hlY2tpbmdDb25zaXN0ZW5jeTsKLQotCWNsYXNzIFJlZnJlc2hSdW5uYWJsZSBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JCUNvcmVFeGNlcHRpb24gdGhyb3duRXhjZXB0aW9uOwotCQlMaXN0IGZpbGVzOwotCQlMaXN0IHJlc291cmNlczsKLQotCQlSZWZyZXNoUnVubmFibGUoTGlzdCBzb21lRmlsZXMsIExpc3QgaW5jb25zaXN0ZW50UmVzb3VyY2VzKSB7Ci0JCQlmaWxlcyA9IHNvbWVGaWxlczsKLQkJCXJlc291cmNlcyA9IGluY29uc2lzdGVudFJlc291cmNlczsKLQkJfQotCi0JCXB1YmxpYyBDb3JlRXhjZXB0aW9uIGdldFRocm93bkV4Y2VwdGlvbigpIHsKLQkJCXJldHVybiB0aHJvd25FeGNlcHRpb247Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQkJdHJ5IHsKLQkJCQlwcmVwYXJlUmVzb3VyY2VzRm9yUmVmcmVzaChyZXNvdXJjZXMpOwotCQkJCXByaW1SZWZyZXNoRmlsZXMoZmlsZXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3duRXhjZXB0aW9uID0gZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbChSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciBhUHJvdmlkZXIpIHsKLQkJcHJvdmlkZXIgPSBhUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciA8Y29kZT5hTGlzdGVuZXI8L2NvZGU+IGlzIGFjdGl2YXRlZCAoYmVjb21lcyBhY3RpdmUpLgotCSAqIFRoaXMgd2lsbCBjaGVjayB0aGUgdGltZXN0YW1wcyBvZiB0aGUgdW5kZXJseWluZyBmaWxlcyB0byBzZWUgaWYgdGhleSBhcmUgZGlmZmVyZW50IGZyb20gdGhlCi0JICogbGFzdCBjYWNoZWQgbW9kaWZpZWQgdmFsdWUuIDxjb2RlPmFMaXN0ZW5lcjwvY29kZT4gc2hvdWxkIGJlIHByZXBhcmVkIHRvIHByb21wdCB0aGUgdXNlciBpZgotCSAqIHRoZXkgd291bGQgbGlrZSB0byByZWZyZXNoIHdpdGggdGhlIGNvbnRlbnRzIG9uIGRpc2sgaWYgd2UgYXJlIGRpcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljaGVja0NvbnNpc3RlbmN5KHByZXNlbnRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY2hlY2tDb25zaXN0ZW5jeShwcmVzZW50ZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrU2F2ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJlc2VudGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghcHJvdmlkZXIuaXNEaXJ0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlMaXN0IGluY29uc2lzdGVudFJlc291cmNlcyA9IGdldEluY29uc2lzdGVudFJlc291cmNlcygpOwotCQlMaXN0IGluY29uc2lzdGVudEZpbGVzID0gZ2V0RmlsZXMoaW5jb25zaXN0ZW50UmVzb3VyY2VzKTsKLQkJaW5jb25zaXN0ZW50RmlsZXMgPSBhZGRPdGhlckluY29uc2lzdGVudEZpbGVzKGluY29uc2lzdGVudEZpbGVzKTsKLQkJaWYgKGluY29uc2lzdGVudEZpbGVzID09IG51bGwgfHwgaW5jb25zaXN0ZW50RmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBwcmVzZW50ZXIucHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZU92ZXJ3cml0ZShpbmNvbnNpc3RlbnRGaWxlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrUmVhZE9ubHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrUmVhZE9ubHkoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gY2hlY2tSZWFkT25seVJlc291cmNlcygpOwotCQlpZiAoIXJlc3VsdCkKLQkJCXJlc3VsdCA9IGNoZWNrUmVhZE9ubHlOb25SZXNvdXJjZUZpbGVzKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNoZWNrUmVhZE9ubHlOb25SZXNvdXJjZUZpbGVzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1JlYWRPbmx5Tm9uUmVzb3VyY2VGaWxlcygpIHsKLQkJTGlzdCBmaWxlcyA9IHByb3ZpZGVyLmdldE5vblJlc291cmNlRmlsZXMoKTsKLQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgc2l6ZSA9IGZpbGVzLnNpemUoKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlmaWxlID0gKElGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoZmlsZS5pc1JlYWRPbmx5KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjaGVja1JlYWRPbmx5UmVzb3VyY2VzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1JlYWRPbmx5UmVzb3VyY2VzKCkgewotCQlMaXN0IHJlc291cmNlcyA9IHByb3ZpZGVyLmdldFJlc291cmNlcygpOwotCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHNpemUgPSByZXNvdXJjZXMuc2l6ZSgpOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbnNpc3RlbmN5KFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpc0NoZWNraW5nQ29uc2lzdGVuY3kgfHwgcHJlc2VudGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlzQ2hlY2tpbmdDb25zaXN0ZW5jeSA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlMaXN0IGluY29uc2lzdGVudFJlc291cmNlcyA9IGdldEluY29uc2lzdGVudFJlc291cmNlcygpOwotCQkJTGlzdCBpbmNvbnNpc3RlbnRGaWxlcyA9IGdldEZpbGVzKGluY29uc2lzdGVudFJlc291cmNlcyk7Ci0JCQlpbmNvbnNpc3RlbnRGaWxlcyA9IGFkZE90aGVySW5jb25zaXN0ZW50RmlsZXMoaW5jb25zaXN0ZW50RmlsZXMpOwotCQkJaWYgKGluY29uc2lzdGVudEZpbGVzID09IG51bGwgfHwgaW5jb25zaXN0ZW50RmlsZXMuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQkJCWJvb2xlYW4gc2hvdWxkUmVmcmVzaEZpbGVzID0gdHJ1ZTsKLQkJCS8vRGVmZWN0IDIwODY1NCAmIDIwOTYzMSB3YW50IHByb21wdCBubyBtYXR0ZXIgd2hhdC4KLQkJCWlmIChhbnlGaWxlQ2hhbmdlZFNpbmNlTGFzdFJlZnJlc2hQcm9tcHQoaW5jb25zaXN0ZW50RmlsZXMpKSB7Ci0JCQkJY2xlYXJMYXN0Tm9uUmVmcmVzaFN0YXRlTWFwKCk7Ci0JCQkJc2hvdWxkUmVmcmVzaEZpbGVzID0gcHJlc2VudGVyLnByb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKGluY29uc2lzdGVudEZpbGVzKTsKLQkJCX0gZWxzZQotCQkJCXJldHVybjsKLQkJCWlmIChzaG91bGRSZWZyZXNoRmlsZXMpCi0JCQkJcmVmcmVzaEZpbGVzKGluY29uc2lzdGVudEZpbGVzLCBpbmNvbnNpc3RlbnRSZXNvdXJjZXMpOwotCQkJZWxzZQotCQkJCWNhY2hlTGFzdE5vblJlZnJlc2hGaWxlU3RhbXBzKGluY29uc2lzdGVudEZpbGVzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzQ2hlY2tpbmdDb25zaXN0ZW5jeSA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNhY2hlTGFzdE5vblJlZnJlc2hGaWxlU3RhbXBzLgotCSAqIAotCSAqIEBwYXJhbSBpbmNvbnNpc3RlbnRGaWxlcwotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZUxhc3ROb25SZWZyZXNoRmlsZVN0YW1wcyhMaXN0IGluY29uc2lzdGVudEZpbGVzKSB7Ci0JCWlmIChpbmNvbnNpc3RlbnRGaWxlcyAhPSBudWxsICYmICFpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCU1hcCBtYXAgPSBnZXRMYXN0Tm9uUmVmcmVzaFN0YXRlTWFwKCk7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCWxvbmcgc3RhbXAgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNvbnNpc3RlbnRGaWxlcy5zaXplKCk7IGkrKykgewotCQkJCWZpbGUgPSAoSUZpbGUpIGluY29uc2lzdGVudEZpbGVzLmdldChpKTsKLQkJCQlzdGFtcCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCQltYXAucHV0KGZpbGUsIG5ldyBMb25nKHN0YW1wKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY2FjaGVWYWxpZGF0ZVN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FjaGVWYWxpZGF0ZVN0YXRlKElTdGF0dXMgYVN0YXR1cywgTGlzdCByZWFkT25seVJlc291cmNlcywgTGlzdCByb05vblJlc291cmNlRmlsZXMpIHsKLQkJaWYgKGFTdGF0dXMuaXNPSygpKSB7Ci0JCQlpZiAocmVhZE9ubHlSZXNvdXJjZXMgIT0gbnVsbCAmJiAhcmVhZE9ubHlSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJUmVmZXJlbmNlZFJlc291cmNlIHJlcyA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkT25seVJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJCQlyZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZWFkT25seVJlc291cmNlcy5nZXQoaSk7Ci0JCQkJCVdvcmtiZW5jaFJlc291cmNlSGVscGVyLnNldFN5bmhyb25pemF0aW9uU3RhbXAocmVzLCBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAocmVzKSk7Ci0JCQkJfQotCQkJfQotCQkJcHJvdmlkZXIuY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUocm9Ob25SZXNvdXJjZUZpbGVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckxhc3ROb25SZWZyZXNoU3RhdGVNYXAoKSB7Ci0JCWlmIChsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwICE9IG51bGwpCi0JCQlsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFueUZpbGVDaGFuZ2VkU2luY2VMYXN0UmVmcmVzaFByb21wdC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jb25zaXN0ZW50RmlsZXMKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYW55RmlsZUNoYW5nZWRTaW5jZUxhc3RSZWZyZXNoUHJvbXB0KExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKLQkJaWYgKGluY29uc2lzdGVudEZpbGVzID09IG51bGwgfHwgaW5jb25zaXN0ZW50RmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobGFzdE5vblJlZnJlc2hTdGF0ZU1hcCA9PSBudWxsIHx8IGxhc3ROb25SZWZyZXNoU3RhdGVNYXAuaXNFbXB0eSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWludCBzaXplID0gaW5jb25zaXN0ZW50RmlsZXMuc2l6ZSgpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJTG9uZyBzdGFtcCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlmaWxlID0gKElGaWxlKSBpbmNvbnNpc3RlbnRGaWxlcy5nZXQoaSk7Ci0JCQlzdGFtcCA9IChMb25nKSBnZXRMYXN0Tm9uUmVmcmVzaFN0YXRlTWFwKCkuZ2V0KGZpbGUpOwotCQkJaWYgKHN0YW1wID09IG51bGwgfHwgKHN0YW1wLmxvbmdWYWx1ZSgpICE9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGFkZE90aGVySW5jb25zaXN0ZW50RmlsZXMoTGlzdCBpbmNvbnNpc3RlbnRGaWxlcykgewotCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpOwotCQlMaXN0IG5vblJlc0ZpbGVzID0gZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpOwotCQlpZiAobm9uUmVzRmlsZXMgIT0gbnVsbCkKLQkJCWluY29uc2lzdGVudEZpbGVzLmFkZEFsbChub25SZXNGaWxlcyk7Ci0JCXJldHVybiBpbmNvbnNpc3RlbnRGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpIHsKLQkJTGlzdCBmaWxlcyA9IHByb3ZpZGVyLmdldE5vblJlc291cmNlSW5jb25zaXN0ZW50RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwgJiYgIWZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmaWxlczsKLQkJLy9EZXRlcm1pbmUgY29uc2lzdGVuY3kgYmFzZWQgb24gdGhlIHN5bmNocm9uaXphdGlvbiBvZiB0aGUgSUZpbGUKLQkJZmlsZXMgPSBwcm92aWRlci5nZXROb25SZXNvdXJjZUZpbGVzKCk7Ci0JCWlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IGluY29uc2lzdGVudCA9IG51bGw7Ci0JCWludCBzaXplID0gZmlsZXMuc2l6ZSgpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZpbGUgPSAoSUZpbGUpIGZpbGVzLmdldChpKTsKLQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpICYmICFmaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkgewotCQkJCWlmIChpbmNvbnNpc3RlbnQgPT0gbnVsbCkKLQkJCQkJaW5jb25zaXN0ZW50ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWluY29uc2lzdGVudC5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluY29uc2lzdGVudCA9PSBudWxsKQotCQkJaW5jb25zaXN0ZW50ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIGluY29uc2lzdGVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRJbmNvbnNpc3RlbnRSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgbW9mUmVzb3VyY2VzID0gcHJvdmlkZXIuZ2V0UmVzb3VyY2VzKCk7Ci0JCUxpc3QgaW5jb25zaXN0ZW50ID0gbnVsbDsKLQkJaW50IHNpemUgPSBtb2ZSZXNvdXJjZXMuc2l6ZSgpOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVmUmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgbW9mUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXMpKSB7Ci0JCQkJcmVmUmVzID0gKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzOwotCQkJCWlmICghV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNDb25zaXN0ZW50KHJlZlJlcykgJiYgKHJlZlJlcy5pc0xvYWRlZCgpICYmICFyZWZSZXMuaXNOZXcoKSkpIHsKLQkJCQkJaWYgKGluY29uc2lzdGVudCA9PSBudWxsKQotCQkJCQkJaW5jb25zaXN0ZW50ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpbmNvbnNpc3RlbnQuYWRkKHJlZlJlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpbmNvbnNpc3RlbnQgPT0gbnVsbCkKLQkJCWluY29uc2lzdGVudCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiBpbmNvbnNpc3RlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RmlsZXMoTGlzdCByZWZSZXNvdXJjZXMpIHsKLQkJTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QocmVmUmVzb3VyY2VzLnNpemUoKSk7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVmUmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZlJlcyA9IChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlZlJlc291cmNlcy5nZXQoaSk7Ci0JCQlmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZWZSZXMpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYXQgbGVhc3QgdGhlIGZpcnN0IHRpbWUgYSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyCi0JICogYmVjb21lcyBhY3RpdmUgYW5kIGlzIGFib3V0IHRvIGVkaXQgaXRzIGNvbnRlbnRzLiBUaGUgcmV0dXJuZWQgSVN0YXR1cyBtYXkgaGF2ZSBhbiBFUlJPUgotCSAqIHN0YXR1cyB3aGljaCBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdCByb1Jlc291cmNlcywgbm9uUmVzUk9GaWxlcywgcm9GaWxlcyA9IG51bGw7Ci0JCUxpc3RbXSByZWFkT25seSA9IHNlbGVjdFJlYWRPbmx5UmVzb3VyY2VzKHByb3ZpZGVyLmdldFJlc291cmNlcygpKTsKLQkJcm9SZXNvdXJjZXMgPSByZWFkT25seVswXTsKLQkJcm9GaWxlcyA9IHJlYWRPbmx5WzFdOwotCQlub25SZXNST0ZpbGVzID0gc2VsZWN0UmVhZE9ubHlGaWxlcyhwcm92aWRlci5nZXROb25SZXNvdXJjZUZpbGVzKCkpOwotCQlpZiAobm9uUmVzUk9GaWxlcyAhPSBudWxsKSB7Ci0JCQlpZiAocm9GaWxlcyA9PSBudWxsKQotCQkJCXJvRmlsZXMgPSBub25SZXNST0ZpbGVzOwotCQkJZWxzZQotCQkJCXJvRmlsZXMuYWRkQWxsKG5vblJlc1JPRmlsZXMpOwotCQl9Ci0JCWlmIChyb0ZpbGVzID09IG51bGwgfHwgcm9GaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gT0tfU1RBVFVTOwotCQlJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlW3JvRmlsZXMuc2l6ZSgpXTsKLQkJcm9GaWxlcy50b0FycmF5KGZpbGVzKTsKLQkJT2JqZWN0IGN0eCA9IHByZXNlbnRlciAhPSBudWxsID8gcHJlc2VudGVyLmdldFZhbGlkYXRlRWRpdENvbnRleHQoKSA6IG51bGw7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgY3R4KTsKLQkJY2FjaGVWYWxpZGF0ZVN0YXRlKHJlc3VsdCwgcm9SZXNvdXJjZXMsIG5vblJlc1JPRmlsZXMpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQljaGVja0NvbnNpc3RlbmN5KHByZXNlbnRlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNlbGVjdFJlYWRPbmx5RmlsZXMuCi0JICogCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcGFyYW0gcm9GaWxlcwotCSAqLwotCXByaXZhdGUgTGlzdCBzZWxlY3RSZWFkT25seUZpbGVzKExpc3QgZmlsZXMpIHsKLQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZpbGVzOwotCQlpbnQgc2l6ZSA9IGZpbGVzLnNpemUoKTsKLQkJTGlzdCByZWFkT25seSA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJaWYgKGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJaWYgKHJlYWRPbmx5ID09IG51bGwpCi0JCQkJCXJlYWRPbmx5ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJCQlyZWFkT25seS5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZWxlY3RSZWFkT25seVJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEBwYXJhbSByb0ZpbGVzCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0W10gc2VsZWN0UmVhZE9ubHlSZXNvdXJjZXMoTGlzdCByZXNvdXJjZXMpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsIHx8IHJlc291cmNlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbmV3IExpc3RbXXtyZXNvdXJjZXMsIG51bGx9OwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaW50IHNpemUgPSByZXNvdXJjZXMuc2l6ZSgpOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlMaXN0IHJlYWRPbmx5ID0gbnVsbDsKLQkJTGlzdCByb0ZpbGVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJaWYgKHJlYWRPbmx5ID09IG51bGwpCi0JCQkJCXJlYWRPbmx5ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJCQlyZWFkT25seS5hZGQocmVzKTsKLQkJCQlpZiAocm9GaWxlcyA9PSBudWxsKQotCQkJCQlyb0ZpbGVzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJCQlyb0ZpbGVzLmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IExpc3RbXXtyZWFkT25seSwgcm9GaWxlc307Ci0JfQotCi0JcHJvdGVjdGVkIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKFJlZmVyZW5jZWRSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGaWxlcyhMaXN0IHNvbWVGaWxlcywgTGlzdCBpbmNvbnNpdGVudFJlc291cmNlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZWZyZXNoUnVubmFibGUgcnVubmFibGUgPSBuZXcgUmVmcmVzaFJ1bm5hYmxlKHNvbWVGaWxlcywgaW5jb25zaXRlbnRSZXNvdXJjZXMpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsKTsKLQkJaWYgKHJ1bm5hYmxlLmdldFRocm93bkV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQl0aHJvdyBydW5uYWJsZS5nZXRUaHJvd25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUmVmcmVzaEZpbGVzKExpc3Qgc29tZUZpbGVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWludCBzaXplID0gc29tZUZpbGVzLnNpemUoKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlmaWxlID0gKElGaWxlKSBzb21lRmlsZXMuZ2V0KGkpOwotCQkJaWYgKCFmaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCWVsc2UKLQkJCQlyZWZyZXNoUmVzb3VyY2UoZmlsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgUmVzb3VyY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+ZmlsZTwvY29kZT4gdG8gZm9yY2UgYQotCSAqIHJlZnJlc2guCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFJlc291cmNlKElGaWxlIGZpbGUpIHsKLQkJUmVzb3VyY2UgcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKGZpbGUpOwotCQlpZiAocmVzICE9IG51bGwpCi0JCQlyZXMudW5sb2FkKCk7Ci0JfQotCi0JLyoqCi0JICogRm9yY2UgdGhlIHJlc291cmNlcyB0byBub3QgYmUgZGlydHkgdG8gZW5zdXJlIHRoYXQgdGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGVpcgotCSAqIFJlc291cmNlU2V0IHdoZW4gdGhlaXIgZmlsZSBpcyByZWZyZXNoZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVJlc291cmNlc0ZvclJlZnJlc2goTGlzdCByZWZSZXNvdXJjZXMpIHsKLQkJUmVmZXJlbmNlZFJlc291cmNlIHJlcyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZWZSZXNvdXJjZXMuZ2V0KGkpOwotCQkJcmVzLnNldEZvcmNlUmVmcmVzaCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxhc3ROb25SZWZyZXNoU3RhdGVNYXAuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTWFwCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRMYXN0Tm9uUmVmcmVzaFN0YXRlTWFwKCkgewotCQlpZiAobGFzdE5vblJlZnJlc2hTdGF0ZU1hcCA9PSBudWxsKQotCQkJbGFzdE5vblJlZnJlc2hTdGF0ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzU0NWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHsKLQkvKioKLQkgKiBQcmVzZW50IHRvIHRoZSB1c2VyIHRoYXQgdGhlIDxjb2RlPmluY29uc2lzdGVudEZpbGVzPC9jb2RlPiB3aWxsIG5lZWQgdG8gYmUgcmVmcmVzaGVkIGluCi0JICogdGhlIHdvcmtiZW5jaC4gUmV0dXJuIHRydWUgaWYgdGhlIHJlZnJlc2ggc2hvdWxkIG9jY3VyLiBUaGUgTGlzdCB3aWxsIGJlIGEgbGlzdCBvZiBJRmlsZXMuCi0JICogCi0JICogQHBhcmFtIGluY29uc2lzdGVudEZpbGVzCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlUmVmcmVzaChMaXN0IGluY29uc2lzdGVudEZpbGVzKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGV4dCAoU2hlbGwpIHRoYXQgd291bGQgYmUgcGFzc2VkIHRvIHRoZSB2YWxpZGF0ZUVkaXQgbWV0aG9kLiBJZiB0aGlzIG1ldGhvZAotCSAqIHJldHVybnMgbnVsbCwgYSBwcm9tcHQgdG8gY2hlY2sgb3V0IGNvZGUgd2lsbCBub3QgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSN2YWxpZGF0ZUVkaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGVbXSwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JT2JqZWN0IGdldFZhbGlkYXRlRWRpdENvbnRleHQoKTsKLQotCS8qKgotCSAqIFByZXNlbnQgYSBkaWFsb2cgdG8gdGhlIHVzZXIgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBpcyBhYm91dCB0byBzYXZlIGFuZCBvdmVyd3JpdGUgdGhlCi0JICogbGlzdCBvZiA8Y29kZT5pbmNvbnNpdGVudEZpbGVzPC9jb2Rlcz4uICBSZXR1cm4gdHJ1ZSBpZgotCSAqIHRoZSBvdmVyd3JpdGUgc2hvdWxkIHByb2NlZWQuICBUaGUgbGlzdCBvZiA8Y29kZT5pbmNvbnNpdGVudEZpbGVzPC9jb2Rlcz4gd2lsbAotCSAqIGJlIGEgbGlzdCBvZiBJRmlsZXMuIAotCSAqIEBwYXJhbSBpbmNvbnNpc3RlbnRGaWxlcwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZU92ZXJ3cml0ZShMaXN0IGluY29uc2lzdGVudEZpbGVzKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgYW55IGFjdGlvbiB0aGF0IGlzIGFib3V0IHRvIGVkaXQgYW55IGNvbnRlbnRzIG9mIGFueSBJRmlsZS4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVN0YXRlKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9WYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9WYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlZmUwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvVmFsaWRhdGVFZGl0SGVhZGxlc3NDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxOCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkgSGVhZGxlc3MgVmFsaWRhdGUgRWRpdCBDb250ZXh0IEltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQgaW1wbGVtZW50cyBJVmFsaWRhdGVFZGl0Q29udGV4dCB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmTmVlZHNTdGF0ZVZhbGlkYXRpb24gPSB0cnVlOwotCXByb3RlY3RlZCBib29sZWFuIGZNZXNzYWdlVXAgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgRWRpdE1vZGVsIGZWYWxpZGF0b3IgPSBudWxsOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQjdmFsaWRhdGVTdGF0ZSgpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZSgpIHsKLQkJLy8gRm9yIG5vdyBkbyBub3RoaW5nIGluIGhlYWRsZXNzIHN0YXRlCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIjZ2V0VmFsaWRhdGVFZGl0Q29udGV4dCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWxpZGF0ZUVkaXRDb250ZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIjcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZU92ZXJ3cml0ZShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciNwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlUmVmcmVzaChqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlUmVmcmVzaChMaXN0IGluY29uc2lzdGVudEZpbGVzKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZhbGlkYXRlRWRpdExpc3RlbmVyI3NldE5lZWRzU3RhdGVWYWxpZGF0aW9uKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oYm9vbGVhbiBuZWVkc1N0YXRlVmFsaWRhdGlvbikgewotCQlmTmVlZHNTdGF0ZVZhbGlkYXRpb24gPSBuZWVkc1N0YXRlVmFsaWRhdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5JVmFsaWRhdGVFZGl0Q29udGV4dCNzZXRFZGl0TW9kZWwob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRNb2RlbChFZGl0TW9kZWwgZlZhbGlkYXRvcikgewotCQl0aGlzLmZWYWxpZGF0b3IgPSBmVmFsaWRhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LklWYWxpZGF0ZUVkaXRDb250ZXh0I3ZhbGlkYXRlU3RhdGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlzZXRFZGl0TW9kZWwoZWRpdE1vZGVsKTsKLQkJcmV0dXJuIHZhbGlkYXRlU3RhdGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjA5OTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3YmE0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2Uud3N0LmVudiBwbHVnaW4uCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgbWFzdGVyIHN3aXRjaCBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQgcGx1Z2luLgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9kZWJ1Zz10cnVlCi0KLSMgVHVybiBvbiBkaWZmZXJlbnQgdHJhY2luZyBsZXZlbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS9pbmZvPXRydWUKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2Uvd2FybmluZz10cnVlCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2Vycm9yPXRydWUKLQotIyBUdXJuIG9uIGRhdGEgZmxvdyB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2RhdGE9dHJ1ZQotCi0jIFR1cm4gb24gY29tbWFuZCB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2NvbW1hbmQ9dHJ1ZQotCi0jIFR1cm4gb24gZW1pdHRlciB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2VtaXR0ZXI9dHJ1ZQotCi0jIFR1cm4gb24gd2ViIHNlcnZpY2UgYW50IHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2Uvd3NfYW50PXRydWUKLQotIyBUdXJuIG9uIHdlYiBzZXJ2aWNlIGRldGFpbGVkIGNvbW1hbmQgZW5naW5lIHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2Uvd3NfZHRfY21kX2VuZ2luZT10cnVlCi0KLSMgVHVybiBvbiB3ZWIgc2VydmljZSBmcmFtZXdvcmsgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93c19mcmFtZXdvcms9dHJ1ZQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNzJlYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ4OTZkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6Mzc6MzYgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDNjZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIEphbiAzMCAxMDo0MDoyNiBFU1QgMjAwNgotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjZjEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudAotQnVuZGxlLVZlcnNpb246IDEuMC4yMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnBsdWdpbi5FbnZpcm9ubWVudFBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucmVsYXRpdmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnVyaS5maWxlO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7YnVuZGxlLXZlcnNpb249IlszLjEuMzAwLDQuMC4wKSIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlIAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWM0MDA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNTc1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUVudmlvcm5tZW50IFBsdWctaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkNThlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIElTdGF0dXNIYW5kbGVyIGludGVyZmFjZS4KLSAqIEl0IGFsbG93cyBjb2RlIHRoYXQgaXMgcmVwb3J0aW5nIHN0YXR1cyB0byBzcGVjaWZ5IGNob2ljZXMgdG8gdGhlIHVzZXIKLSAqIHdoaWNoIHRoaXMgcmVwb3J0aW5nIGNvZGUgY2FuIHJlYWN0IHRvLiAKLSAqCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaG9pY2UgewotCi0gIHByaXZhdGUgY2hhciAgIHNob3J0Y3V0ID0gJyAnOyAKLSAgcHJpdmF0ZSBTdHJpbmcgbGFiZWwgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0gIAkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2hvaWNlLgotCSAqLwotCXB1YmxpYyBDaG9pY2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENob2ljZS4KLQkgKiBAcGFyYW0gc2hvcnRjdXQgdGhlIHNpbmdsZSBsZXR0ZXIgc2hvcnRjdXQgZm9yIHRoaXMgY2hvaWNlLgotCSAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGZvciB0aGlzIGNob2ljZS4KLQkgKi8KLQlwdWJsaWMgQ2hvaWNlKGNoYXIgc2hvcnRjdXQsIFN0cmluZyBsYWJlbCkgewotCQl0aGlzLnNob3J0Y3V0ID0gc2hvcnRjdXQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENob2ljZS4KLSAgICogQHBhcmFtIHNob3J0Y3V0IHRoZSBzaW5nbGUgbGV0dGVyIHNob3J0Y3V0IGZvciB0aGlzIGNob2ljZS4KLSAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgZm9yIHRoaXMgY2hvaWNlLgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgY2hvaWNlLgotCSAqLwotCXB1YmxpYyBDaG9pY2UoY2hhciBzaG9ydGN1dCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5zaG9ydGN1dCA9IHNob3J0Y3V0OwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwuCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlc2NyaXB0aW9uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvcnRjdXQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgY2hhcgotCSAqLwotCXB1YmxpYyBjaGFyIGdldFNob3J0Y3V0KCkgewotCQlyZXR1cm4gc2hvcnRjdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvcnRjdXQuCi0JICogQHBhcmFtIHNob3J0Y3V0IFRoZSBzaG9ydGN1dCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydGN1dChjaGFyIHNob3J0Y3V0KSB7Ci0JCXRoaXMuc2hvcnRjdXQgPSBzaG9ydGN1dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMzJkMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgY29uZGl0aW9ucyByYWlzZWQgYnkgdGhlIElFbnZpcm9ubWVudC4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgLyoqCi0gICAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTc4OTgzMjc1ODk5NDAyMDM2TDsKLSAgCi0gIC8qKgotICAgKiBUaGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBFbnZpcm9ubWVudEV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBFbnZpcm9ubWVudEV4Y2VwdGlvbiAoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IEVudmlyb25tZW50RXhjZXB0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBFbnZpcm9ubWVudEV4Y2VwdGlvbiAoIElTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIHN1cGVyKHN0YXR1cyA9PSBudWxsID8gbnVsbCA6IHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFN0YXR1cyBvYmplY3QuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2M2ZlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2UuQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudDsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhIGNvbnNvbGUgZW52aXJvbm1lbnQuICBJdCBhbHNvIGNvbnRhaW5zIHN0YXRpYwotICogY29udmllbmNlcyBtZXRob2RzIGZvciBjcmVhdGluZyBhbiBJTG9nIG9iamVjdCBhcyB3ZWxsIGFzIGFuIEVjbGlwc2UgYW5kCi0gKiBGaWxlIFNjaGVtZS4KLSAqIAotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEVudmlyb25tZW50U2VydmljZQotewotICBzdGF0aWMgcHJpdmF0ZSBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhbiBFY2xpcHNlIGNvbnNvbGUgZW52aXJvbm1lbnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElFbnZpcm9ubWVudCBnZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCkKLSAgewotICAgIGlmKCBlbnZpcm9ubWVudCA9PSBudWxsICkgZW52aXJvbm1lbnQgPSBuZXcgQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudCgpOwotICAgIAotICAgIHJldHVybiBlbnZpcm9ubWVudDsgCi0gIH0gIAotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYW4gRWNsaXBzZSBsb2dnZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElMb2cgZ2V0RWNsaXBzZUxvZygpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgCi0gICAgcmV0dXJuIGVudmlyb25tZW50LmdldExvZygpOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhbiBFY2xpcHNlIHNjaGVtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVVSSVNjaGVtZSBnZXRFY2xpcHNlU2NoZW1lKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IGdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJU2NoZW1lICAgc2NoZW1lICAgICAgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHNjaGVtZSA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKS5uZXdVUklTY2hlbWUoICJwbGF0Zm9ybSIgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBzY2hlbWU7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYSBGaWxlIHNjaGVtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVVSSVNjaGVtZSBnZXRGaWxlU2NoZW1lKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IGdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJU2NoZW1lICAgc2NoZW1lICAgICAgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHNjaGVtZSA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKS5uZXdVUklTY2hlbWUoICJmaWxlIiApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgeyAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNjaGVtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTUwM2JlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBBbiBJRW52aXJvbm1lbnQgcHJvdmlkZXMgdGhlIG1lYW5zIGZvciBnZXR0aW5nIGEgCi0gKiA8b2w+Ci0gKiA8bGk+QSBsb2cgZm9yIHdyaXRpbmcgbWVzc2FnZXMgdG8gYSBsb2dnaW5nIGZhY2lsaXR5LDwvbGk+Ci0gKiA8bGk+QSBwcm9ncmVzcyBtb25pdG9yIGZvciByZWNlaXZpbmcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24sPC9saT4KLSAqIDxsaT5BIHN0YXR1cyBoYW5kbGVyIGZvciByZWNlaXZpbmcgYW5kIHByb2Nlc3Npbmcgc3RhdHVzIHJlcG9ydHMsPC9saT4KLSAqIDxsaT5BIGZhY3RvcnkgZm9yIHRoZSBoYW5kbGluZyBvZiBVUklzIChyZXNvdXJjZXMpLjwvbGk+Ci0gKiA8L29sPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVudmlyb25tZW50Ci17Ci0gIC8qKgotICAgKiBSZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS4KLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIGxvZ2dpbmcgZmFjaWxpdHkuCi0gICAqLwotICBwdWJsaWMgSUxvZyBnZXRMb2cgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBzdGF0dXMgaGFuZGxlci4KLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIHN0YXR1cyBoYW5kbGVyLgotICAgKi8KLSAgcHVibGljIElTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBJVVJJIGZhY3RvcnkuCi0gICAqIEhpbnQ6IEltcGxlbWVudGVycyBzaG91bGQgaW5zdXJlIHRoYXQgdGhlIEZhY3RvcnkgdGhleSByZXR1cm4KLSAgICogaGFzIGEgcmVmZXJlbmNlIHRvIHRoaXMgSUVudmlyb25tZW50IHNvIHRoYXQgSVVSSSBvYmplY3RzIGNhbgotICAgKiByZXBvcnQgcHJvZ3Jlc3MgYW5kIGFubm91bmNlIHN0YXR1cy4KLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIFVSSSBmYWN0b3J5LgotICAgKi8KLSAgcHVibGljIElVUklGYWN0b3J5IGdldFVSSUZhY3RvcnkgKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxZmNhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogSUxvZyBvYmplY3RzIHByb3ZpZGUgYSBtZWFucyBmb3IgbG9nZ2luZyBpbmZvcm1hdGlvbiBmb3IgRkZEQyBldGMuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9nCi17Ci0gIC8qKgotICAgKiBUaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIE9rLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSAwOwotICAKLSAgLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgaW5mb3JtYXRpb25hbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSAxOwotICAKLSAgLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgd2FybmluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSAyOwotICAKLSAgLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgYW4gZXJyb3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDQ7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBsb2dnaW5nIGlzIGVuYWJsZWQuCi0gICAqIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRvIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIGF0dGVtcHRpbmcKLSAgICogYSBjYWxsIHRvIG9uZSBvZiB0aGUgPGNvZGU+bG9nPC9jb2RlPiBtZXRob2RzLCBhcyB0aGV5IHdpbGwKLSAgICogcXVpZXRseSBkbyBub3RoaW5nIGlmIGxvZ2dpbmcgaXMgZGlzYWJsZWQuIFRoaXMgbWV0aG9kIGNhbiBiZQotICAgKiB1c2VmdWwsIGhvd2V2ZXIsIGFueXdoZXJlIHRoZSBjb3N0IG9mIGJ1aWxkaW5nIHVwIHRoZSBwYXJhbWV0ZXJzCi0gICAqIHRvIGEgbG9nIG1ldGhvZCBtaWdodCBiZSBoaWdoIGFuZCBiZXN0IGF2b2lkZWQgZXhjZXB0IHdoZW4gbG9nZ2luZwotICAgKiBpcyBlbmFibGVkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgbG9nZ2luZyBpcyBlbmFibGVkLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkICgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlYnVnIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZS4KLSAgICogCi0gICAqIEBwYXJhbSBvcHRpb24gdGhpcyBkZWJ1ZyBvcHRpb24gc3RyaW5nLgotICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlYnVnIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCAoU3RyaW5nIG9wdGlvbik7Ci0KLSAgLyoqCi0gICAqIExvZ3MgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIFRocm93YWJsZSB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGhyb3dhYmxlICk7Ci0gIAotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBvcHRpb24gdGhpcyBkZWJ1ZyBvcHRpb24gc3RyaW5nLgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgVGhyb3dhYmxlIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUgKTsKLQotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgU3RhdHVzIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIElTdGF0dXMgc3RhdHVzICk7Ci0gIAotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBvcHRpb24gdGhpcyBkZWJ1ZyBvcHRpb24gc3RyaW5nLgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIFN0YXR1cyB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBJU3RhdHVzIHN0YXR1cyApOwotCi0gIC8qKgotICAgKiBMb2dzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIG9iamVjdCBUaGUgT2JqZWN0IHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QgKTsKLSAgCi0gIC8qKgotICAgKiBMb2dzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBvcHRpb24gdGhpcyBkZWJ1ZyBvcHRpb24gc3RyaW5nLgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIE9iamVjdCB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0ICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDkyYTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBQcm9jZXNzZXMgc3RhdHVzIGV2ZW50cyByYWlzZWQgYnkgdGhlIGNhbGxlciBhbmQgcmV0dXJucyBhbgotICogaW5kaWNhdGlvbiBvZiBjaG9pY2VzIG1hZGUgYnkgdGhlIHJlY2lwaWVudCBvZiB0aGUgc3RhdHVzIGFuZAotICogbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gKiBwcm9jZXNpbmcuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhdHVzSGFuZGxlcgotewotICAvKioKLSAgICogUmVwb3J0cyB0aGUgZ2l2ZW4gU3RhdHVzIGFuZCBzZXQgb2YgcG9zc2libGUgcmVzcG9uc2VzLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIHRvIHJlcG9ydC4KLSAgICogQHBhcmFtIGNob2ljZXMgdGhlIGNob2ljZXMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBjaG9pY2UgbWFkZSBieSB0aGUgdXNlci9oYW5kbGVyLgotICAgKi8KLSAgcHVibGljIENob2ljZSByZXBvcnQgKCBJU3RhdHVzIHN0YXR1cywgQ2hvaWNlW10gY2hvaWNlcyApOwotICAKLSAgLyoqCi0gICAqIFJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSAgICogY29udGludWUgb3IgYWJvcnQuCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyB0byByZXBvcnQuCi0gICAqIEB0aHJvd3MgU3RhdHVzRXhjZXB0aW9uIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGhhbmRsZXIgZGVjaWRlcyB0aGUgY2FsbGVyCi0gICAqIHNob3VsZCBzdG9wIHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnQgKCBJU3RhdHVzIHN0YXR1cyApIHRocm93cyBTdGF0dXNFeGNlcHRpb247Ci0gIAotICAvKioKLSAgICogUmVwb3J0IHRoZSBnaXZlbiBFcnJvciBTdGF0dXMuICBObyB1c2VyIGZlZWRiYWNrIGlzIHByb3ZpZGVkLgotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBzdGF0dXMgdG8gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoIElTdGF0dXMgc3RhdHVzICk7Ci0gIAotICAvKioKLSAgICogUmVwb3J0IHRoZSBnaXZlbiBJbmZvIFN0YXR1cy4gIE5vIHVzZXIgZmVlZGJhY2sgaXMgcHJvdmlkZWQuCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIGluZm8gc3RhdHVzIHRvIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oIElTdGF0dXMgc3RhdHVzICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFmMWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJU3RhdHVzSGFuZGxlciBpbnRlcmZhY2UuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsU3RhdHVzSGFuZGxlciBpbXBsZW1lbnRzIElTdGF0dXNIYW5kbGVyCi17Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5DaG9pY2VbXSkKLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgcmVwb3J0KElTdGF0dXMgc3RhdHVzLCBDaG9pY2VbXSBjaG9pY2VzKSAKLSAgewotICAJQ2hvaWNlIHJlc3VsdCA9IG51bGw7Ci0gIAkKLSAgCS8vIEFsd2F5cyB0YWtlIHRoZSBmaXJzdCBjaG9pY2UgaWYgYXZhaWxhYmxlLgotICAgIGlmKCBjaG9pY2VzICE9IG51bGwgJiYgY2hvaWNlcy5sZW5ndGggPiAwICkKLSAgICB7Ci0gICAgCXJlc3VsdCA9IGNob2ljZXNbMF07Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydChJU3RhdHVzIHN0YXR1cykgdGhyb3dzIFN0YXR1c0V4Y2VwdGlvbgotICB7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJlcG9ydCBhbmQgZXJyb3IuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0RXJyb3JTdGF0dXMoSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihJU3RhdHVzIHN0YXR1cykKLSAgewotICAgIHJlcG9ydEVycm9yU3RhdHVzKCBzdGF0dXMgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlciNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0SW5mbyhJU3RhdHVzIHN0YXR1cykKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMWI4Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgdXNlZCBieSBTdGF0dXNIYW5kbGVycyB0byB0ZWxsIHRoZWlyCi0gKiBjYWxsZXJzIHRoYXQgcHJvY2Vzc2luZyBzaG91bGQgc3RvcC4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhdHVzRXhjZXB0aW9uIGV4dGVuZHMgRW52aXJvbm1lbnRFeGNlcHRpb24KLXsKLSAgLyoqCi0gICAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0gICAqICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2MTgxNDExNjAzMjIxMTk5OTJMOwotCi0gIC8qKgotICAgKiBUaGUgQ2hvaWNlIHRoYXQgbGVhZCB0byB0aGUgZXhjZXB0aW9uIGJlaW5nIHRocm93biwKLSAgICogaWYgYW55IChpZS4gbWF5IGJlIG51bGwpLgotICAgKi8KLSAgcHJvdGVjdGVkIENob2ljZSBjaG9pY2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIFN0YXR1cy4KLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXNFeGNlcHRpb24oIElTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIHN1cGVyKCBzdGF0dXMgKTsgIAotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlLgotICAgKiBUaGUgQ2hvaWNlIG1heSBiZSBudWxsLgotICAgKiBAcGFyYW0gY2hvaWNlIHRoZSBjaG9pY2UgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFN0YXR1c0V4Y2VwdGlvbiAoIENob2ljZSBjaG9pY2UgKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmNob2ljZSA9IGNob2ljZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBDaG9pY2UKLSAgICogYW5kIHN0YXR1cyBvYmplY3QuIFRoZSBDaG9pY2UgbWF5IGJlIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKiBAcGFyYW0gY2hvaWNlIHRoZSBjaG9pY2UgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFN0YXR1c0V4Y2VwdGlvbiAoIElTdGF0dXMgc3RhdHVzLCBDaG9pY2UgY2hvaWNlICkKLSAgewotICAgIHN1cGVyKHN0YXR1cyk7Ci0gICAgdGhpcy5jaG9pY2UgPSBjaG9pY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBDaG9pY2Ugb2JqZWN0IGluc2lkZSB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgZ2V0Q2hvaWNlICgpCi0gIHsKLSAgICByZXR1cm4gY2hvaWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGE2M2JkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBBIElVUkkgcmVwcmVzZW50cyBhIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZlci4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUkkKLXsKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RyaW5nIGZvcm0gb2YgdGhlIElVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgSVVSSVNjaGVtZSBmb3IgdGhlIHNjaGVtZSBvZiB0aGlzIElVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBJVVJJU2NoZW1lIGdldFVSSVNjaGVtZSAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmZiB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkgZXhpc3RzCi0gICAqIGFuZCBpcyBhIGxlYWYuIFJldHVybnMgdHJ1ZSBhbHdheXMgZm9yIG5vbi1oaWVyYXJjaGljYWwgc2NoZW1lcy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGVhZiAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMKLSAgICogYW5kIGlzIHJlYWRhYmxlLiBBIHJlYWRhYmxlIGxlYWYgcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgYW4KLSAgICogaW5wdXQgc3RyZWFtIGNhbiBiZSBvcGVuZWQgb24gdGhlIHJlc291cmNlLiBBIHJlYWRhYmxlIGZvbGRlcgotICAgKiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGZvbGRlciwgaWYgYW55LAotICAgKiBjYW4gYmUgZGV0ZXJtaW5lZCB2aWEgdGhlIGxpc3QoKSBvciB2aXNpdCgpIG1ldGhvZHMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJIGV4aXN0cwotICAgKiBhbmQgaXMgd3JpdGFibGUuIEEgd3JpdGFibGUgbGVhZiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBhbgotICAgKiBvdXRwdXQgc3RyZWFtIGNhbiBiZSBvcGVuZWQgb24gdGhlIHJlc291cmNlLiBBIHdyaXRhYmxlIGZvbGRlcgotICAgKiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBuZXcgcmVzb3VyY2VzIGNhbiBiZSBjcmVhdGVkIGluIHRoZSBmb2xkZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBJVVJJIGJlbG9uZ3MgdG8gYSBoaWVyYXJjaGljYWwgc2NoZW1lLgotICAgKiBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gICAqIHRoaXMuaXNIaWVyYXJjaGljYWwoKSA9PSB0aGlzLmdldFVSSVNjaGVtZSgpLmlzSGllcmFyY2hpY2FsKCkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWZmIHRoaXMgSVVSSSBpcyBhIHJlbGF0aXZlIElVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgSVVSSSBvZiB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhpcyBJVVJJLgotICAgKiBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIHBhcmVudCBVUkkuCi0gICAqLwotICBwdWJsaWMgSVVSSSBwYXJlbnQgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHBhcmFtIHJlbGF0aXZlVVJJIGEgcmVsYXRpdmUgVVJJLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcsIG5vcm1hbGl6ZWQgSVVSSSBmb3JtZWQgYnkgYXBwZW5kaW5nIHRoZSBnaXZlbgotICAgKiByZWxhdGl2ZSBJVVJJIHRvIHRoaXMgSVVSSS4gQm90aCBVUklzIG11c3QgYmUgaGllcmFyY2hpY2FsLgotICAgKiBUaGUgcmVzdWx0aW5nIElVUkkgd2lsbCBhbHdheXMgYmUgaGllcmFyY2hpY2FsLiBUaGUgZ2l2ZW4KLSAgICogSVVSSSBtdXN0IGJlIHJlbGF0aXZlLiBUaGlzIElVUkkgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLgotICAgKiB0aGUgcmVzdWx0aW5nIElVUkkgd2lsbCBiZSBlcXVpdmFsZW50bHkgcmVsYXRpdmUgb3IgYWJzb2x1dGUuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHJlbGF0aXZlVVJJIGlzIG5vdCByZWxhdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBJVVJJIGFwcGVuZCAoIElVUkkgcmVsYXRpdmVVUkkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIEdldHMgYW4gSW5wdXRTdHJlYW0gZm9yIHJlYWRpbmcgZnJvbSB0aGUgcmVzb3VyY2UKLSAgICogaWRlbnRpZmllZCBieSB0aGlzIGxlYWYgb3Igbm9uLWhpZXJhcmNoaWNhbCBJVVJJLgotICAgKiAKLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYSBzdHJlYW0gZm9yIHRoaXMgVVJJIGNhbiBub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIEdldHMgYW4gT3V0cHV0U3RyZWFtIGZvciB3cml0aW5nIHRvIHRoZSByZXNvdXJjZQotICAgKiBpZGVudGlmaWVkIGJ5IHRoaXMgbGVhZiBvciBub24taGllcmFyY2hpY2FsIElVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGEgc3RyZWFtIGZvciB0aGlzIFVSSSBjYW4gbm90IGJlIGNyZWF0ZWQuCi0gICAqLwotICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotICAgKiB0aGUgSVVSSS4gT24gY29tcGxldGlvbiwgdGhpcy5pc0xlYWYoKSA9PSB0cnVlLiBJZiBhIGxlYWYKLSAgICogcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4gSWYgYQotICAgKiBub24tbGVhZiByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyB1bmRlciB0aGlzIElVUkksIGNyZWF0aW9uCi0gICAqIHdpbGwgZmFpbCBhbmQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgdG91Y2hpbmcgdGhpcyBsZWFmIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hMZWFmICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgZm9sZGVyIHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gICAqIHRoZSBJVVJJLiBUaGUgc2NoZW1lIG9mIHRoZSBJVVJJIG11c3QgYmUgaGllcmFyY2hpY2FsLgotICAgKiBPbiBjb21wbGV0aW9uLCB0aGlzLmlzTGVhZigpID09IGZhbHNlLiBJZiBhIGZvbGRlciByZXNvdXJjZQotICAgKiBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLiBJZiBhIGxlYWYgcmVzb3VyY2UKLSAgICogYWxyZWFkeSBleGlzdHMgdW5kZXIgdGhpcyBJVVJJLCBjcmVhdGlvbiB3aWxsIGZhaWwgYW5kIGFuCi0gICAqIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHRvdWNoaW5nIHRoaXMgZm9sZGVyIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hGb2xkZXIgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogRXJhc2VzIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGVyYXNpbmcgdGhpcyByZXNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVyYXNlICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJlbmFtZXMgb3IgbW92ZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJCi0gICAqIHRvIHRoZSBuZXcgSVVSSS4KLSAgICogQHBhcmFtIG5ld1VSSSB0aGUgbmV3IFVSSSBuYW1lIGZvciB0aGlzIFVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHJlbmFtaW5nIHRoaXMgcmVzb3VyY2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW5hbWUgKCBJVVJJIG5ld1VSSSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFZpc2l0cyB0aGlzIHJlc291cmNlIGFuZCBpdHMgZGVjZW5kYW50cyBpbiBwcmUtb3JkZXIgZmFzaGlvbi4KLSAgICogRm9yIGVhY2ggcmVzb3VyY2UsIHdoZXRoZXIgYSBmb2xkZXIgb3IgYSBsZWFmLCB0aGUgZ2l2ZW4KLSAgICogSVVSSVZpc2l0b3IncyB2aXNpdCgpIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgSVVSSSBvZiB0aGUKLSAgICogcmVzb3VyY2UuIElmIElVUklWaXNpdG9yLnZpc2l0KCkgcmV0dXJucyBmYWxzZSwgdGhlIHZpc2l0aW5nCi0gICAqIGFsZ29yaXRobSB3aWxsICJwcnVuZSIgdGhlIGRlY2VuZGFudHMgb2YgdGhlIHJlc291cmNlIGFuZAotICAgKiBjYXJyeSBvbiB2aXNpdGluZyB0aGUgcmVzdCBvZiB0aGUgdHJlZS4gSWYgSVVSSVZpc2l0b3IudmlzaXQoKQotICAgKiByZXR1cm5zIHRydWUsIHRoZSB2aXNpdGluZyBhbGdvcml0aG0gd2lsbCBjb250aW51ZSBpdHMgd2FsawotICAgKiBkb3duIHRoZSByZXNvdXJjZSdzIGRlc2NlbmRhbnRzLgotICAgKiBAcGFyYW0gdXJpVmlzaXRvciB0aGUgdmlzaXRvciB0aGF0IHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIHJlc291cmNlIHZpc2l0ZWQuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB2aXNpdGluZyB0aGlzIHJlc291cmNlIGFuZCBpdHMgY2hpbGRyZW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCAoIElVUklWaXNpdG9yIHVyaVZpc2l0b3IgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBBcyBmb3IgdmlzaXQoSVVSSVZpc2l0b3IpLCBleGNlcHQgb25seSByZXNvdXJjZSBVUklzIHRoYXQgYXJlCi0gICAqIGFjY2VwdGVkIGJ5IHRoZSBnaXZlbiBmaWx0ZXIgYXJlIHZpc2l0ZWQuIElmIGEgZm9sZGVyIHJlc291cmNlCi0gICAqIGZhaWxzIHRvIGJlIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIsIHRoaXMgd2lsbCBub3QgcHJldmVudCB0aGUKLSAgICogdmlzaXRpbmcgYWxnb3JpdGhtIGZyb20gd2Fsa2luZyB0aGUgcmVzb3VyY2UncyBkZXNjZW5kYW50cy4KLSAgICogSXQgcmVtYWlucyB0aGUgam9iIG9mIHRoZSB2aXNpdG9yIHRvIGNob29zZSB3aGV0aGVyIG9yIG5vdCB0bwotICAgKiBwcnVuZSBhIGJyYW5jaCBieSByZXR1cm5pbmcgZmFsc2Ugb3IgdHJ1ZS4KLSAgICogQHBhcmFtIHVyaVZpc2l0b3IgdGhlIHZpc2l0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCByZXNvdXJjZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gdXJpRmlsdGVyIHRoZSByZXNvdXJjZSBmaWx0ZXIuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB2aXNpdGluZyB0aGlzIHJlc291cmNlIGFuZCBpdHMgY2hpbGRyZW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCAoIElVUklWaXNpdG9yIHVyaVZpc2l0b3IsIElVUklGaWx0ZXIgdXJpRmlsdGVyICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgVVJJcyBmb3IgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4KLSAgICogaGllcmFyY2hpY2FsLCBub24tbGVhZiBJVVJJLiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsCi0gICAqIHRob3VnaCBpdCBtYXkgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgY2hpbGRyZW4gZm9yIHRoaXMgVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgbG9jYXRpbmcgdGhlIGNoaWxkcmVuIGZvciB0aGlzIFVSSS4KLSAgICovCi0gIHB1YmxpYyBJVVJJW10gbGlzdCAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBBcyBmb3IgbGlzdCgpLCBleGNlcHQgb25seSBVUklzIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBnaXZlbgotICAgKiBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLAotICAgKiB0aG91Z2ggaXQgbWF5IHJldHVybiBhIHplcm8gbGVuZ3RoIGFycmF5LgotICAgKiBAcGFyYW0gdXJpRmlsdGVyIHRoZSBjaGlsZCBmaWx0ZXIuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlsdGVyZWQgY2hpbGRyZW4gZm9yIHRoaXMgVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgbG9jYXRpbmcgdGhlIGNoaWxkcmVuIGZvciB0aGlzIFVSSS4KLSAgICovCi0gIHB1YmxpYyBJVVJJW10gbGlzdCAoIElVUklGaWx0ZXIgdXJpRmlsdGVyICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzVVJMKCkgbWV0aG9kIGlzIGZhaXIgZ2FtZSwKLSAgICogaW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgSVVSSSBjYW4gYmUgY29udmVydGVkIGludG8gYSBVUkwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzVVJMICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBVUkwgb2JqZWN0IGZvciB0aGUgcmVzb3VyY2UgdW5kZXIgdGhpcyBJVVJJLgotICAgKiBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotICAgKiB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotICAgKiBpbiBjYXNlcyB3aGVyZSBVUklzIGFyZSBrbm93biB0byBiZSByZXByZXNlbnRhYmxlIGFzIFVSTHMuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyByZXR1cm5pbmcgdGhpcyBVUkwuCi0gICAqLwotICBwdWJsaWMgVVJMIGFzVVJMICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBhc0ZpbGUoKSBtZXRob2QgaXMgZmFpciBnYW1lLAotICAgKiBpbiBvdGhlciB3b3JkcywgaWYgdGhpcyBJVVJJIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIEZpbGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzRmlsZSAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIGEgRmlsZSBvYmplY3QgZm9yIHRoZSByZXNvdXJjZSB1bmRlciB0aGlzIElVUkkuCi0gICAqIFRoZXJlIGFyZSBtYW55IFVSSXMgYW5kIFVSSVNjaGVtZXMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kCi0gICAqIHdpbGwgZmFpbCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5Ci0gICAqIGluIGNhc2VzIHdoZXJlIFVSSXMgYXJlIGtub3duIHRvIGJlIGJhY2tlZCBieSBwaHlzaWNhbCBmaWxlcy4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHJldHVybmluZyB0aGlzIEZpbGUuCi0gICAqLwotICBwdWJsaWMgRmlsZSBhc0ZpbGUgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBJVVJJIGFzIGEgc3RyaW5nLgotICAgKiBFcXVpdmFsZW50IHRvIHRvU3RyaW5nKCkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nICgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg3MzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IElVUkkgYW5kIElVUklTY2hlbWUgb2JqZWN0cy4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUklGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi0gICAqIEBwYXJhbSB1cmkgdGhlIHVyaSB0byBiZSBjcmVhdGVkLgotICAgKiBAcmV0dXJuIHRoZSBuZXcgVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiB0aGUgdXJpIHBhcmFtZXRlciBpcyBub3QgYSB2YWxpZCBVUkkuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkgKCBTdHJpbmcgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJIGZvciB0aGUgZ2l2ZW4gVVJMLgotICAgKiBAcGFyYW0gdXJsIHRoZSB1cmwgdG8gdXNlIHRvIGNyZWF0ZSB0aGlzIFVSSQotICAgKiBAcmV0dXJuIHRoZSBuZXcgVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiB0aGUgdXJsIHBhcmFtZXRlciBpcyBub3QgYSB2YWxpZCB1cmwuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkgKCBVUkwgdXJsICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLSAgICogSWYgdGhlIHN0cmluZyBjb250YWlucyBubyBjb2xvbnMsIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGludGVycHJldHRlZAotICAgKiBhcyB0aGUgbmFtZSBvZiB0aGUgc2NoZW1lLiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgY29sb24sIHRoZW4gdGhlCi0gICAqIHN1YnN0cmluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBmaXJzdCBjb2xvbiBpcyBpbnRlcnByZXR0ZWQgYXMgdGhlCi0gICAqIG5hbWUgb2YgdGhlIHNjaGVtZSwgbWVhbmluZyB0aGUgY2FsbGVyIGNhbiBwYXNzIGluIGFueSBJVVJJIHN0cmluZyBpbgotICAgKiBvcmRlciB0byBnZXQgYSBJVVJJU2NoZW1lIG9iamVjdC4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWVPclVSSSB0aGUgc2NoZW1lIG9yIFVSSSBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgc2NoZW1lLgotICAgKiBAcmV0dXJuIHRoZSBuZXcgU2NoZW1lLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBzY2hlbWVPclVyaSBwYXJhbWV0ZXIgZG9lcyBub3QgY29udGFpbgotICAgKiBhIHZhbGlkIHNjaGVtZSBvciBVUkkgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBJVVJJU2NoZW1lIG5ld1VSSVNjaGVtZSAoIFN0cmluZyBzY2hlbWVPclVSSSApIHRocm93cyBVUklFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg1YzJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB2aXNpdCBvciBsaXN0IFVSSXMuCi0gKiBSZWZlciB0byB7QGxpbmsgSVVSSSNnZXRDaGlsZHJlbn0uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJRmlsdGVyCi17Ci0gIC8qKgotICAgKiBGaWx0ZXJzIHRoZSBnaXZlbiBJVVJJLgotICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSB0byBmaWx0ZXIuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVzb3VyY2UgbWF0Y2hlcyB0aGUgZmlsdGVyLAotICAgKiBmYWxzZSBpZiBpdCBkb2VzIG5vdC4KLSAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBvciByZWplY3RlZC4KLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhpcyB1cmkgaXMgYWNjZXB0ZWQuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIElmIHRoZSBmaWx0ZXIgZmFpbHMgdG8gYW5hbHl6ZSB0aGUgcmVzb3VyY2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzICggSVVSSSB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4NzYwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBBIElVUklTY2hlbWUgcmVwcmVzZW50cyBhIHNpbmdsZSBzY2hlbWUgZm9yIHNvbWUgYSBmYW1pbHkgb2YKLSAqIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZpZXJzLiBFeGFtcGxlcyBpbmNsdWRlICJmaWxlIiwgImh0dHAiCi0gKiBhbmQgInBsYXRmb3JtIiAoRWNsaXBzZSkuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJU2NoZW1lCi17Ci0gIC8qKgotICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdG8gYmUgY3JlYXRlZC4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IElVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHRoZSB1cmkgc3BlY2lmaWVkIGlzIG5vdCB2YWxpZCBvcgotICAgKiBjYW4gbm90IGJlIGNyZWF0ZWQuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkgKCBTdHJpbmcgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHBhcmFtIHVybCB0aGUgdXJsIHVzZWQgdG8gY3JlYXRlIHRoZSBVUkkuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBJVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiB0aGUgdXJsIHNwZWNpZmllZCBpcyBub3QgdmFsaWQgb3IKLSAgICogY2FuIG5vdCBiZSBjcmVhdGVkLgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJICggVVJMIHVybCApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB1cmkgdGhlIFVSSSB0byBiZSBjcmVhdGVkLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgSVVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgdGhlIHVyaSBzcGVjaWZpZWQgaXMgbm90IHZhbGlkIG9yCi0gICAqIGNhbiBub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSSAoIElVUkkgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9wZXIgbmFtZSBvZiB0aGUgc2NoZW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCAoKTsKLQotICAvKioKLSAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRvIGNoZWNrIGZvciB2YWxpZGl0eS4KLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGdpdmVuIElVUkkgc2F0aXNmaWVzIHRoZQotICAgKiBncmFtbWF0aWNhbCByZXF1aXJlbWVudHMgb2YgdGhlIHNjaGVtZS4gQWJzb2x1dGUgVVJJcyBtdXN0Ci0gICAqIGJlZ2luIHdpdGggIjxzY2hlbWU+OiIuIFJlbGF0aXZlIFVSSXMgbXVzdCBlaXRoZXIgbm90IGNvbnRhaW4KLSAgICogYSBjb2xvbiwgIjoiLCBvciBpdCBtdXN0IGJlZ2luIHdpdGggIi4vIi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgKCBJVVJJIHVyaSApOwotCi0gIC8qKgotICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgdG8gY2hlY2sgZm9yIHZhbGlkaXR5LgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIGdpdmVuCi0gICAqIElVUkkgaXMgdmFsaWQuIFRoZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBvZiB0aGUgU3RhdHVzIG9iamVjdAotICAgKiB3aWxsIGRlc2NyaWJlIHRoaXMuCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSAoIElVUkkgdXJpICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmEzZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB2aXNpdCBVUklzLgotICogUmVmZXIgdG8ge0BsaW5rIElVUkkjdmlzaXR9LgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSSVZpc2l0b3IKLXsKLSAgLyoqCi0gICAqIFZpc2l0cyB0aGUgZ2l2ZW4gSVVSSS4KLSAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2UgdG8gdmlzaXQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVzb3VyY2UncyBkZXNjZW5kYW50cyBzaG91bGQgYmUgdmlzaXRlZCwKLSAgICogb3IgZmFsc2UgaWYgdGhleSBzaG91bGQgbm90IGJlIHZpc2l0ZWQuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIElmIHRoZSB2aXNpdCBtZXRob2QgZmFpbHMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB2aXNpdCAoIElVUkkgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjY2IyZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlU2NoZW1lOwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElVUklGYWN0b3J5IGludGVyZmFjZS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVVJJRmFjdG9yeSBpbXBsZW1lbnRzIElVUklGYWN0b3J5Ci17Ci0gIHByaXZhdGUgSGFzaHRhYmxlICAgIHNjaGVtZXNfID0gbmV3IEhhc2h0YWJsZSgpOyAgCi0gIAotICAvKioKLSAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRvIGJlIGNyZWF0ZWQuCi0gICAqIEByZXR1cm4gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhpcyBVUkkuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBuZXdVUklTY2hlbWUoIHVyaSwgZmFsc2UgKTsKLSAgICAKLSAgICByZXR1cm4gc2NoZW1lLm5ld1VSSSggdXJpICk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHVybCB0aGUgdXJsIHRvIHVzZSB0byBjcmVhdGUgdGhpcyB1cmkuCi0gICAqIEByZXR1cm4gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJIGZvciB0aGUgZ2l2ZW4gVVJMLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhpcyBVUkkuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoVVJMIHVybCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBuZXdVUklTY2hlbWUoIHVybC50b1N0cmluZygpLCBmYWxzZSApOwotICAgIAotICAgIHJldHVybiBzY2hlbWUubmV3VVJJKCB1cmwgKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2NoZW1lT3JVUkkgdGhlIHNjaGVtZSBuYW1lIG9yIFVSSSBmcm9tIHdoaWNoIHRoaXMgc2NoZW1lIGlzIAotICAgKiB0byBiZSBjcmVhdGVkLgotICAgKiBAcmV0dXJuIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSVNjaGVtZSBmb3IgdGhlIGdpdmVuIHNjaGVtZSBzdHJpbmcuCi0gICAqIElmIHRoZSBzdHJpbmcgY29udGFpbnMgbm8gY29sb25zLCB0aGUgZW50aXJlIHN0cmluZyBpcyBpbnRlcnByZXR0ZWQKLSAgICogYXMgdGhlIG5hbWUgb2YgdGhlIHNjaGVtZS4gSWYgdGhlIHN0cmluZyBjb250YWlucyBhIGNvbG9uLCB0aGVuIHRoZQotICAgKiBzdWJzdHJpbmcgdXAgdG8gYnV0IGV4Y2x1ZGluZyB0aGUgZmlyc3QgY29sb24gaXMgaW50ZXJwcmV0dGVkIGFzIHRoZQotICAgKiBuYW1lIG9mIHRoZSBzY2hlbWUsIG1lYW5pbmcgdGhlIGNhbGxlciBjYW4gcGFzcyBpbiBhbnkgSVVSSSBzdHJpbmcgaW4KLSAgICogb3JkZXIgdG8gZ2V0IGEgSVVSSVNjaGVtZSBvYmplY3QuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGlzIFVSSSBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgSVVSSVNjaGVtZSBuZXdVUklTY2hlbWUoU3RyaW5nIHNjaGVtZU9yVVJJKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VVJJU2NoZW1lKCBzY2hlbWVPclVSSSwgdHJ1ZSApOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgcmVnaXN0ZXJzIGEgc2NoZW1lIGZvciBhIHBhcnRpY3VsYXIgcHJvdG9jb2wuCi0gICAqIAotICAgKiBAcGFyYW0gcHJvdG9jb2wgdGhlIHByb3RvY29sLgotICAgKiBAcGFyYW0gc2NoZW1lIHRoZSBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlclNjaGVtZSggU3RyaW5nIHByb3RvY29sLCBJVVJJU2NoZW1lIHNjaGVtZSApCi0gIHsKLSAgICBzY2hlbWVzXy5wdXQoIHByb3RvY29sLCBzY2hlbWUgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBJVVJJU2NoZW1lIG5ld1VSSVNjaGVtZShTdHJpbmcgc2NoZW1lT3JVUkksIGJvb2xlYW4gY2hlY2tGb3JTY2hlbWUgKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJVVJJU2NoZW1lIG5ld1NjaGVtZSA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHNjaGVtZU9yVVJJID09IG51bGwgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAKLSAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19OVUxMX0FSR19TUEVDSUZJRUQsICJuZXdVUklTY2hlbWUiKSwgbnVsbCApICk7Ci0gICAgfQotICAgIAotICAgIGludCBjb2xvbiAgICA9IHNjaGVtZU9yVVJJLmluZGV4T2YoJzonKTsKLSAgICBpbnQgc2xhc2ggICAgPSBzY2hlbWVPclVSSS5pbmRleE9mKCcvJyk7Ci0gICAgCi0gICAgLy8gQSBwcm90b2NvbCB3YXMgc3BlY2lmaWVkLiAgTm90ZTogYSBjb2xvbiBhcHBlYXJpbmcgYWZ0ZXIgYSBwYXRoIGlzIG5vdAotICAgIC8vIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgcHJvdG9jb2wgZm9yIHRoaXMgSVVSSS4KLSAgICBpZiggKCBjaGVja0ZvclNjaGVtZSAmJiBjb2xvbiA9PSAtMSApIHx8Ci0gICAgICAgICggY29sb24gIT0gLTEgJiYgc2xhc2ggPT0gLTEpIHx8IAotICAgICAgICAoIGNvbG9uICE9IC0xICYmIGNvbG9uIDwgc2xhc2ggKSApCi0gICAgewotICAgICAgLy8gSWYgY29sb24gaXMgLTEgdGhlbiB3ZSB3aWxsIHRyZWF0IHRoZSBlbnRpcmUgaW5wdXQgcGFyYW1ldGVyIGFzIHRoZSBwcm90b2NvbC4KLSAgICAgIGlmKCBjb2xvbiA9PSAtMSApIGNvbG9uID0gc2NoZW1lT3JVUkkubGVuZ3RoKCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBwcm90b2NvbCA9IHNjaGVtZU9yVVJJLnN1YnN0cmluZygwLCBjb2xvbiApOwotICAgICAgbmV3U2NoZW1lICAgICAgID0gKElVUklTY2hlbWUpc2NoZW1lc18uZ2V0KCBwcm90b2NvbCApOwotICAgICAgCi0gICAgICBpZiggbmV3U2NoZW1lID09IG51bGwgKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIAotICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfU0NIRU1FX05PVF9GT1VORCwgc2NoZW1lT3JVUkkgKSwgbnVsbCApICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoIHNjaGVtZU9yVVJJLnN0YXJ0c1dpdGgoICIvIikgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsCi0gICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfQUJTT0xVVEVfUEFUSF9XSVRIT1VUX1NDSEVNRSwgc2NoZW1lT3JVUkkgKSwgbnVsbCApICk7Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG5ld1NjaGVtZSA9IG5ldyBSZWxhdGl2ZVNjaGVtZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmV3U2NoZW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiNzU0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9zdCBleGNlcHRpb25zIHRocm93biBieSBJVVJJIGNsYXNzZXMuCi0gKiBFdmVyeSBVUklFeGNlcHRpb24gY2FycmllcyBhIElVUkkgYW5kIGEgU3RhdHVzLCBlYWNoIG9mIHdoaWNoIG1heQotICogYmUgbnVsbC4gVGhlIGdldE1lc3NhZ2UoKSBtZXRob2QgYXMgaW5oZXJpdGVkIGZyb20gRXhjZXB0aW9uIHdpbGwKLSAqIHJldHVybiB0aGUgbWVzc2FnZSBmcm9tIHRoZSBVUklFeGNlcHRpbidzIFN0YXR1cyBvYmplY3QsIGlmIGFueS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVVJJRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gIC8qKgotICAgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODEzMDI3MTQyNDc1NjAxOEw7Ci0KLSAgLyoqCi0gICAqIEEgU3RhdHVzIG9iamVjdCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGV4Y2VwdGlvbiwKLSAgICogaWYgYXBwbGljYWJsZS4KLSAgICovCi0gIHByb3RlY3RlZCBJU3RhdHVzIHN0YXR1czsKLQotICAvKioKLSAgICogVGhlIElVUkkgZm9yIHdoaWNoIHRoZSBleGNlcHRpb24gb2NjdXJlZCwKLSAgICogaWYgYXBwbGljYWJsZS4KLSAgICovCi0gIHByb3RlY3RlZCBJVVJJIHVyaTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBVUklFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gU3RhdHVzLgotICAgKiBUaGUgc3RhdHVzIG1heSBiZSBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFVSSUV4Y2VwdGlvbiAoIElTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBVUklFeGNlcHRpb24gZm9yIHRoZSBnaXZlbiBTdGF0dXMgYW5kIElVUkksCi0gICAqIGVhY2ggb2Ygd2hpY2ggbWF5IGJlIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgVVJJRXhjZXB0aW9uICggSVN0YXR1cyBzdGF0dXMsIElVUkkgdXJpICkKLSAgewotICAgIHN1cGVyKHN0YXR1cyAhPSBudWxsID8gc3RhdHVzLmdldE1lc3NhZ2UoKSA6IG51bGwpOwotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICAgIHRoaXMudXJpID0gdXJpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgU3RhdHVzIG9iamVjdCBpbnNpZGUgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMgKCkKLSAgewotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBJVVJJIGluc2lkZSB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBJVVJJIGdldFVSSSAoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzljOTVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5OdWxsU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlNpbXBsZVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC51cmkuZmlsZS5GaWxlU2NoZW1lOwotCi0KLS8qKgotICogIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbiBhIGhlYWRsZXNzIEVjbGlwc2UgZW52aXJvbm1lbnQuICAKLSAqLwotcHVibGljIGNsYXNzIENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQgaW1wbGVtZW50cyBJRW52aXJvbm1lbnQKLXsKLQlwcml2YXRlIFNpbXBsZVVSSUZhY3RvcnkgIHVyaUZhY3RvcnlfICAgICAgPSBudWxsOwotCXByaXZhdGUgSVN0YXR1c0hhbmRsZXIgICAgIHN0YXR1c0hhbmRsZXJfICAgPSBudWxsOwotCSAgCi0JcHVibGljIENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQoKQotCXsKLQkgIHRoaXMoIG5ldyBOdWxsU3RhdHVzSGFuZGxlcigpICk7CQotCX0KLQkKLQlwdWJsaWMgQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudCggSVN0YXR1c0hhbmRsZXIgIHN0YXR1c0hhbmRsZXIgKQotCXsKLQkgIHVyaUZhY3RvcnlfICAgICAgPSBuZXcgU2ltcGxlVVJJRmFjdG9yeSgpOwotCSAgc3RhdHVzSGFuZGxlcl8gICA9IHN0YXR1c0hhbmRsZXI7Ci0JICAgIAotCSAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJwbGF0Zm9ybSIsIG5ldyBFY2xpcHNlU2NoZW1lKCB0aGlzICkgKTsKLQkgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAiZmlsZSIsIG5ldyBGaWxlU2NoZW1lKCkgKTsKLQl9Ci0JCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCNnZXRMb2coKQotCSAqLwotCXB1YmxpYyBJTG9nIGdldExvZygpIAotCXsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTG9nKCk7Ci0JfQotCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCNnZXRTdGF0dXNIYW5kbGVyKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c0hhbmRsZXIgZ2V0U3RhdHVzSGFuZGxlcigpIAotCXsKLQkJcmV0dXJuIHN0YXR1c0hhbmRsZXJfOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCNnZXRVUklGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgSVVSSUZhY3RvcnkgZ2V0VVJJRmFjdG9yeSgpIAotCXsKLQkJcmV0dXJuIHVyaUZhY3RvcnlfOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VMb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VMb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkNzVlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjIxICAgMTAwMzY0IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnBsdWdpbi5FbnZpcm9ubWVudFBsdWdpbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMb2cgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cgCi17Ci0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZyBsb2dnZXI7Ci0JCi0JcHVibGljIEVjbGlwc2VMb2coKSAKLQl7Ci0JCVBsdWdpbiBwbHVnaW4gPSBFbnZpcm9ubWVudFBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCQkKLSAgICBsb2dnZXIgPSBwbHVnaW4uZ2V0TG9nKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nI2lzRW5hYmxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgCi0gIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5FbnZpcm9ubWVudC5JTG9nI2lzRW5hYmxlZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChTdHJpbmcgb3B0aW9uKSB7Ci0JCXJldHVybiAidHJ1ZSIuZXF1YWxzKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlLyIKLQkJCQkrIG9wdGlvbikpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsCi0JCQlTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0KSAKLQl7Ci0JCQotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCQljYXNlIElMb2cuRVJST1IgOgotCQkJCXsKLQkJCQkJaWYgKGlzRW5hYmxlZCgiZXJyb3IiKSkKLQkJCQkJewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkUgIgotCQkJCQkJCSsgY2FsbGVyICsgIjo6IiArIG1ldGhvZCArICI6IG9iamVjdD0iCi0JCQkJCQkJKyBvYmplY3Q7Ci0JCQkJCQlsb2coIHNldmVyaXR5LCBtZXNzYWdlLCBudWxsICk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWNhc2UgSUxvZy5XQVJOSU5HIDoKLQkJCQl7Ci0JCQkJCWlmIChpc0VuYWJsZWQoIndhcm5pbmciKSkKLQkJCQkJewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pCi0JCQkJCQkJCSsgIlcgIiArIGNhbGxlciArICI6OiIgKyBtZXRob2QKLQkJCQkJCQkJKyAiOiBvYmplY3Q9IiArIG9iamVjdDsKLQkJCQkJCWxvZyggc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwgKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCi0JCQkJY2FzZSBJTG9nLklORk8gOgotCQkJCXsKLQkJCQkJaWYgKGlzRW5hYmxlZCgiaW5mbyIpKQotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiCi0JCQkJCQkJCSsgY2FsbGVyICsgIjo6IiArIG1ldGhvZCArICI6IG9iamVjdD0iCi0JCQkJCQkJCSsgb2JqZWN0OwotCQkJCQkJbG9nKCBzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCApOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWxvZyhzZXZlcml0eSwgbWVzc2FnZU51bSwgY2FsbGVyLCBtZXRob2QsIChPYmplY3Qpc3RhdHVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuVGhyb3dhYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2coIHNldmVyaXR5LCBtZXNzYWdlTnVtLCBjYWxsZXIsIG1ldGhvZCwgKE9iamVjdCludWxsICk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwKLQkJCU9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QpIAotCXsKLQkJaWYgKGlzRW5hYmxlZChvcHRpb24pKQotCQl7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiICsgY2FsbGVyCi0JCQkJCSsgIjo6IiArIG1ldGhvZCArICI6IG9iamVjdD0iICsgb2JqZWN0OwotCQkJbG9nKHNldmVyaXR5LCBtZXNzYWdlLCBudWxsICk7Ci0JCX0JCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwKLQkJCU9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUpIAotCXsKLQkJaWYgKGlzRW5hYmxlZChvcHRpb24pKSAKLQkJewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIiArIGNhbGxlcgotCQkJCQkrICI6OiIgKyBtZXRob2Q7Ci0JCQlsb2coIHNldmVyaXR5LCBtZXNzYWdlLCB0aHJvd2FibGUgKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyNsb2coaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLAotCQkJT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgSVN0YXR1cyBzdGF0dXMpIAotCXsKLQkJbG9nZ2VyLmxvZyggc3RhdHVzICk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2VOdW1TdHJpbmcoaW50IG1lc3NhZ2VOdW0pIHsKLQkJU3RyaW5nIG1lc3NhZ2VOdW1TdHJpbmcgPSAiSVdBQiI7Ci0JCWlmIChtZXNzYWdlTnVtID4gOTk5OSB8fCBtZXNzYWdlTnVtIDwgMCkKLQkJCW1lc3NhZ2VOdW0gPSA5OTk5OyAvL2RlZmF1bHQgbWVzc2FnZSBudW1iZXIKLQkJbWVzc2FnZU51bVN0cmluZyArPSAobmV3IEludGVnZXIobWVzc2FnZU51bSkpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBtZXNzYWdlTnVtU3RyaW5nOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjICkKLQl7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKCBzZXZlcml0eSwgImlkIiwgMCwgbWVzc2FnZSwgZXhjICk7Ci0JCWxvZ2dlci5sb2coIHN0YXR1cyApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VTY2hlbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MmM0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucmVsYXRpdmUuUmVsYXRpdmVVUkk7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VTY2hlbWUgaW1wbGVtZW50cyBJVVJJU2NoZW1lCi17Ci0gIHByaXZhdGUgSUVudmlyb25tZW50ICAgICAgZW52aXJvbm1lbnRfOwotICAKLSAgcHVibGljIEVjbGlwc2VTY2hlbWUoIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICBlbnZpcm9ubWVudF8gPSBlbnZpcm9ubWVudDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gInBsYXRmb3JtIjsgIAotICB9Ci0gIAotICAvKioKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElVUkkgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIAotICAgIGlmKCB1cmkgPT0gbnVsbCApIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IHVyaS5nZXRVUklTY2hlbWUoKTsKLSAgICAgIAotICAgICAgaWYoIHNjaGVtZS50b1N0cmluZygpLmVxdWFscyggInJlbGF0aXZlIikgKSByZXR1cm4gc2NoZW1lLmlzVmFsaWQoIHVyaSApOwotICAgICAgICAKLSAgICAgIGdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaS50b1N0cmluZygpICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBuZXdVUkkgPSBudWxsOwotICAgIAotICAgIGlmKCB1cmkgIT0gbnVsbCAmJiB1cmkuc3RhcnRzV2l0aCggInBsYXRmb3JtOiIpICkKLSAgICB7Ci0gICAgICAvLyBUaGUgcGxhdGZvcm0gaGFzIGJlZW4gc3BlY2lmaWVkIHNvIGtlZXAgaXQgYXMgaXMuCi0gICAgICBuZXdVUkkgPSB1cmk7Ci0gICAgfQotICAgIGVsc2UgaWYoIHVyaSA9PSBudWxsIHx8IHVyaS5pbmRleE9mKCAiOiIpICE9IC0xICkKLSAgICB7Ci0gICAgICAvLyBUaGUgcGxhdGZvcm0gdXJpIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gc29tZSBvdGhlciBwcm90b2NvbC4gCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsCi0gICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfSU5WQUxJRF9QTEFURk9STV9VUkwsdXJpKSwgbnVsbCApICk7Ci0gICAgICAgICAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmKCB1cmkuc3RhcnRzV2l0aCggIi8iKSApCi0gICAgewotICAgICAgLy8gVGhlIHBsYXRmb3JtIHNjaGVtZSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIHNvIHdlIHdpbGwgYWRkIGl0LgotICAgICAgbmV3VVJJID0gInBsYXRmb3JtOi9yZXNvdXJjZSIgKyB1cmk7Ci0gICAgfQotICAgIAotICAgIGlmKCBuZXdVUkkgPT0gbnVsbCApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEVjbGlwc2VVUkkoIG5ld1VSSSwgZW52aXJvbm1lbnRfICk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoSVVSSSB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXdVUkkoIHVyaSA9PSBudWxsID8gbnVsbCA6IHVyaS50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKioKLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSShVUkwgdXJsKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VVJJKCB1cmwgPT0gbnVsbCA/IG51bGwgOiB1cmwudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJVVJJIHVyaSkKLSAgewotICAgIElTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IHVyaS5nZXRVUklTY2hlbWUoKTsKLSAgICAgIAotICAgICAgaWYoIHNjaGVtZS50b1N0cmluZygpLmVxdWFscyggInJlbGF0aXZlIikgKSByZXR1cm4gc2NoZW1lLnZhbGlkYXRlKCB1cmkgKTsKLSAgICAgIAotICAgICAgZ2V0UGF0aEZyb21QbGF0Zm9ybVVSSSggdXJpLnRvU3RyaW5nKCkgKTsKLSAgICAgIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBleGMuZ2V0U3RhdHVzKCk7IAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0cyB0aGUgInBsYXRmb3JtOi9yZXNvdXJjZSIgSVBhdGggZ2l2ZW4gYSB1cmwKLSAgICogCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhdGhGcm9tUGxhdGZvcm1VUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbiAKLSAgewotICAgIFN0cmluZyByZXNvdXJjZUZpbGUgPSBudWxsOwotICAgIFVSTCAgICB1cmwgICAgICAgICAgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHVybCA9IG5ldyBVUkwoIHVyaSApOyAKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsgCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsCi0gICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfSU5WQUxJRF9QTEFURk9STV9VUkwsIHVyaSApLCBleGMgKSApOwotICAgIH0KLSAgICAKLSAgICBpZiggdXJsID09IG51bGwgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oCi0gICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwKLSAgICAgICAgICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19JTlZBTElEX1BMQVRGT1JNX1VSTCwgdXJpICksIG51bGwgKSApOwotICAgIH0KLSAgICBpZiggdXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpICkgCi0gICAgewotICAgICAgU3RyaW5nIHJlc291cmNlVVJMID0gdXJsLmdldEZpbGUoKTsKLSAgICAgIAotICAgICAgaWYgKHJlc291cmNlVVJMLnN0YXJ0c1dpdGgoIi9yZXNvdXJjZSIpKSAKLSAgICAgIHsKLSAgICAgICAgcmVzb3VyY2VGaWxlID0gcmVzb3VyY2VVUkwuc3Vic3RyaW5nKDEwKTsgICAvLyBvbWl0IHRoZSAiL3Jlc291cmNlIiBwb3J0aW9uCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLAotICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfSU5WQUxJRF9QTEFURk9STV9VUkwsdXJsLmdldEZpbGUoKSApLCBudWxsICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc291cmNlRmlsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIGFuIGFic29sdXRlIElQYXRoCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgcGxhdGZvcm0gSVVSSSBmb3IgdGhpcyBwYXRoLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkxGcm9tUGF0aCggSVBhdGggYWJzb2x1dGVQYXRoICkKLSAgewotICAgIHJldHVybiAicGxhdGZvcm06L3Jlc291cmNlIiArIGFic29sdXRlUGF0aDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZVVSSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDYyYTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucmVsYXRpdmUuUmVsYXRpdmVVUkk7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VVUkkgZXh0ZW5kcyBSZWxhdGl2ZVVSSQotewotICBwcml2YXRlIElFbnZpcm9ubWVudCAgIGVudmlyb25tZW50XzsKLSAgcHJpdmF0ZSBFY2xpcHNlU2NoZW1lICBzY2hlbWVfOwotICBwcml2YXRlIEZpbGUgICAgICAgICAgIGZpbGVfOwotICAKLSAgcHVibGljIEVjbGlwc2VVUkkoIFN0cmluZyB1cmksIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICBzdXBlciggdXJpICk7Ci0gICAgCi0gICAgZW52aXJvbm1lbnRfICA9IGVudmlyb25tZW50OwotICAgIHNjaGVtZV8gICAgICAgPSBuZXcgRWNsaXBzZVNjaGVtZSggZW52aXJvbm1lbnQgKTsKLSAgICBmaWxlXyAgICAgICAgID0gZ2V0RmlsZSgpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjZXJhc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXJhc2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkgCi0gICAgewotICAgICAgSVJlc291cmNlIGZpbGUgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgKSAKLSAgICAgIHsKLSAgICAgICAgaWYoIGZpbGUgaW5zdGFuY2VvZiBJRmlsZSApCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlUmVzb3VyY2VVdGlscy5kZWxldGVGaWxlKCAoSUZpbGUpZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZmlsZSBpbnN0YW5jZW9mIElGb2xkZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZVJlc291cmNlVXRpbHMuZGVsZXRlRm9sZGVyKCAoSUZvbGRlcilmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFN0YXR1c0hhbmRsZXIoKSApOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gZXhjICkgCi0gICAgeyAgICAgIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjZ2V0SW5wdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIC8vIElmIGEgY2xhc3MgY2FzdCBleGNlcHRpb24gaXMgdGhyb3cgaXQgd2lsbCBiZSBwcm9wb2dhdGVkIGFzCi0gICAgICAvLyBhIFVSSUV4Y2VwdGlvbi4KLSAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpZ2V0UmVzb3VyY2UoKTsKLQotICAgICAgLy9jYWxsIGdldENvbnRlbnRzIG9uIHRoZSBlY2xpcHNlIEZpbGUgb2JqZWN0Ci0gICAgICBpZiggZmlsZSAhPSBudWxsICkgCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldENvbnRlbnRzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBUaHJvd2FibGUgZXhjICkgCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBmb2xkZXIgZXhpc3RzLgotICAgIElVUkkgcGFyZW50ID0gcGFyZW50KCk7Ci0gICAgCi0gICAgaWYoICFwYXJlbnQuaXNQcmVzZW50KCkgKQotICAgIHsKLSAgICAgIHBhcmVudCgpLnRvdWNoRm9sZGVyKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBnZXRPdXRTdHJlYW0oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNnZXRVUklTY2hlbWUoKQotICAgKi8KLSAgcHVibGljIElVUklTY2hlbWUgZ2V0VVJJU2NoZW1lKCkKLSAgewotICAgIHJldHVybiBzY2hlbWVfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2lzTGVhZigpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIHJlc291cmNlICE9IG51bGwgJiYgCi0gICAgICAgICAgcmVzb3VyY2UuZXhpc3RzKCkgJiYgCi0gICAgICAgICAgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgLy8gVGhpcyBJVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNpc1ByZXNlbnQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkgKQotICAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgLy8gVGhpcyBJVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjaXNSZWFkYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgKQotICAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgLy8gVGhpcyBJVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2lzUmVsYXRpdmUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSgpCi0gIHsgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2lzV3JpdGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcml0YWJsZSgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIAotICAgICAgICAgIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICYmIAotICAgICAgICAgICFyZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkgKQotICAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgLy8gVGhpcyBJVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjbGlzdCgpCi0gICAqLwotICBwdWJsaWMgSVVSSVtdIGxpc3QoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgICAgPSBnZXRSZXNvdXJjZSgpOwotICAgIElVUklbXSAgICAgdXJpQ2hpbGRyZW4gPSBuZXcgSVVSSVswXTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgKQotICAgIHsKLSAgICAgIElGb2xkZXIgICAgIGZvbGRlciAgID0gKElGb2xkZXIpcmVzb3VyY2U7Ci0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJUmVzb3VyY2VbXSBjaGlsZHJlbiAgICA9IGZvbGRlci5tZW1iZXJzKCk7ICAKLSAgCi0gICAgICAgIHVyaUNoaWxkcmVuID0gbmV3IElVUklbY2hpbGRyZW4ubGVuZ3RoXTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgSVBhdGggcGF0aCA9IGNoaWxkcmVuW2luZGV4XS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgIHVyaUNoaWxkcmVuW2luZGV4XSA9IG5ldyBFY2xpcHNlVVJJKCBzY2hlbWVfLmdldFVSTEZyb21QYXRoKHBhdGgpLCBlbnZpcm9ubWVudF8gICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB1cmlDaGlsZHJlbjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNsaXN0KG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSUZpbHRlcikKLSAgICovCi0gIHB1YmxpYyBJVVJJW10gbGlzdChJVVJJRmlsdGVyIHVyaUZpbHRlcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICBJVVJJW10gICAgIHJlc3VsdCAgID0gbmV3IElVUklbMF07Ci0gICAgCi0gICAgaWYoIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICAgewotICAgICAgSUZvbGRlciAgICAgZm9sZGVyICAgPSAoSUZvbGRlcilyZXNvdXJjZTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZVtdIGNoaWxkcmVuICAgID0gZm9sZGVyLm1lbWJlcnMoKTsgICAgICAgCi0gICAgICAgIFZlY3RvciAgICAgIHVyaUNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICAgICB7Ci0gICAgICAgICAgSVBhdGggcGF0aCA9IGNoaWxkcmVuW2luZGV4XS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgIElVUkkgICB1cmkgID0gbmV3IEVjbGlwc2VVUkkoIHNjaGVtZV8uZ2V0VVJMRnJvbVBhdGgocGF0aCksIGVudmlyb25tZW50XyApOwotICAgICAgICAgIAotICAgICAgICAgIGlmKCB1cmlGaWx0ZXIuYWNjZXB0cyggdXJpICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVyaUNoaWxkcmVuLmFkZCggdXJpICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXN1bHQgPSAoSVVSSVtdKXVyaUNoaWxkcmVuLnRvQXJyYXkoIG5ldyBJVVJJWzBdICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI3JlbmFtZShvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW5hbWUoSVVSSSBuZXdVUkkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBpZiggbmV3VVJJID09IG51bGwgfHwgIShuZXdVUkkgaW5zdGFuY2VvZiBFY2xpcHNlVVJJKSApIHJldHVybjsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBFY2xpcHNlVVJJIG5ld0VjbGlwc2VVUkkgPSAoRWNsaXBzZVVSSSluZXdVUkk7Ci0gICAgICBJUGF0aCAgICAgIG5ld1BhdGggICAgICAgPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCBuZXdFY2xpcHNlVVJJLnVyaV8gKSApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVJlc291cmNlICByZXNvdXJjZSAgICAgID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIHJlc291cmNlICE9IG51bGwgKQotICAgICAgewotICAgICAgICByZXNvdXJjZS5tb3ZlKCBuZXdQYXRoLCB0cnVlLCBudWxsICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICkgKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjdG91Y2hGb2xkZXIoKQotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hGb2xkZXIoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgIAotICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICkKLSAgICB7IAotICAgICAgaWYoIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICAgIHsKLSAgICAgICAgSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcilyZXNvdXJjZTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaWYoIGZvbGRlci5tZW1iZXJzKCkubGVuZ3RoID4gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgCi0gICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfRVJST1JfRk9MREVSX0hBU19DSElMRFJFTiwgZm9sZGVyLnRvU3RyaW5nKCkgKSwgbnVsbCApLAotICAgICAgICAgICAgICAgIHRoaXMgKTsKLQkJCQkJCQkJCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsgICAgICAgIAotICAgICAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIC8vPz8/IE5vdCBzdXJlIHdoYXQgdG8gZG8gaWYgdG91Y2hpbmcgYSBmb2xkZXIgYW5kIHRoZSBJVVJJIGV4aXN0cyBhbmQgaXQgaXMgbm90IGEgZm9sZGVyLgotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSVBhdGggbmV3UGF0aCA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaV8gKSApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgRmlsZVJlc291cmNlVXRpbHMubWFrZUZvbGRlclBhdGgoIG5ld1BhdGgsCi0JCQkgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI3RvdWNoTGVhZigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaExlYWYoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgIAotICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAvLyBUaGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgc28gZG8gbm90aGluZy4KLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIHBhcmVudCBmb3IgdGhpcyBsZWFmIGFuZCBjcmVhdGUgaXQgaWYgcmVxdWlyZWQuCi0gICAgICBJVVJJIHBhcmVudCA9IHBhcmVudCgpOwotICAgICAgCi0gICAgICBpZiggIXBhcmVudC5pc1ByZXNlbnQoKSApCi0gICAgICB7ICAKLSAgICAgICAgcGFyZW50KCkudG91Y2hGb2xkZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIEdldCBhbiBvdXRwdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBhbmQgaW1tZWRpYXRlbHkgY2xvc2UgaXQuCi0gICAgICAgIC8vIFRoaXMgc2hvdWxkIGNyZWF0ZSBhIDAgYnl0ZSBmaWxlLgotICAgICAgICBnZXRPdXRTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgfQotICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgeyAgICAKLSAgICBJUGF0aCAgcGF0aCAgICAgICAgICAgICA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkodXJpXykgKTsKLSAgICBTdHJpbmcgYWJzb2x1dGVQYXRobmFtZSA9IHBhdGgubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKLSAgIAotICAgIHJldHVybiBGaWxlUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoYWJzb2x1dGVQYXRobmFtZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZ2V0T3V0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVBhdGggICAgICAgIGZpbGUgICA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaV8gKSApLm1ha2VBYnNvbHV0ZSgpOwotICAgIE91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIAotICAgIHN0cmVhbSA9IEZpbGVSZXNvdXJjZVV0aWxzLm5ld0ZpbGVPdXRwdXRTdHJlYW0gKCBmaWxlLAotIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFN0YXR1c0hhbmRsZXIoKSApOyAgICAKLSAgICByZXR1cm4gc3RyZWFtOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhIEZpbGUgb2JqZWN0IGZvciB0aGUgcmVzb3VyY2UgdW5kZXIgdGhpcyBJVVJJLgotICAgKiBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotICAgKiB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotICAgKiBpbiBjYXNlcyB3aGVyZSBVUklzIGFyZSBrbm93biB0byBiZSBiYWNrZWQgYnkgcGh5c2ljYWwgZmlsZXMuCi0gICAqLwotICBwdWJsaWMgRmlsZSBhc0ZpbGUgKCkKLSAgewotICAJcmV0dXJuIGZpbGVfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSNpc0F2YWlsYWJsZUFzRmlsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzRmlsZSgpIAotICB7Ci0gIAlyZXR1cm4gZmlsZV8gIT0gbnVsbDsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FzVVJMKCkKLSAgICovCi0gIHB1YmxpYyBVUkwgYXNVUkwoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKCB1cmlfICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOyAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHVybDsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzQXZhaWxhYmxlQXNVUkwoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc1VSTCgpCi0gIHsKLSAgICBVUkwgdGhlVVJMID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICB0aGVVUkwgPSBhc1VSTCgpOyAgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7ICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRoZVVSTCAhPSBudWxsIDsKLSAgfQotCi0gIHByaXZhdGUgRmlsZSBnZXRGaWxlKCkKLSAgewotICAgIFN0cmluZyBwbGF0Zm9ybVJlcyA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiOwotICAgIEZpbGUgICByZXN1bHQgICAgICA9IG51bGw7Ci0gICAgCi0gICAgaWYgKHVyaV8uc3RhcnRzV2l0aChwbGF0Zm9ybVJlcykpCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IEZpbGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKHVyaV8uc3Vic3RyaW5nKHBsYXRmb3JtUmVzLmxlbmd0aCgpLCB1cmlfLmxlbmd0aCgpKSkudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0ZpbGVSZXNvdXJjZU91dHB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZmViYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLQotCi0KLS8qKgotKiBUaGlzIGNsYXNzIGRlZmluZXMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IHdyaXRlcyB0byBhbgotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9LgotKi8KLXB1YmxpYyBjbGFzcyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0KLXsKLQotICBJUGF0aCAgICAgICAgICAgICAgICAgZkZpbGVQYXRoOwotICBJU3RhdHVzSGFuZGxlciAgICAgICAgIGZTdGF0dXNIYW5kbGVyOwotICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLSAgYm9vbGVhbiAgICAgICAgICAgICAgIGZPcGVuOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIHRvIHRoZQotICAqIGdpdmVuIDxjb2RlPmZpbGU8L2NvZGU+LiBUaGUgd29ya3NwYWNlIGlzIG5laXRoZXIgZXhhbWluZWQgbm9yCi0gICogYWx0ZXJlZCBkdXJpbmcgY29uc3RydWN0aW9uLiBBbGwgcmVzb3VyY2UgY3JlYXRpb24gaXMgZGVmZXJyZWQKLSAgKiB1bnRpbCBsYXRlciBpbiB0aGUgc3RyZWFtJ3MgbGlmZWN5Y2xlLCBzdWNoIGFzIGR1cmluZyB3cml0aW5nCi0gICogb3IgY2xvc3VyZS4KLSAgKiA8Yj5Ob3RlOjwvYj4gVGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIGNyZWF0aW5nIGEgc3RyZWFtIHRoYXQKLSAgKiB3cml0ZXMgdG8gYW4gSUZpbGUgaXMgdG8gY2FsbCB0aGUgc3RhdGljIGZhY3RvcnkgbWV0aG9kCi0gICoge0BsaW5rIEZpbGVSZXNvdXJjZVV0aWxzI25ld0ZpbGVPdXRwdXRTdHJlYW0gRmlsZVJlc291cmNlVXRpbHMubmV3RmlsZU91dHB1dFN0cmVhbSgpfQotICAqIGFuZCB3b3JrIHdpdGggdGhlIHJlc3VsdGluZyA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgotICAqIERpcmVjdCBjb25zdHJ1Y3Rpb24gb2YgYSBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0gaXMgbm90IHJlY29tbWVuZGVkLgotICAqIEBwYXJhbSBmaWxlIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlIHJlc291cmNlIHRvIGNyZWF0ZS4gVGhlIHByb2plY3QgaW1wbGllZCBieSB0aGUKLSAgKiBwYXRobmFtZSBvZiB0aGUgZmlsZSBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICovCi0gIHB1YmxpYyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0gKCAKLSAgCQkJSVBhdGggICAgICAgICAgIGZpbGVQYXRoLCAKLSAgCQkJSVN0YXR1c0hhbmRsZXIgICBzdGF0dXNIYW5kbGVyCi0gIAkJCSkKLSAgewotICAgIGZGaWxlUGF0aCA9IGZpbGVQYXRoOwotICAgIGZTdGF0dXNIYW5kbGVyID0gc3RhdHVzSGFuZGxlcjsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIGZPcGVuID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAqIENsb3NlcyB0aGUgc3RyZWFtLgotICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhlIHN0cmVhbS4KLSAgKiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlCi0gICogYW5kIGEgZmlsZSBvZiB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIHdpbGwKLSAgKiBiZSB0aHJvd24gZWl0aGVyIG5vdyBvciBkdXJpbmcgYW4gZWFybGllciB7QGxpbmsgI3dyaXRlIHdyaXRlfS4KLSAgKi8KLSAgcHVibGljIHZvaWQgY2xvc2UgKCkKLSAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIWZPcGVuKSByZXR1cm47Ci0gICAgZk9wZW4gPSBmYWxzZTsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgYnl0ZVtdIGJ1ZmZlciA9IGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKLSAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSB0ZW1wSW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlUmVzb3VyY2VVdGlscy5jcmVhdGVGaWxlKGZGaWxlUGF0aCwgdGVtcElucHV0U3RyZWFtLCBmU3RhdHVzSGFuZGxlcik7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBGbHVzaGVzIHRoZSBzdHJlYW0uIFRoaXMgZG9lcyBub3QgaW1wbHkgdGhlIEZpbGUgcmVzb3VyY2UKLSAgKiB3aWxsIGJlIGNyZWF0ZWQgb3IgYmVjb21lIHZpc2libGUgd2l0aGluIHRoZSB3b3JrYmVuY2guCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgcHVibGljIHZvaWQgZmx1c2ggKCkKLSAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gIH0KLQotICAvKioKLSAgKiBXcml0ZXMgYWxsIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGFycmF5IHRvIHRoZSBzdHJlYW0uCi0gICogQHBhcmFtIGIgVGhlIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlLgotICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcwotICAqIHN0cmVhbSB3YXMgY29uc3RydWN0ZWQgd2l0aCBvdmVyd3JpdGVGaWxlID0gZmFsc2UgYW5kIGEgZmlsZSBvZiB0aGUKLSAgKiBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZW4gYW4gSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBhdAotICAqIHRoaXMgcG9pbnQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlICggYnl0ZVtdIGIgKQotICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0ud3JpdGUoYik7Ci0gIH0KLQotICAvKioKLSAgKiBXcml0ZXMgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgYmVnaW5uaW5nIGF0IHNvbWUgb2Zmc2V0Ci0gICogYW5kIGNvbnRpbnVpbmcgZm9yIHNvbWUgbnVtYmVyIG9mIGJ5dGVzIChsZW4pIHRvIHRoZSBzdHJlYW0uCi0gICogQHBhcmFtIGIgVGhlIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlLgotICAqIEBwYXJhbSBvZmYgVGhlIG9mZnNldCBpbnRvIHRoZSBhcnJheSB0byBiZWdpbiB3cml0aW5nLgotICAqIEBwYXJhbSBsZW4gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMKLSAgKiBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlIGFuZCBhIGZpbGUgb2YgdGhlCi0gICogc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLSAgKiB0aGlzIHBvaW50LgotICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZSAoIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuICkKLSAgewotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0ud3JpdGUoYixvZmYsbGVuKTsKLSAgfQotCi0gIC8qKgotICAqIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJlYW0uCi0gICogQHBhcmFtIGIgVGhlIGJ5dGUgdG8gd3JpdGUuCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUgKCBpbnQgYiApCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGIpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0ZpbGVSZXNvdXJjZVV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9GaWxlUmVzb3VyY2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBmNDNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0ZpbGVSZXNvdXJjZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLQotCi0KLS8qKgotKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHVzZWZ1bCBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggRWNsaXBzZSByZXNvdXJjZXMuCi0qLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbGVSZXNvdXJjZVV0aWxzCi17Ci0gIC8vCi0gIC8vIEtlZXBzIHRoZSBJV29ya3NwYWNlIGhhbmdpbmcgYXJvdW5kLiBTZWUgZ2V0V29ya3NwYWNlKCkuCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2Ugd29ya3NwYWNlXyA9IG51bGw7Ci0gIC8vCi0gIC8vIEtlZXBzIHRoZSBJV29ya3NwYWNlUm9vdCBoYW5naW5nIGFyb3VuZC4gU2VlIGdldFdvcmtzcGFjZVJvb3QoKS4KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZVJvb3Qgcm9vdF8gPSBudWxsOwotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgSVdvcmtzcGFjZVJvb3Qgb2JqZWN0LgotICAqIEByZXR1cm4gVGhlIElXb3Jrc3BhY2VSb290IG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290ICgpCi0gIHsKLSAgICBpZiAocm9vdF8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotICAgIHJldHVybiByb290XzsKLSAgfQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgSVdvcmtzcGFjZSBvYmplY3QuCi0gICogQHJldHVybiBUaGUgSVdvcmtzcGFjZSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UgKCkKLSAgewotICAgIGlmICh3b3Jrc3BhY2VfID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHJvb3RfID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJvb3RfID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgd29ya3NwYWNlXyA9IHJvb3RfLmdldFdvcmtzcGFjZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gd29ya3NwYWNlXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYW4gYXJyYXkgb2YgdGhyZWUgY29tbW9uIGNob2ljZXMuIChpZS4gWWVzLCB5ZXMgYWxsLCBhbmQgY2FuY2VsICkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ2hvaWNlW10gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkgCi0gIHsKLSAgICBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICBjaG9pY2VzLmFkZChuZXcgQ2hvaWNlKCAnWScsIE1lc3NhZ2VzLkxBQkVMX1lFUyApKTsKLSAgICBjaG9pY2VzLmFkZChuZXcgQ2hvaWNlKCAnQScsIE1lc3NhZ2VzLkxBQkVMX1lFU19UT19BTEwgKSk7Ci0gICAgY2hvaWNlcy5hZGQobmV3IENob2ljZSggJ0MnLCBNZXNzYWdlcy5MQUJFTF9DQU5DRUwgKSk7Ci0gICAgCi0gICAgcmV0dXJuIChDaG9pY2VbXSljaG9pY2VzLnRvQXJyYXkobmV3IENob2ljZVtjaG9pY2VzLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIGFuCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBJUmVzb3VyY2V9Ci0gICogb2YgdGhlIGdpdmVuIGFic29sdXRlIHBhdGhuYW1lIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0gICogQHBhcmFtIGFic29sdXRlUGF0aG5hbWUgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlLgotICAqIEByZXR1cm4gVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZSAoIFN0cmluZyBhYnNvbHV0ZVBhdGhuYW1lICkKLSAgewotICAgIGlmIChhYnNvbHV0ZVBhdGhuYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmaW5kUmVzb3VyY2UobmV3IFBhdGgoYWJzb2x1dGVQYXRobmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfQotICAqIG9mIHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRoIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0gICogQHBhcmFtIGFic29sdXRlUGF0aCBUaGUgYWJzb2x1dGUgPGNvZGU+SVBhdGg8L2NvZGU+IG9mIHRoZSByZXNvdXJjZS4KLSAgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotICAqLwotICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UgKCBJUGF0aCBhYnNvbHV0ZVBhdGggKQotICB7Ci0gICAgaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gRmlsZVJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmZpbmRNZW1iZXIoYWJzb2x1dGVQYXRoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvcGllcyBhIGZpbGUgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbgotICAgKiB0byBhbiBFY2xpcHNlIGZvbGRlci4KLSAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGNvcHkuCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSBzb3VyY2VQYXRoIFRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgPGNvZGU+cGx1Z2luPC9jb2RlPgotICAgKiBpbnN0YWxsIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LgotICAgKiBJZiBudWxsLCB0aGVuIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbiBpcyB0aGUgc291cmNlIHBhdGgKLSAgICogKGllLiBudWxsIGlzIGVxdWl2YWxlbnQgdG8gIi4iKS4KLSAgICogQHBhcmFtIHBhdGhuYW1lIFRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSB0byBjb3B5LgotICAgKiBUaGUgcGF0aG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIDxjb2RlPnBsdWdpbiBzb3VyY2VQYXRoPC9jb2RlPi4KLSAgICogTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHBhcmFtIHRhcmdldFBhdGggVGhlIGFic29sdXRlIEVjbGlwc2UgcGF0aCBvZiB0aGUgZm9sZGVyIHRvCi0gICAqIHdoaWNoIHRoZSBmaWxlIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWUgb2YgdGhlCi0gICAqIGZpbGUgaXMgcHJlc2VydmVkLgotICAgKiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcGFyYW0gY3JlYXRlRm9sZGVycyBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotICAgKiB7QGxpbmsgI0NSRUFURSBDUkVBVEV9IG9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotICAgKiA8dWw+Ci0gICAqIDxsaT48Y29kZT5DUkVBVEU8L2NvZGU+IC0KLSAgICogSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICAqIGRvIG5vdCBleGlzdCwgdGhleSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAqIDxsaT48Y29kZT5ET05UX0NSRUFURTwvY29kZT4gLQotICAgKiBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4gdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgICogZG8gbm90IGV4aXN0LCB0aGUgbWV0aG9kIHdpbGwgdGhyb3cgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPi4KLSAgICogPC91bD4KLSAgICogQHBhcmFtIG92ZXJ3cml0ZUZpbGUgVGhlIHBvbGljeSBmb3IgZXhpc3RpbmcgZmlsZXMsIG9uZSBvZgotICAgKiB7QGxpbmsgI09WRVJXUklURSBPVkVSV1JJVEV9IG9yIHtAbGluayAjRE9OVF9PVkVSV1JJVEUgRE9OVF9PVkVSV1JJVEV9LgotICAgKiA8dWw+Ci0gICAqIDxsaT48Y29kZT5PVkVSV1JJVEU8L2NvZGU+IC0KLSAgICogSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBhIGZpbGUsCi0gICAqIGl0IHdpbGwgYmUgcmVwbGFjZWQuCi0gICAqIElmIHRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXQgaXMgbm90IGEgZmlsZSwKLSAgICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgICogYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLSAgICogPGxpPjxjb2RlPkRPTlRfT1ZFUldSSVRFPC9jb2RlPiAtCi0gICAqIElmIGFueSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzLAotICAgKiB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZAotICAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAgKiA8L3VsPgotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0gICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAgKi8KLSAgIHN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RmlsZSggUGx1Z2luIHBsdWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggc291cmNlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggcGF0aG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHRhcmdldFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXNIYW5kbGVyIHN0YXR1c01vbml0b3IgKQotICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgewotICAgICB0cnkKLSAgICAgewotICAgICAgIElQYXRoIHRhcmdldCA9IHRhcmdldFBhdGguYXBwZW5kKHBhdGhuYW1lKTsKLSAgICAgICBJUGF0aCBzb3VyY2UgPSBzb3VyY2VQYXRoID09IG51bGwgPyBwYXRobmFtZSA6IHNvdXJjZVBhdGguYXBwZW5kKHBhdGhuYW1lKTsKLSAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHBsdWdpbi5vcGVuU3RyZWFtKHNvdXJjZSk7Ci0gICAgICAgY3JlYXRlRmlsZSh0YXJnZXQsIGlucHV0LCBzdGF0dXNNb25pdG9yKTsKLSAgICAgfQotICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgewotICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5NU0dfRVJST1JfSU8sZSkpOwotICAgICB9Ci0gICB9Ci0gICAKLSAgLyoqCi0gICAqIERlbGV0ZXMgYSBmaWxlIHVuZGVyIGEgY29udGFpbmVyLgotICAgKiBUaGUgY29udGFpbmVyIG11c3QgYWxyZWFkeSBleGlzdC4KLSAgICogQHBhcmFtIGZpbGUgLSB0aGUgSUZpbGUgdG8gYmUgZGVsZXRlZAotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0gICAqIEBwYXJhbSBzdGF0dXNNb25pdG9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpZiBpdCBleGlzdHMgYW5kIGlzIHN1Y2Nlc3NmdWxseSBkZWxldGVkLiBGYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRmlsZSggSUZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXNIYW5kbGVyIHN0YXR1c01vbml0b3IpCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIGlmIChmaWxlLmV4aXN0cygpKQotICAgIHsgICAgICAKLSAgICAgIC8vV2UgaGF2ZSBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSBzbyBjaGVjayBpZiBmaWxlIGlzIHJlYWQtb25seQotICAgICAgaWYgKGZpbGUuaXNSZWFkT25seSgpKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIElGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbMV07Ci0gICAgICAgIGZpbGVzWzBdID0gZmlsZTsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBnZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgaWYoIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzTW9uaXRvci5yZXBvcnRFcnJvciggc3RhdHVzICk7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGZpbGUuZGVsZXRlKHRydWUsIG51bGwpOwotICAgIH0KLSAgICAvL0F0IHRoaXMgcG9pbnQsIGVpdGhlciB0aGUgZmlsZSBkaWQgbm90IGV4aXN0IG9yIHdlIHN1Y2Nlc3NmdWxseSBkZWxldGVkCi0gICAgLy8gaXQuIFJldHVybiBzdWNjZXNzLgotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIERlbGV0ZXMgYSBmb2xkZXIgdW5kZXIgYSBjb250YWluZXIuCi0gICAqIEBwYXJhbSBmb2xkZXIgLSB0aGUgSUZvbGRlciB0byBiZSBkZWxldGVkCi0gICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLSAgICogQHBhcmFtIHN0YXR1c01vbml0b3IKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZCBhbG9uZyB3aXRoIGl0cyBtZW1iZXJzLiBGYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZvbGRlciggSUZvbGRlciBmb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yICkKLSAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgIHsKLSAgICAgaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHJldHVybiB0cnVlOwotCi0gICAgIGJvb2xlYW4gICAgIGRlbGV0ZWQgICA9IHRydWU7Ci0gICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0gICAgIAotICAgICBmb3IgKGludCBpPTA7IGk8cmVzb3VyY2VzLmxlbmd0aDsgaSsrKQotICAgICB7Ci0gICAgICAgSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgIHsKLSAgICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGaWxlKChJRmlsZSlyZXNvdXJjZSwgc3RhdHVzTW9uaXRvcik7Ci0gICAgICAgfQotICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpCi0gICAgICAgewotICAgICAgICAgZGVsZXRlZCA9IGRlbGV0ZUZvbGRlciggKElGb2xkZXIpcmVzb3VyY2UsIHN0YXR1c01vbml0b3IpOwotICAgICAgIH0KLQotICAgICAgIGlmKCAhZGVsZXRlZCApIGJyZWFrOwotICAgICB9Ci0gICAgIAotICAgICBpZiggZGVsZXRlZCApCi0gICAgIHsKLSAgICAgICBmb2xkZXIuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgICAgIHJldHVybiB0cnVlOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICB9Ci0KLSAgLyoqCi0gICogQ3JlYXRlcyBhIGZpbGUgb2YgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgKiBhbmQgcmV0dXJucyBpdHMgaGFuZGxlIGFzIGFuIDxjb2RlPklGaWxlPC9jb2RlPi4KLSAgKiBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgYQotICAqIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcgYW4KLSAgKiA8Y29kZT5JU3RhdHVzPC9jb2RlPiBvYmplY3QgaXMgdGhyb3duLgotICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgotICAqIFRoZSBwcm9qZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGggbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAqIEByZXR1cm4gVGhlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBJRmlsZX0KLSAgKiBoYW5kbGUgb2YgdGhlIGZpbGUuCi0gICogQHRocm93cyBDb3JlRXhjZXB0aW9uIEFuIGV4Y2VwdGlvbiBjb250YWluaW5nIGFuCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0gICogd2l0aCBhIHNldmVyaXR5IG9mIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+IGFuZCBhCi0gICogbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJRmlsZSBjcmVhdGVGaWxlICgKLSAgICBJUGF0aCAgICAgICAgICAgYWJzb2x1dGVQYXRoLAotICAgIElucHV0U3RyZWFtICAgICBpbnB1dFN0cmVhbSwKLSAgICBJU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIgKQotCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gIHsgICAgCi0gICAgaWYgKCFhYnNvbHV0ZVBhdGguaXNBYnNvbHV0ZSgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIlJlc291cmNlVXRpbHMiLDAsIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfRVJST1JfUEFUSF9OT1RfQUJTT0xVVEUsIGFic29sdXRlUGF0aC50b1N0cmluZygpICksbnVsbCkpOwotICAgIH0KLSAgICBpZiAoYWJzb2x1dGVQYXRoLnNlZ21lbnRDb3VudCgpIDwgMSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIlJlc291cmNlVXRpbHMiLDAsTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19FUlJPUl9QQVRIX0VNUFRZLCBhYnNvbHV0ZVBhdGgudG9TdHJpbmcoKSApLG51bGwpKTsKLSAgICB9Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8IDIpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfRVJST1JfUEFUSF9OT1RfRk9MREVSLCBhYnNvbHV0ZVBhdGgudG9TdHJpbmcoKSApLG51bGwpKTsKLSAgICB9Ci0gICAgSUNvbnRhaW5lciBwYXJlbnQgICA9IG1ha2VGb2xkZXJQYXRoKGFic29sdXRlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIHN0YXR1c0hhbmRsZXIpOwotICAgIFN0cmluZyAgICAgZmlsZU5hbWUgPSBhYnNvbHV0ZVBhdGgubGFzdFNlZ21lbnQoKTsKLSAgICAKLSAgICByZXR1cm4gbWFrZUZpbGUocGFyZW50LCBmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIHN0YXR1c0hhbmRsZXIpOwotICB9Ci0KLSAgLyoqCi0gICogQ3JlYXRlcyB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cHJvamVjdDwvY29kZT4KLSAgKiBhIGZpbGUgb2YgdGhlIGdpdmVuIDxjb2RlPnJlbGF0aXZlUGF0aDwvY29kZT4KLSAgKiBhbmQgcmV0dXJucyBpdHMgaGFuZGxlIGFzIGFuIDxjb2RlPklGaWxlPC9jb2RlPi4KLSAgKiBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgYQotICAqIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcgYW4KLSAgKiA8Y29kZT5JU3RhdHVzPC9jb2RlPiBvYmplY3QgaXMgdGhyb3duLgotICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgotICAqIFRoZSBwcm9qZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGggbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gY3JlYXRlRm9sZGVycyBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotICAqIHtAbGluayAjQ1JFQVRFIENSRUFURX0gb3Ige0BsaW5rICNET05UX0NSRUFURSBET05UX0NSRUFURX0uCi0gICogPHVsPgotICAqIDxsaT48Y29kZT5DUkVBVEU8L2NvZGU+IC0KLSAgKiBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4gdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgKiBkbyBub3QgZXhpc3QsIHRoZXkgd2lsbCBiZSBjcmVhdGVkLgotICAqIDxsaT48Y29kZT5ET05UX0NSRUFURTwvY29kZT4gLQotICAqIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAqIGRvIG5vdCBleGlzdCwgdGhlIG1ldGhvZCB3aWxsIHRocm93IGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4uCi0gICogPC91bD4KLSAgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZSBUaGUgcG9saWN5IGZvciBleGlzdGluZyBmaWxlcywgb25lIG9mCi0gICoge0BsaW5rICNPVkVSV1JJVEUgT1ZFUldSSVRFfSBvciB7QGxpbmsgI0RPTlRfT1ZFUldSSVRFIERPTlRfT1ZFUldSSVRFfS4KLSAgKiA8dWw+Ci0gICogPGxpPjxjb2RlPk9WRVJXUklURTwvY29kZT4gLQotICAqIElmIGEgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4KLSAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBhIGZpbGUsCi0gICogaXQgd2lsbCBiZSByZXBsYWNlZC4KLSAgKiBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgYW5kIGl0IGlzIG5vdCBhIGZpbGUsCi0gICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAqIDxsaT48Y29kZT5ET05UX09WRVJXUklURTwvY29kZT4gLQotICAqIElmIGFueSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAqIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeSBleGlzdHMsCi0gICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAqIDwvdWw+Ci0gICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlLgotICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAqIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSUZpbGUgY3JlYXRlRmlsZSAoCi0gICAgSVByb2plY3QgICAgICAgIHByb2plY3QsCi0gICAgSVBhdGggICAgICAgICAgIHJlbGF0aXZlUGF0aCwKLSAgICBJbnB1dFN0cmVhbSAgICAgaW5wdXRTdHJlYW0sCi0gICAgSVN0YXR1c0hhbmRsZXIgICBzdGF0dXNNb25pdG9yICkKLSAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgewotICAgIElQYXRoIGFic29sdXRlUGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocmVsYXRpdmVQYXRoKTsKLSAgICByZXR1cm4gY3JlYXRlRmlsZShhYnNvbHV0ZVBhdGgsIGlucHV0U3RyZWFtLCBzdGF0dXNNb25pdG9yKTsKLSAgfQotCi0gIC8qKgotICAqIENyZWF0ZXMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIHRvIHRoZQotICAqIGdpdmVuIDxjb2RlPmZpbGU8L2NvZGU+LiBBY3R1YWwgY2hhbmdlcyB0byB0aGUgd29ya3NwYWNlCi0gICogbWF5IG9jY3VyIGR1cmluZyBjcmVhdGlvbiBvZiB0aGUgc3RyZWFtLCB3aGlsZSB3cml0aW5nIHRvCi0gICogdGhlIHN0cmVhbSwgb3Igd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KLSAgKiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcKLSAgKiBhbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiB3aWxsIGJlIHRocm93bgotICAqIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3RyZWFtCi0gICogaWYgdGhlIGZpbGUgcmVzb3VyY2UgY2Fubm90IGJlIGNyZWF0ZWQuCi0gICogQHBhcmFtIGZpbGUgVGhlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBJRmlsZX0KLSAgKiBoYW5kbGUgb2YgdGhlIGZpbGUgcmVzb3VyY2UgdG8gY3JlYXRlLiBUaGUgcHJvamVjdCBpbXBsaWVkIGJ5IHRoZQotICAqIHBhdGhuYW1lIG9mIHRoZSBmaWxlIG11c3QgYWxyZWFkeSBleGlzdCwKLSAgKiB0aGF0IGlzLCB0aGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgcHJvamVjdHMuCi0gICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgKiBAcmV0dXJuIEFuIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4gdGllZCB0byB0aGUgZmlsZSByZXNvdXJjZS4KLSAgKiBBY3R1YWwgY2hlY2tzIG9mIG9yIGNoYW5nZXMgdG8gdGhlIHdvcmtzcGFjZSBtYXkgb2NjdXIgYXMgZWFybHkgZHVyaW5nCi0gICogc3RyZWFtIGNyZWF0aW9uLCBjbG9zdXJlLCBvciBhbnkgdGltZSBpbiBiZXR3ZWVuLgotICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAqIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0gICogUmVhc29ucyBpbmNsdWRlOgotICAqIDxvbD4KLSAgKiA8bGk+VGhlIHByb2plY3Qgb2YgdGhlIGdpdmVuIGZpbGUncyBwYXRoIGRvZXMgbm90IGV4aXN0LgotICAqIDxsaT5BIG5vbi1maWxlIHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUKLSAgKiBhbHJlYWR5IGV4aXN0cy4KLSAgKiA8bGk+QSBmaWxlIHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUKLSAgKiBhbHJlYWR5IGV4aXN0cywgYW5kIDxjb2RlPm92ZXJ3cml0ZUZpbGU8L2NvZGU+IGlzIGZhbHNlLgotICAqIDxsaT5PbmUgb3IgbW9yZSBpbnRlcm1lZGlhdGUgZm9sZGVycyB0byB0aGUgZ2l2ZW4gZmlsZQotICAqIGRvIG5vdCBleGlzdCwgYW5kIDxjb2RlPmNyZWF0ZUZvbGRlcnM8L2NvZGU+IGlzIGZhbHNlLgotICAqIDwvb2w+Ci0gICovCi0KLSAgcHVibGljIHN0YXRpYyBPdXRwdXRTdHJlYW0gbmV3RmlsZU91dHB1dFN0cmVhbSAoCi0gICAgICAgSVBhdGggICAgICAgICAgICBmaWxlLAotICAgICAgIElTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXIgKQotIAotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0oZmlsZSwgc3RhdHVzSGFuZGxlcik7Ci0gIH0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gTmF1Z2h0eSBiaXRzLi4uCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vCi0gIC8vIENyZWF0ZXMgYSBwYXRoIG9mIGZvbGRlcnMuCi0gIC8vIERvIG5vdCBjYWxsIHdpdGggYW4gYWJzb2x1dGVQYXRoIG9mIGxlc3MgdGhhbiBvbmUgc2VnbWVudC4KLSAgLy8KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBwYXRoIG9mIGZvbGRlcnMuCi0gICAqIERvIG5vdCBjYWxsIHdpdGggYW4gYWJzb2x1dGVQYXRoIG9mIGxlc3MgdGhhbiBvbmUgc2VnbWVudC4KLSAgICogQHBhcmFtIHJlc291cmNlQ29udGV4dCB0aGUgcmVzb3VyY2UgY29udGV4dCBmb3IgbWFraW5nIGZvbGRlcnMuCi0gICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggdGhlIHBhdGggb2YgZm9sZGVycyB0aGF0IHdpbGwgYmUgY3JlYXRlZC4KLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byBiZSB1c2VkLgotICAgKiBAcGFyYW0gc3RhdHVzSGFuZGxlciB0aGUgc3RhdHVzIGhhbmRsZXIuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgSUNvbnRhaW5lciBvZiB0aGUgY3JlYXRlZCBmb2xkZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElDb250YWluZXIgbWFrZUZvbGRlclBhdGggKAotICAgIElQYXRoICAgICAgICAgICAgYWJzb2x1dGVQYXRoLAotICAgIElTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXIgKQotICAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8PSAxKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChhYnNvbHV0ZVBhdGguc2VnbWVudCgwKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBJQ29udGFpbmVyIHBhcmVudCA9IG1ha2VGb2xkZXJQYXRoKGFic29sdXRlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIHN0YXR1c0hhbmRsZXIgKTsKLSAgICAgIFN0cmluZyBmb2xkZXJOYW1lID0gYWJzb2x1dGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBtYWtlRm9sZGVyKHBhcmVudCxmb2xkZXJOYW1lLCBzdGF0dXNIYW5kbGVyICk7Ci0gICAgfQotICB9Ci0gIC8vCi0gIC8vIENyZWF0ZXMgYSBmb2xkZXIgdW5kZXIgYSBjb250YWluZXIuCi0gIC8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotICAvLwotIHByaXZhdGUgc3RhdGljIElGb2xkZXIgbWFrZUZvbGRlciAoCi0gICAgSUNvbnRhaW5lciAgICAgICBwYXJlbnQsCi0gICAgU3RyaW5nICAgICAgICAgICBmb2xkZXJOYW1lLAotICAgIElTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXIgKQotICAKLSAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSBjaGlsZCAgPSBwYXJlbnQuZmluZE1lbWJlcihmb2xkZXJOYW1lKTsKLSAgICAKLSAgICBpZiggY2hpbGQgPT0gbnVsbCApCi0gICAgeyAgICAgIAotICAgICAgSUZvbGRlciBmb2xkZXIgPSBwYXJlbnQuZ2V0Rm9sZGVyKG5ldyBQYXRoKGZvbGRlck5hbWUpKTsKLSAgICAgIGZvbGRlci5jcmVhdGUodHJ1ZSx0cnVlLG51bGwpOwotICAgICAgcmV0dXJuIGZvbGRlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiggY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgKQotICAgIHsKLSAgICAgIHJldHVybiAoSUZvbGRlciljaGlsZDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAKLSAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlVXRpbHMiLAotICAgICAgICAgICAgICAgICAgICAwLCAKLQkJCQkJTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSLCBwYXJlbnQuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoZm9sZGVyTmFtZSkudG9TdHJpbmcoKSksCi0JCQludWxsICkgKTsKLSAgICB9Ci0gIH0KLQotICAvLwotICAvLyBDcmVhdGVzIGEgZmlsZSB1bmRlciBhIGNvbnRhaW5lci4KLSAgLy8gVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0gIC8vCi0gcHJpdmF0ZSBzdGF0aWMgSUZpbGUgbWFrZUZpbGUgKAotICAgIElDb250YWluZXIgICAgICAgcGFyZW50LAotICAgIFN0cmluZyAgICAgICAgICAgZmlsZU5hbWUsCi0gICAgSW5wdXRTdHJlYW0gICAgICBpbnB1dFN0cmVhbSwKLSAgICBJU3RhdHVzSGFuZGxlciAgICBzdGF0dXNIYW5kbGVyICkKLSAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIGNoaWxkICA9IHBhcmVudC5maW5kTWVtYmVyKGZpbGVOYW1lKTsKLSAgICAKLSAgICBpZiggY2hpbGQgIT0gbnVsbCApCi0gICAgewotICAgICAgaWYoIGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSApCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgLy9XZSBoYXZlIHBlcm1pc3Npb24gdG8gb3ZlcndyaXRlIHNvIGNoZWNrIGlmIGZpbGUgaXMgcmVhZC1vbmx5Ci0gICAgICAgIGlmKCBjaGlsZC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLSAgICAgICAgICBmaWxlc1swXSA9IChJRmlsZSljaGlsZDsKLSAgICAgICAgICAKLSAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcyxudWxsKTsKLSAgICAgICAgICAKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXNIYW5kbGVyLnJlcG9ydCggc3RhdHVzICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKCBTdGF0dXNFeGNlcHRpb24gZXhjICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL0NoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIGV4aXN0aW5nIGZpbGUuCi0gICAgICAgIElGaWxlIGZpbGUgPSBwYXJlbnQuZ2V0RmlsZSggbmV3IFBhdGgoZmlsZU5hbWUpICk7Ci0gICAgICAgIGZpbGUuc2V0Q29udGVudHMoIGlucHV0U3RyZWFtLCB0cnVlLCB0cnVlLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggCi0gICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VVdGlscyIsCi0gICAgICAgICAgICAgICAgICAgICAgMCwgCi0JCQkJICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRklMRSwgcGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZpbGVOYW1lKSksCi0JCQkJCSAgbnVsbCApICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL0NyZWF0ZSBhIG5ldyBmaWxlLgotICAgICAgSUZpbGUgZmlsZSA9IHBhcmVudC5nZXRGaWxlKCBuZXcgUGF0aChmaWxlTmFtZSkgKTsKLSAgICAgIGZpbGUuY3JlYXRlKCBpbnB1dFN0cmVhbSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMDhlYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2UuZW52aXJvbm1lbnQiOwotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX05VTExfQVJHX1NQRUNJRklFRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1NDSEVNRV9OT1RfRk9VTkQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19BQlNPTFVURV9QQVRIX1dJVEhPVVRfU0NIRU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfVVJJX05PVF9SRUxBVElWRTsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9VTkVYUEVDVEVEX0VSUk9SOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0lOVkFMSURfUExBVEZPUk1fVVJMOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0lOVkFMSURfRklMRV9VUkw7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9QQVRIX05PVF9BQlNPTFVURTsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9QQVRIX0VNUFRZOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1BBVEhfTk9UX0ZPTERFUjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0ZPTERFUl9IQVNfQ0hJTERSRU47IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfSU87IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9ZRVM7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9ZRVNfVE9fQUxMOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0FOQ0VMOyAKLSAgCi0gIHN0YXRpYwotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyggQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL2Vudmlyb25tZW50LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzkwOGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL2Vudmlyb25tZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgZm9yIFNpbXBsZVVSSUZhY3RvcnkKLSMKLU1TR19OVUxMX0FSR19TUEVDSUZJRUQ9TnVsbCBzcGVjaWZpZWQgYXMgYXJndW1lbnQgdG8gezB9LgotTVNHX1NDSEVNRV9OT1RfRk9VTkQ9U2NoZW1lIG5vdCBmb3VuZCBmb3IgVVJJIHswfS4KLU1TR19BQlNPTFVURV9QQVRIX1dJVEhPVVRfU0NIRU1FPUFic29sdXRlIHBhdGggc3BlY2lmaWVkIHdpdGhvdXQgYSBzY2hlbWUgZm9yIFVSSSB7MH0uCi0KLSMKLSMgQ29tbW9uIE1lc3NhZ2VzCi0jCi1NU0dfVVJJX05PVF9SRUxBVElWRT1VUkw6IHswfSBpcyBub3QgcmVsYXRpdmUuCi1NU0dfRVJST1JfVU5FWFBFQ1RFRF9FUlJPUj1VbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cmVkLgotTVNHX0lOVkFMSURfUExBVEZPUk1fVVJMPUludmFsaWQgVVJMOiB7MH0gZm9yIGFuIEVjbGlwc2UgcGxhdGZvcm0uCi1NU0dfSU5WQUxJRF9GSUxFX1VSTD1JbnZhbGlkIFVSTDogezB9IGZvciB0aGUgZmlsZSBwcm90b2NvbAotCi0jCi0jIE1lc3NhZ2VzIGZvciBSZXNvdWNlVXRpbHMKLSMKLU1TR19FUlJPUl9QQVRIX05PVF9BQlNPTFVURT1QYXRoIHswfSBpcyBub3QgYWJzb2x1dGUgZm9yIGNyZWF0aW5nIGEgZmlsZS4KLU1TR19FUlJPUl9QQVRIX0VNUFRZPVBhdGggezB9IGlzIGVtcHR5IHdoaWxlIGNyZWF0aW5nIGEgZmlsZS4KLU1TR19FUlJPUl9QQVRIX05PVF9GT0xERVI9UGF0aCB7MH0gaXMgbm90IGEgZm9sZGVyIGZvciBjcmVhdGluZyBhIGZpbGUuCi1NU0dfRVJST1JfUkVTT1VSQ0VfTk9UX0ZPTERFUj1SZXNvdXJjZSB7MH0gaXMgbm90IGEgZm9sZGVyLgotTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFPVRoZSBmb2xsb3dpbmcgcGF0aCBpcyBub3QgYSByZXNvdXJjZTogezB9LgotTVNHX0VSUk9SX0ZPTERFUl9IQVNfQ0hJTERSRU49Q2FuIG5vdCBjcmVhdGUgZm9sZGVyOiB7MH0gdGhhdCBhbHJlYWR5IGhhcyBjaGlsZHJlbi4KLU1TR19FUlJPUl9JTz1BbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVzb3VyY2UgInswfSIuCi0KLUxBQkVMX1lFUz1ZZXMKLUxBQkVMX1lFU19UT19BTEw9WWVzIEFsbAotTEFCRUxfQ0FOQ0VMPUNhbmNlbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3BsdWdpbi9FbnZpcm9ubWVudFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3BsdWdpbi9FbnZpcm9ubWVudFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzMwNDU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9wbHVnaW4vRW52aXJvbm1lbnRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMSAgIDEwMDM2NCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW47Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnBsdWdpbi5FbnZpcm9ubWVudFBsdWdpbi4KLSovCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsJCi0JLyoqCi0JICogVGhlIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEVudmlyb25tZW50UGx1Z2luIGluc3RhbmNlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHVzZSBieSB0aGUgRWNsaXBzZSBwbGF0Zm9ybSBvbmx5LgotCSAqLwotCXB1YmxpYyBFbnZpcm9ubWVudFBsdWdpbigpCi0JewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgRW52aXJvbm1lbnRQbHVnaW4gZ2V0SW5zdGFuY2UgKCkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcmVsYXRpdmUvUmVsYXRpdmVTY2hlbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9yZWxhdGl2ZS9SZWxhdGl2ZVNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjYwYzBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9yZWxhdGl2ZS9SZWxhdGl2ZVNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucmVsYXRpdmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVNjaGVtZSBpbXBsZW1lbnRzIElVUklTY2hlbWUKLXsKLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiAicmVsYXRpdmUiOyAgCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNpc0hpZXJhcmNoaWNhbCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNpc1ZhbGlkKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChJVVJJIHVyaSkKLSAgewotICAgIHJldHVybiAhdXJpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCggIi8iICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKElVUkkgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlbGF0aXZlVVJJKCB1cmkudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI25ld1VSSShqYXZhLm5ldC5VUkwpCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoVVJMIHVybCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJsLnRvU3RyaW5nKCkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSN2YWxpZGF0ZShvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElVUkkgdXJpKQotICB7Ci0gICAgSVN0YXR1cyByZXN1bHQgPSBudWxsOwotICAgIAotICAgIGlmKCBpc1ZhbGlkKCB1cmkgKSApCi0gICAgewotICAgICAgcmVzdWx0ID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsICIiLG51bGwgKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3JlbGF0aXZlL1JlbGF0aXZlVVJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcmVsYXRpdmUvUmVsYXRpdmVVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmM2QzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcmVsYXRpdmUvUmVsYXRpdmVVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZS5NZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgUmVsYXRpdmVVUkkgaW1wbGVtZW50cyBJVVJJCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJpXzsKLSAgCi0gIHB1YmxpYyBSZWxhdGl2ZVVSSSggU3RyaW5nIHVyaSApCi0gIHsKLSAgICB1cmlfID0gdXJpOyAgIAotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXBwZW5kKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIElVUkkgYXBwZW5kKElVUkkgcmVsYXRpdmVVUkkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGlmKCAhcmVsYXRpdmVVUkkuaXNSZWxhdGl2ZSgpKSAKLSAgICAgeyAgICAgIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwKLSAgICAgICAgICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19VUklfTk9UX1JFTEFUSVZFLCByZWxhdGl2ZVVSSS50b1N0cmluZygpICksIG51bGwgKSApOwotICAgICAgCi0gICAgfQotICAgIAotICAgIFN0cmluZyBuZXdVUkkgPSB1cmlfICsgIi8iICsgcmVsYXRpdmVVUkkudG9TdHJpbmcoKTsKLSAgICAKLSAgICByZXR1cm4gZ2V0VVJJU2NoZW1lKCkubmV3VVJJKCBuZXdVUkkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIEZpbGUgYXNGaWxlKCkgCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc1N0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdG9TdHJpbmcoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gdXJpXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FzVVJMKCkKLSAgICovCi0gIHB1YmxpYyBVUkwgYXNVUkwoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNlcmFzZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldElucHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldE91dHB1dFN0cmVhbSgpCi0gICAqLwotICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldFVSSVNjaGVtZSgpCi0gICAqLwotICBwdWJsaWMgSVVSSVNjaGVtZSBnZXRVUklTY2hlbWUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVNjaGVtZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzQXZhaWxhYmxlQXNGaWxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNGaWxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzVVJMKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzSGllcmFyY2hpY2FsKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzTGVhZigpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUHJlc2VudCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUmVhZGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNSZWxhdGl2ZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aXZlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzV3JpdGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcml0YWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjbGlzdCgpCi0gICAqLwotICBwdWJsaWMgSVVSSVtdIGxpc3QoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IElVUklbMF07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjbGlzdChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSUZpbHRlcikKLSAgICovCi0gIHB1YmxpYyBJVVJJW10gbGlzdChJVVJJRmlsdGVyIHVyaUZpbHRlcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBJVVJJWzBdOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3BhcmVudCgpCi0gICAqLwotICBwdWJsaWMgSVVSSSBwYXJlbnQoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBpbnQgbGFzdFNsYXNoICA9IHVyaV8ubGFzdEluZGV4T2YoICcvJyApOwotICAgIGludCBmaXJzdFNsYXNoID0gdXJpXy5pbmRleE9mKCAnLycgKTsKLSAgICAKLSAgICAvLyBJZiB0aGVyZSBpcyBhIHBhcmVudCwgdGhlbiBpdCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaAotICAgIC8vIGFuZCBlbmQgd2l0aCBhIHNsYXNoLgotICAgIGlmKCBsYXN0U2xhc2ggPT0gLTEgfHwgZmlyc3RTbGFzaCA9PSAtMSApIHJldHVybiBudWxsOwotICAgICAgICAKLSAgICByZXR1cm4gZ2V0VVJJU2NoZW1lKCkubmV3VVJJKCB1cmlfLnN1YnN0cmluZygwLCBsYXN0U2xhc2ggKSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3JlbmFtZShvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbmFtZShJVVJJIG5ld1VSSSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdXJpXyA9IG5ld1VSSS50b1N0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoRm9sZGVyKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoRm9sZGVyKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdG91Y2hMZWFmKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoTGVhZigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3Zpc2l0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJVmlzaXRvciwgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklGaWx0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChJVVJJVmlzaXRvciB1cmlWaXNpdG9yLCBJVVJJRmlsdGVyIHVyaUZpbHRlcikKLSAgICB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIGNvbnRpbnVlVmlzaXQgPSB0cnVlOwotICAgIAotICAgIC8vIElmIHRoZSBmaWx0ZXIgYWNjZXB0cyB0aGlzIHdlIHdpbGwgdmlzaXQgaXQuCi0gICAgaWYoIHVyaUZpbHRlci5hY2NlcHRzKCB0aGlzICkgKQotICAgIHsKLSAgICAgIGNvbnRpbnVlVmlzaXQgPSB1cmlWaXNpdG9yLnZpc2l0KCB0aGlzICk7ICAKLSAgICB9Ci0gICAgICAgCi0gICAgSVVSSVtdIGNoaWxkcmVuICA9IGxpc3QoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNvbnRpbnVlVmlzaXQ7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGNoaWxkcmVuW2luZGV4XS52aXNpdCggdXJpVmlzaXRvciwgdXJpRmlsdGVyICk7Ci0gICAgfSAgCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdmlzaXQob3JnLmVjbGlwc2UuZW52LnVyaS5VUklWaXNpdG9yKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoSVVSSVZpc2l0b3IgdXJpVmlzaXRvcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBjb250aW51ZVZpc2l0ID0gdXJpVmlzaXRvci52aXNpdCggdGhpcyApOyAgCi0gICAgCi0gICAgSVVSSVtdIGNoaWxkcmVuICA9IGxpc3QoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNvbnRpbnVlVmlzaXQ7IGluZGV4KysgKQotICAgICB7Ci0gICAgICBjaGlsZHJlbltpbmRleF0udmlzaXQoIHVyaVZpc2l0b3IgKTsKLSAgICB9ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3VyaS9maWxlL0ZpbGVTY2hlbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC91cmkvZmlsZS9GaWxlU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDRmODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3VyaS9maWxlL0ZpbGVTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC51cmkuZmlsZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2UuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZS5SZWxhdGl2ZVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlVVJJOwotCi0KLXB1YmxpYyBjbGFzcyBGaWxlU2NoZW1lIGV4dGVuZHMgUmVsYXRpdmVTY2hlbWUKLXsKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gImZpbGUiOyAgCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNpc1ZhbGlkKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChJVVJJIHVyaSkKLSAgeyAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIGlmKCB1cmkgPT0gbnVsbCApIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IHVyaS5nZXRVUklTY2hlbWUoKTsKLSAgICAgIAotICAgIGlmKCBzY2hlbWUudG9TdHJpbmcoKS5lcXVhbHMoICJyZWxhdGl2ZSIpICkgcmV0dXJuIHNjaGVtZS5pc1ZhbGlkKCB1cmkgKTsKLSAgICAgICAgCi0gICAgU3RyaW5nIHVyaVN0cmluZyA9IHVyaS50b1N0cmluZygpOwotICAgICAgCi0gICAgaWYoIHVyaVN0cmluZyAhPSBudWxsICYmIHVyaVN0cmluZy5zdGFydHNXaXRoKCAiZmlsZToiICkgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfSAgCi0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSShTdHJpbmcgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgbmV3VVJJID0gbnVsbDsKLSAgICAKLSAgICBpZiggdXJpICE9IG51bGwgJiYgdXJpLnN0YXJ0c1dpdGgoICJmaWxlOiIpICkKLSAgICB7Ci0gICAgICAvLyBUaGUgZmlsZSBwcm90b2NvbCBoYXMgYmVlbiBzcGVjaWZpZWQgc28ga2VlcCBpdCBhcyBpcy4KLSAgICAgIG5ld1VSSSA9IHVyaTsKLSAgICB9Ci0gICAgZWxzZSBpZiggdXJpID09IG51bGwgfHwgdXJpLmluZGV4T2YoICI6IikgIT0gLTEgKQotICAgIHsKLSAgICAgIC8vIFRoZSBmaWxlIHVyaSBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIHNvbWUgb3RoZXIgcHJvdG9jb2wuIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLAotICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0lOVkFMSURfRklMRV9VUkwsdXJpKSwgbnVsbCApICk7Ci0gICAgICAgICAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmKCB1cmkuc3RhcnRzV2l0aCggIi8iKSApCi0gICAgewotICAgICAgLy8gVGhlIGZpbGUgc2NoZW1lIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgc28gd2Ugd2lsbCBhZGQgaXQuCi0gICAgICBuZXdVUkkgPSAiZmlsZToiICsgdXJpOwotICAgIH0KLSAgICAKLSAgICBpZiggbmV3VVJJID09IG51bGwgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVyaSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBGaWxlVVJJKCBuZXdVUkkgKTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKElVUkkgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VVJJKCB1cmkgPT0gbnVsbCA/IG51bGwgOiB1cmkudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI25ld1VSSShqYXZhLm5ldC5VUkwpCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoVVJMIHVybCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ld1VSSSggdXJsID09IG51bGwgPyBudWxsIDogdXJsLnRvU3RyaW5nKCkgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3VyaS9maWxlL0ZpbGVVUkkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC91cmkvZmlsZS9GaWxlVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYzE2NjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3VyaS9maWxlL0ZpbGVVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC51cmkuZmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlVVJJOwotCi0KLXB1YmxpYyBjbGFzcyBGaWxlVVJJIGV4dGVuZHMgUmVsYXRpdmVVUkkgCi17Ci0gIHByaXZhdGUgRmlsZSBmaWxlXyA9IG51bGw7Ci0gIAotICBwdWJsaWMgRmlsZVVSSSggU3RyaW5nIHVyaSApCi0gIHsKLSAgICBzdXBlciggdXJpICk7Ci0gICAgCi0gICAgaWYoIGdldFVSSVNjaGVtZSgpLmlzVmFsaWQoIHRoaXMgKSApCi0gICAgewotICAgICAgZmlsZV8gPSBuZXcgRmlsZSggdXJpLnN1YnN0cmluZyggNSwgdXJpLmxlbmd0aCgpICkgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIEZpbGUgYXNGaWxlKCkgCi0gIHsKLSAgICByZXR1cm4gZmlsZV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNlcmFzZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGRlbGV0ZUZpbGUoIGZpbGVfICk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZGVsZXRlRmlsZSggRmlsZSBmaWxlICkKLSAgewotICAgIGlmKCBmaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGZpbGUubGlzdEZpbGVzKCk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBGaWxlIGNoaWxkID0gY2hpbGRyZW5baW5kZXhdOwotICAgICAgICAKLSAgICAgICAgaWYoIGNoaWxkLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsZXRlRmlsZSggY2hpbGQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZC5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmaWxlLmRlbGV0ZSgpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0SW5wdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlXy5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAKLSAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZpbGVfICk7ICAKLSAgICB9Ci0gICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlXy5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAKLSAgICAgIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBmaWxlXyApOyAgCi0gICAgfQotICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdHJlYW07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0VVJJU2NoZW1lKCkKLSAgICovCi0gIHB1YmxpYyBJVVJJU2NoZW1lIGdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVTY2hlbWUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzRmlsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8gIT0gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzVVJMKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfICE9IG51bGw7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc1VSTCgpCi0gICAqLwotICBwdWJsaWMgVVJMIGFzVVJMKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIHVybCA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgdXJsID0gZmlsZV8gPT0gbnVsbCA/IG51bGwgOiBmaWxlXy50b1VSTCgpOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHVybDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0xlYWYoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMZWFmKCkKLSAgewotICAgIHJldHVybiBmaWxlXy5pc0ZpbGUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1ByZXNlbnQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KCkKLSAgewotICAgIHJldHVybiBmaWxlXy5leGlzdHMoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1JlYWRhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfLmNhblJlYWQoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1dyaXRhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfLmNhbldyaXRlKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjbGlzdCgpCi0gICAqLwotICBwdWJsaWMgSVVSSVtdIGxpc3QoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlW10gY2hpbGRyZW4gPSBmaWxlXy5saXN0RmlsZXMoKTsKLSAgICBJVVJJW10gIFVSSXMgICAgID0gbmV3IElVUklbMF07Ci0gICAgCi0gICAgaWYoIGNoaWxkcmVuICE9IG51bGwgKQotICAgIHsKLSAgICAgIGludCAgIGxlbmd0aCAgID0gY2hpbGRyZW4ubGVuZ3RoOwotICAgICAgCi0gICAgICBVUklzID0gbmV3IElVUklbbGVuZ3RoXTsKLSAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBVUklzW2luZGV4XSA9IG5ldyBGaWxlVVJJKCAiZmlsZToiICsgY2hpbGRyZW5baW5kZXhdLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBVUklzOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3Qob3JnLmVjbGlwc2UuZW52LnVyaS5VUklGaWx0ZXIpCi0gICAqLwotICBwdWJsaWMgSVVSSVtdIGxpc3QoSVVSSUZpbHRlciB1cmlGaWx0ZXIpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIEZpbGVbXSAgIGNoaWxkcmVuID0gZmlsZV8ubGlzdEZpbGVzKCk7Ci0gICAgaW50ICAgICAgbGVuZ3RoICAgPSBjaGlsZHJlbiA9PSBudWxsID8gMCA6IGNoaWxkcmVuLmxlbmd0aDsKLSAgICBWZWN0b3IgICBVUklzICAgICA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IG5ldyBGaWxlVVJJKCAiZmlsZToiICsgY2hpbGRyZW5baW5kZXhdLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAKLSAgICAgIGlmKCB1cmlGaWx0ZXIuYWNjZXB0cyggbmV3VVJJKSApCi0gICAgICB7Ci0gICAgICAgIFVSSXMuYWRkKCBuZXdVUkkgKTsKLSAgICAgIH0gCi0gICAgfQotICAgIAotICAgIHJldHVybiAoSVVSSVtdKVVSSXMudG9BcnJheSggbmV3IElVUklbMF0gKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNyZW5hbWUob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW5hbWUoSVVSSSBuZXdVUkkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHVyaV8gPSBuZXdVUkkudG9TdHJpbmcoKTsKLSAgICAgIFVSTCBuZXdVUkwgPSBuZXcgVVJMKCB1cmlfICk7Ci0gICAgICBmaWxlXy5yZW5hbWVUbyggbmV3IEZpbGUoIG5ld1VSTC5nZXRQYXRoKCkgKSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgICAgICAKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdG91Y2hGb2xkZXIoKQotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hGb2xkZXIoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBmaWxlXy5ta2RpcnMoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaExlYWYoKQotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hMZWFmKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBmb2xkZXJzIGFyZSBjcmVhdGVkLgotICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlXy5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAKLSAgICAgIGZpbGVfLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgICAgICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aXZlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWEwNjEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ind0cF91aS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYTdhMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi13dHBfdWkuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzg4NWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxNzEzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jU2F0IE1hciAzMSAxNjo1ODo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTc2MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjEwMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7YnVuZGxlLXZlcnNpb249IlsxLjAuMjAwLDIuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWI3M2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHd0cF91aS8sXAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODE5YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUN1dD1DdXQKLUZMRVhJQkxFX1BST0pFQ1RfUFJFRkVSRU5DRT1KMkVFIFByb2plY3QgTW9kdWxlcwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVdUUCBVSSBQbHVnLWluCi1XVFBfVUlfQWN0aW9uPVdUUCBVSSBBY3Rpb24KLUV4dGVuZGVkX1ZpZXdlcnM9RXh0ZW5kZWQgVmlld2VycwotRXh0ZW5kYWJsZV9XaXphcmQ9RXh0ZW5kYWJsZSBXaXphcmQKLUV4dGVuZGFibGVfV2l6YXJkX1BhZ2U9RXh0ZW5kYWJsZSBXaXphcmQgUGFnZQotRGF0YU1vZGVsV2l6YXJkPURhdGFNb2RlbFdpemFyZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZTNhYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Ind0cHVpQWN0aW9uIiBuYW1lPSIlV1RQX1VJX0FjdGlvbiIgc2NoZW1hPSJzY2hlbWEvd3RwdWlBY3Rpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5kZWRWaWV3ZXIiIG5hbWU9IiVFeHRlbmRlZF9WaWV3ZXJzIiBzY2hlbWE9InNjaGVtYS9leHRlbmRlZFZpZXdlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHRlbmRhYmxlV2l6YXJkIiBuYW1lPSIlRXh0ZW5kYWJsZV9XaXphcmQiIHNjaGVtYT0ic2NoZW1hL2V4dGVuZGFibGVXaXphcmQuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2l6YXJkUGFnZUdyb3VwIiBuYW1lPSIlRXh0ZW5kYWJsZV9XaXphcmRfUGFnZSIgc2NoZW1hPSJzY2hlbWEvZXh0ZW5kYWJsZVdpemFyZFBhZ2UuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uIiBuYW1lPSIlRGF0YU1vZGVsV2l6YXJkIiBzY2hlbWE9InNjaGVtYS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb24uZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iVUlUZXN0ZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlUZXN0ZXIiPgotICAgICAgPHVpVGVzdGVyCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5VSVRlc3RlckltcGwiPgotICAgICAgPC91aVRlc3Rlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLnNhdmVIYW5kbGVyIgotICAgICAgICAgbmFtZT0iU2F2ZSBIYW5kbGVyIC0gSGVhZGxlc3MgQ29udGV4dCBDbGFzcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGtleT0ic2F2ZUhhbmRsZXIiCi0gICAgICAgICAgICBjb250ZXh0PSJVSSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlNhdmVIYW5kbGVyVUkiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5FbmFibGVtZW50RGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgIG5hbWU9IlVJIEVuYWJsZW1lbnQgRGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGtleT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkVuYWJsZW1lbnREZXRlcm1pbmF0aW9uIgotICAgICAgICAgICAgY29udGV4dD0iVUkiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5VSUVuYWJsZW1lbnRNYW5hZ2VyIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiPgotICAgICAgPFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbCI+Ci0gICAgICA8L1dUUEFjdGl2aXR5QnJpZGdlSGVscGVyPgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFscy5PcGVyYXRpb25FeHRlbnNpb24iPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbi51aS5Qb3N0UGFzdGVBY3Rpb25PcGVyYXRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb24udWkuUGFzdGVBY3Rpb25PcGVyYXRpb24iLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gICA8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAga2V5PSJJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCIKLSAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0VUkiCi0gICAgICAgICAgY29udGV4dD0iVUkiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZGNhNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC5jb21tb24udWkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJvcGVydHlfZmlsZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZGVmMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJvcGVydHlfZmlsZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfcHJvamVjdENvbnRlbnRzTGFiZWwgPSBQcm9qZWN0IGNvbnRlbnRzOgotV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV91c2VEZWZhdWx0TGFiZWwgPSBVc2UgJmRlZmF1bHQKLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfbG9jYXRpb25MYWJlbCA9IERpcmVjdG9yJnk6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJvcGVydHlfZmlsZXMvd3RwY29tbW9udWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL3d0cGNvbW1vbnVpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjYxYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJvcGVydHlfZmlsZXMvd3RwY29tbW9udWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSUFjdGlvbldUUE9wZXJhdGlvbl9VSV8wPU5vIGFjdGlvbiBhdmFpbGFibGUgZm9yIGV4ZWN1dGlvbi4KLVdUUEFjdGlvbkRpYWxvZ19VSV8wPVNlbGVjdCB0aGUgb3B0aW9uYWwgZGVwZW5kZW50IGFjdGlvbnMgeW91IHdvdWxkIGxpa2UgdG8gZXhlY3V0ZS4KLVdUUE9wdGlvbmFsT3BlcmF0aW9uRGF0YU1vZGVsX1VJXzA9Um9vdCB0cmVlIGNhbiBub3QgYmUgc2VsZWN0ZWQuCi1XVFBPcHRpb25hbE9wZXJhdGlvbkRhdGFNb2RlbF9VSV8xPU5vIG9wZXJhdGlvbnMgYXJlIHNlbGVjdGVkLgotTWFzdGVyRGVzY3JpcHRvcl9FUlJPUl8yPUlXQUUwMDA1RSBXVFBVSU9wZXJhdGlvbiBlbGVtZW50cyByZXF1aXJlIGV4YWN0bHkgb25lIDxzZWxlY3Rpb25FbmFibGVtZW50IC8+LgotV1RQT3BlcmF0aW9uQWN0aW9uX1VJXzA9T3BlcmF0aW9uIFN0YXR1cwotV1RQT3BlcmF0aW9uQWN0aW9uX1VJXzE9UHJvYmxlbSBleGVjdXRpbmcgb3BlcmF0aW9uLgotVGltZXJRdWV1ZV9FUlJPUl8wPUlXQUUwMDA2RSBDYW4ndCBzdGFydCBhIFRpbWVyUXVldWUgdGhhdCBpcyBhbHJlYWR5IHJ1bm5pbmcKLUV4dGVuZGVkV2l6YXJkUGFnZV9FUlJPUl8wPUlXQUUwMDA3RSBDYW5ub3QgbW9kaWZ5IGlkIGFmdGVyIGl0IGhhcyBhbHJlYWR5IGJlZW4gc2V0LgotRXh0ZW5kZWRXaXphcmRQYWdlX0VSUk9SXzE9SVdBRTAwMDhFIFRoZSBpZCBjYW5ub3QgYmUgbnVsbAotTWFzdGVyRGVzY3JpcHRvcl9VSV8xPU5vIFwiIHswfSBcIiBhdHRyaWJ1dGUgZGVmaW5lZAotVGltZXJfVUlfMD1JbnZhbGlkIGRlbGF5OiB7MH0KLVRpbWVyX1VJXzE9SW52YWxpZCBpbml0aWFsIGRlbGF5OiB7MH0KLVdUUFdpemFyZF9VSV8wPVdpemFyZCBFcnJvcjogezB9Ci1XVFBXaXphcmRfVUlfMT1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiB7MH0gZmluaXNoZWQuCi1XVFBXaXphcmRfVUlfMj1XaXphcmQgV2FybmluZzogezB9Ci1FeHRlbmRhYmxlV2l6YXJkX1VJXzA9V2l6YXJkIHBhZ2UgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gezB9IHsxfQotV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMD1FbGVtZW50OiB7MH0gZG9lcyBub3QgYWxsb3cgcGFnZSBpbnNlcnRpb24gYWZ0ZXIuCi1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8xPXswfSB3aWxsIG5vdCBiZSBjcmVhdGVkCi1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8yPUNpcmN1bGFyIGRlcGVuZGVuY3ksIGVsZW1lbnQ6IHswfSBjaGVjazogezF9Ci1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8zPUVkaXRvciBkb2VzIG5vdCBhbGxvdyBwYWdlIGluc2VydGlvbnMKLVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzQ9UGFyZW50IENsYXNzIE5vdCBGb3VuZCBFcnJvcjogezB9IFxyXG4gZm9yIGF0dHJpYnV0ZTogezF9IGluIHBsdWdpbiB7Mn0gXHJcblBhZ2Ugbm90IGNyZWF0ZWQKLURlbGV0ZV9VSV8wPURlbGV0ZQotTmFtZV89UHJvamVjdCBuYW1lOgotQnJvd3NlXz1Ccm93c2UuLi4KLVByb2plY3RfbG9jYXRpb25fPVByb2plY3QgTG9jYXRpb246Ci1NVUxUSVBMRV9NT0RVTEVfUFJFRl9URVhUPUFsbG93IE11bHRpcGxlIG1vZHVsZXMgcGVyIHByb2plY3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjNzViNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGlkPSJEYXRhTW9kZWxXaXphcmRFeHRlbnNpb24iIG5hbWU9IkRhdGEgTW9kZWwgV2l6YXJkIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBBbiBleHRlbnNpb24gdG8gYSBzcGVjaWZpYyBEYXRhIE1vZGVsIFdpemFyZC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iRGF0YU1vZGVsV2l6YXJkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJEYXRhTW9kZWxXaXphcmQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBkYXRhIG1vZGVsIHdpemFyZCBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCB3aXphcmQgY2xhc3MgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmQuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRhYmxlV2l6YXJkLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NDk5MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBpZD0iZXh0ZW5kYWJsZVdpemFyZCIgbmFtZT0iRXh0ZW5kYWJsZSBXaXphcmQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBkZWNsYXJlcyBhIGRhdGEgbW9kZWwgd2l6YXJkIGFzIGEgdmFsaWQgZXh0ZW5kYWJsZSB3aXphcmQuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJleHRlbmRhYmxlV2l6YXJkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbmRhYmxlV2l6YXJkIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIHJlcXVpcmVkIGlkIGZvciB0aGUgZGF0YSBtb2RlbCB3aXphcmQgaW5zdGFuY2UgdG8gYmUgZXh0ZW5kZWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmRQYWdlLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kYWJsZVdpemFyZFBhZ2UuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwYTljYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kYWJsZVdpemFyZFBhZ2UuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGlkPSJ3aXphcmRQYWdlR3JvdXAiIG5hbWU9IkV4dGVuZGFibGUgV2l6YXJkIFBhZ2UiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBhbGxvd3MgeW91IHRvIGFkZCBhbiBkYXRhIG1vZGVsIHdpemFyZCBwYWdlIHRvIGEgcHJlZGVmaW5lZCBleHRlbnNhYmxlIGRhdGEgbW9kZWwgd2l6YXJkLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRQYWdlIi8+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRQYWdlR3JvdXAiLz4NCi0gICAgICAgICAgICA8L2Nob2ljZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2VHcm91cCI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2l6YXJkSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG1hdGNoIHRoZSBpZCBkZWZpbmVkIGluIHRoZSBleHRlbmRhYmxlV2l6YXJkIGVsZW1lbnQgaW4gdGhlIGV4dGVuZGFibGVXaXphcmQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93c0V4dGVuZGVkUGFnZXNBZnRlciIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBzZXR0aW5nIHRvIHNwZWNpZnkgd2hldGhlciB0aGlzIHBhZ2UgYWxsb3dzIGV4dGVuZGVkIHBhZ2VzIGFmdGVyIGl0c2VsZiwgZGVmYXVsdCBpdCB0cnVlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhZ2VHcm91cEluc2VydGlvbklEIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIElmIHRoaXMgcGFnZSBpcyB0byBpbW1lZGlhdGVseSBhZnRlciBhbm90aGVyIHBhZ2UsIHRoaXMgbXVzdCBtYXRjaCB0aGUgcGFnZUlEIG9mIHRoZSBwYWdlIHRvIGluc2VydCBhZnRlci4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFnZUdyb3VwSUQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyBmb3IgdGhlIHBhZ2UgZ3JvdXAgSUQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndpemFyZElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBtYXRjaCB0aGUgaWQgZGVmaW5lZCBpbiB0aGUgZXh0ZW5kYWJsZVdpemFyZCBlbGVtZW50IGluIHRoZSBleHRlbmRhYmxlV2l6YXJkIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgY2xhc3MgaXMgYW4gaW5zdGFuY29mIGNvbS5pYm0ud3RwLmNvbW1vbi51aS53aXphcmQuZXh0ZW5zaW9ucy5XaXphcmRFeHRlbnNpb25GYWN0b3J5DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotDQotDQotDQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcGluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kZWRWaWV3ZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRlZFZpZXdlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg5MDhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRlZFZpZXdlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGlkPSJleHRlbmRlZFZpZXdlciIgbmFtZT0iRXh0ZW5kZWQgVmlld2VycyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZXh0ZW5kZWRWaWV3ZXIgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0aGUgY29udHJpYnV0aW9uIG9mIG5ldyBmdW5jdGlvbiB0byBhbiBleGlzdGluZyB2aWV3ZXIuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJleHRlbmRlZFZpZXdlciIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5kZWRWaWV3ZXIiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXdlcklEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgcmVxdWlyZWQgaWQgZm9yIHRoZSBleHRlbmRlZFZpZXdlciBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnRWaWV3ZXJJRCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZCB1c2VkIHRvIHNwZWNpZnkgYSBwYXJlbnQgdmlld2VyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY3RvcnlDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgZmFjdG9yeSBjbGFzcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBvcHRpb25hbCBwYXRoIHRvIGFuIGljb24gaW1hZ2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSByZXF1aXJlZCBsYWJlbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGV4dGVuZGVkIHZpZXdlcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbkdyb3VwSUQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgc2V0dGluZyB0byBhc3NvY2lhdGUgdGhlIGV4dGVuZGVkIHZpZXdlciB3aXRoIGEgc3BlY2lmaWMgZnVuY3Rpb24gZ3JvdXAgaWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvd3RwdWlBY3Rpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4ODYxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvd3RwdWlBY3Rpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBpZD0id3RwdWlBY3Rpb24iIG5hbWU9IldUUCBVSSBBY3Rpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZm9yIFdUUCBPcGVyYXRpb25zIHdoaWNoIG5lZWQgdG8gYmUgdGllZCB0byBhIGdlbmVyaWMgVUkgYWN0aW9uLCBzdWNoIGFzIENVVCwgQ09QWSwgUEFTVEUsIERFTEVURSwgYW5kIFJFTkFNRS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFzdGVyT3BlcmF0aW9uIi8+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzbGF2ZU9wZXJhdGlvbiIvPg0KLSAgICAgICAgICAgIDwvY2hvaWNlPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ibWFzdGVyT3BlcmF0aW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBBIG1hc3Rlck9wZXJhdGlvbiBlbmFibGVzIGFuIGV4aXN0aW5nIFdUUCBPcGVyYXRpb24gdG8gYmUgdXNlZCBpbiBhIFVJIGFjdGlvbi4gR2VuZXJpYyBJZHMgYWdncmVnYXRlIGEgc2V0IG9mIG1hc3Rlck9wZXJhdGlvbnMgZm9yIHRoZSBzYW1lIEFic3RyYWN0IGFjdGlvbiAobGlrZSBhICZxdW90O0NVVCZxdW90OyBvcGVyYXRpb24pLiBXVFAgT3BlcmF0aW9ucyBhcmUgdGhlbXNlbHZlcyBleHRlbmRpYmxlLCBzbyBmb3IgYW55IG1hc3Rlck9wZXJhdGlvbiBkZWZpbmVkLCB0aGVyZSBtYXkgYmUgYW55IG51bWJlciBvZiBwcmV8cG9zdCBvcGVyYXRpb25zLiBUaGVzZSBwcmV8cG9zdCBvcGVyYXRpb24gY2FuIGhhdmUgc2xhdmVPcGVyYXRpb24gZWxlbWVudHMgZGVmaW5lZCB3aGljaCBpbmRpY2F0ZSB0aGUgcHJlfHBvc3Qgb3BlcmF0aW9uIG1heSBiZSBydW4gaW5kZXBlbmRlbnRseS4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWxlY3Rpb25FbmFibGVtZW50Ii8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVuZGVkR2VuZXJpY0lkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgR2VuZXJpYyBBY3Rpb24geW91IHdvdWxkIGxpa2UgdG8gY29udHJpYnV0ZSB0by4gKGUuZy4gVGhlIGlkIGZvciBDVVQsIENPUFksIFBBU1RFLCBERUxFVEUsIFJFTkFNRSkuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbkNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3Mgb2YgeW91ciBvcGVyYXRpb24uIFlvdXIgb3BlcmF0aW9uIG11c3QgYmUgYSBXVFBPcGVyYXRpb24gYW5kIG11c3QgcHJvdmlkZSBhIG5vLWFyZ3VtZW50cyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgcHJvdmlkZWQsIHRoZSBnZXREZWZhdWx0T3BlcmF0aW9uKCkgcmV0dXJuZWQgYnkgdGhlIGRhdGFNb2RlbCB3aWxsIGJlIHVzZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBuYW1lIHRvIGRpc3BsYXkgaW4gdGhlIGRpYWxvZyBmb3IgeW91ciBhY3Rpb24gKGlmIHRoZSBvcGVyYXRpb24gaXMgb3B0aW9uYWwpLiBZb3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgJnF1b3Q7JWtleSZxdW90OyBmb3IgdHJhbnNsYXRhYmxlIHRleHQgc3RvcmVkIGluIHBsdWdpbi5wcm9wZXJ0aWVzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkgaW4gdGhlIGRpYWxvZyBmb3IgeW91ciBhY3Rpb24gKGlmIHRoZSBvcGVyYXRpb24gaXMgb3B0aW9uYWwpLiBZb3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgJnF1b3Q7JWtleSZxdW90OyBmb3IgdHJhbnNsYXRhYmxlIHRleHQgc3RvcmVkIGluIHBsdWdpbi5wcm9wZXJ0aWVzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3B1bGF0b3JDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgcG9wdWxhdG9yQ2xhc3Mga25vd3MgaG93IHRvIHByb3ZpZGUgYSBXVFAgT3BlcmF0aW9uIERhdGEgTW9kZWwgYmFzZWQgb24gYSBnaXZlbiBzZWxlY3Rpb24uIFRoZSBnZXREZWZhdWx0T3BlcmF0aW9uKCkgbWV0aG9kIG9mIHRoZSBkYXRhIG1vZGVsIHdpbGwgYmUgaWdub3JlZCBpZiB0aGUgb3BlcmF0aW9uQ2xhc3MgaXMgcHJvdmlkZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsd2F5c0V4ZWN1dGUiIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgdG8gZGV0ZXJtaW5lIGV4ZWN1dGlvbiBjb250ZXh0DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJyaWRlSWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyB0byBkZWZpbmUgYW4gb3ZlcnJpZGFibGUgaWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgaWRlbnRpZmljYXRpb24gZm9yIG9wZXJhdGlvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic2VsZWN0aW9uRW5hYmxlbWVudCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhlIHNlbGVjdGlvbkVuYWJsZW1lbnQgZWxlbWVudCBhbGxvd3MgeW91IHRvIGZpbHRlciB3aGljaCBraW5kcyBvZiBzZWxlY3Rpb24geW91ciBvYmplY3QgaXMgYXBwbGljYWJsZSB0byB1c2luZyBTdGFuZGFyZCBFY2xpcHNlIEFjdGlvbiBFeHByZXNpb25zLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RDbGFzcyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3IiLz4NCi0gICAgICAgICA8L2Nob2ljZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJzbGF2ZU9wZXJhdGlvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhlIHNsYXZlT3BlcmF0aW9uIGVsZW1lbnQgZGVmaW5lcyBkaXNwbGF5IGluZm9ybWF0aW9uIGZvciBvcGVyYXRpb25zIHdoaWNoIGV4dGVuZCBhIGRlY2xhcmVkIG1hc3RlciBvcGVyYXRpb24uIElmIGEgcHJlfHBvc3Qgb3BlcmF0aW9uIG9mIGEgbWFzdGVyIGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIHNsYXZlT3BlcmF0aW9uIGVsZW1lbnQsIHRoZW4gdGhlIHByZXxwb3N0IG9wZXJhdGlvbiB3aWxsIGJlIGNvbnNpZGVyIHJlcXVpcmVkLCBhbmQgbm90IGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbkNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3Mgb2YgeW91ciBvcGVyYXRpb24uIFlvdXIgb3BlcmF0aW9uIG11c3QgYmUgYSBXVFBPcGVyYXRpb24gYW5kIG11c3QgcHJvdmlkZSBhIG5vLWFyZ3VtZW50cyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBGb3Igc2xhdmUgb3BlcmF0aW9ucywgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIG1hc3RlciBvcGVyYXRpb24gd2lsbCBiZSBwcm92aWRlZC4gVGhlcmVmb3JlLCBzbGF2ZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBkYXRhIG1vZGVsIHVzaW5nIGEgc2VwZXJhdGUgcG9wdWxhdG9yQ2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBuYW1lIHRvIGRpc3BsYXkgaW4gdGhlIGRpYWxvZyBmb3IgeW91ciBhY3Rpb24gKGlmIHRoZSBvcGVyYXRpb24gaXMgb3B0aW9uYWwpLiBZb3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgJnF1b3Q7JWtleSZxdW90OyBmb3IgdHJhbnNsYXRhYmxlIHRleHQgc3RvcmVkIGluIHBsdWdpbi5wcm9wZXJ0aWVzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkgaW4gdGhlIGRpYWxvZyBmb3IgeW91ciBhY3Rpb24gKGlmIHRoZSBvcGVyYXRpb24gaXMgb3B0aW9uYWwpLiBZb3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgJnF1b3Q7JWtleSZxdW90OyBmb3IgdHJhbnNsYXRhYmxlIHRleHQgc3RvcmVkIGluIHBsdWdpbi5wcm9wZXJ0aWVzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ib3IiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0Q2xhc3MiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0U3RhdGUiLz4NCi0gICAgICAgICA8L2Nob2ljZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJvYmplY3RDbGFzcyI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgb2JqZWN0IGNsYXNzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFkYXB0YWJsZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBzZXR0aW5nIHRvIHNwZWNpZnkgdGhlIG9iamVjdCBjbGFzcyBhcyBhZGFwdGFibGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImFuZCI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RDbGFzcyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3IiLz4NCi0gICAgICAgICA8L2Nob2ljZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJvYmplY3RTdGF0ZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyBmb3IgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgb2JqZWN0IHN0YXRlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyBmb3IgYW4gb2JqZWN0IHN0YXRlIG5hbWUgdG8gY2hlY2sgdGhlIHNlbGVjdGVkIG9iamVjdCZhcG9zO3MgdmFsdWUgaXMgbWF0Y2hpbmcgd2l0aA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0OyEtLSBUaGUgZXhhbXBsZXMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgYmVlbiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgdGhleSByZWZlcmVuY2Ugb25seSBleHRlbnNpb24gcG9pbnQgSURzLiBUaGVzZSBleGFtcGxlcyBtdXN0IGJlIGNvcnJlY3RlZCBiZWZvcmUgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIC0tJmd0Ow0KLSZsdDshLS0NCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVjbGFyZXMgdHdvIE1hc3RlciBPcGVyYXRpb25zICgmbHQ7Y29kZSZndDtjb20uYWNtZS51aS5vcGVyYXRpb24uTWFzdGVyT3BlcmF0aW9uQSZsdDsvY29kZSZndDsgYW5kICZsdDtjb2RlJmd0O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25CJmx0Oy9jb2RlJmd0Oykgd2hpY2ggYXJlIGF0dGFjaGVkIHRvIHRoZSBHZW5lcmljIElEICZsdDtjb2RlJmd0O2NvbS5hY21lLnVpLldUUE9wdGlvbmFsT3BlcmF0aW9uVGVzdCZsdDsvY29kZSZndDsuIA0KLVRoZSBzY2VuYXJpbyBoYXMgTWFzdGVyIEEgd2hpY2ggaGFzIGFzIGEgcHJlLW9wZXJhdGlvbiBvZiBTbGF2ZSBBIGFuZCBhIHBvc3Qtb3BlcmF0aW9uIG9mIFNsYXZlIEMuIFNsYXZlIEEgaXMgbWFkZSBvcHRpb25hbCBieSB0aGUgJmx0O2NvZGUmZ3Q7c2xhdmVPcGVyYXRpb24mbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQsIHdoaWxlIFNsYXZlIEMgd2lsbCBhbHdheXMgYmUgcnVuIChubyAmbHQ7Y29kZSZndDtzbGF2ZU9wZXJhdGlvbiZsdDsvY29kZSZndDsgaXMgZ2l2ZW4gdG8gcnVuIGl0IHNlcGVyYXRlbHkpLiBTbGF2ZSBBIGZ1cnRoZXIgaGFzIGFuIG9wdGlvbmFsIHByZS1vcGVyYXRpb24gKFNsYXZlIEIpIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGluZGVwZW50bHkgb2YgZWl0aGVyIFNsYXZlIEEgb3IgTWFzdGVyIEEuDQotLS0mZ3Q7DQotJmx0OyEtLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS53dHB1aUFjdGlvbiZxdW90OyZndDsNCi0gICAgICAmbHQ7bWFzdGVyT3BlcmF0aW9uDQotICAgICAgICAgICAgcG9wdWxhdG9yQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLkFjbWVPcGVyYXRpb25Qb3B1bGF0b3ImcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90OyVtYXN0ZXJfYV9uYW1lJnF1b3Q7DQotICAgICAgICAgICAgb3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmcXVvdDsNCi0gICAgICAgICAgICBleHRlbmRlZEdlbmVyaWNJZD0mcXVvdDtjb20uYWNtZS51aS5XVFBPcHRpb25hbE9wZXJhdGlvblRlc3QmcXVvdDsNCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDslbWFzdGVyX2FfZGVzY3JpcHRpb24mcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9tYXN0ZXJPcGVyYXRpb24mZ3Q7IA0KLSAgICZsdDtzbGF2ZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7U2xhdmUgQSZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9zbGF2ZU9wZXJhdGlvbiZndDsgDQotICAgICAgJmx0O3NsYXZlT3BlcmF0aW9uDQotICAgICAgICAgICAgbmFtZT0mcXVvdDtTbGF2ZSBCJnF1b3Q7DQotICAgICAgICAgICAgb3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQiZxdW90OyZndDsNCi0gICAgICAmbHQ7L3NsYXZlT3BlcmF0aW9uJmd0OyAgICAgIA0KLSAgICAgICZsdDttYXN0ZXJPcGVyYXRpb24NCi0gICAgICAgICAgICBwb3B1bGF0b3JDbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uQWNtZU9wZXJhdGlvblBvcHVsYXRvciZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7RUFSIFByb2plY3QgQWN0aW9uJnF1b3Q7DQotICAgICAgICAgICAgb3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkImcXVvdDsNCi0gICAgICAgICAgICBleHRlbmRlZEdlbmVyaWNJZD0mcXVvdDtjb20uYWNtZS51aS5XVFBPcHRpb25hbE9wZXJhdGlvblRlc3QmcXVvdDsmZ3Q7DQotICAgICAgICAgICAgJmx0O3NlbGVjdGlvbkVuYWJsZW1lbnQmZ3Q7IA0KLSAgICAgICAgICAgICAmbHQ7b2JqZWN0U3RhdGUgbmFtZT0mcXVvdDtwcm9qZWN0TmF0dXJlJnF1b3Q7IHZhbHVlPSZxdW90O29yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk5hdHVyZSZxdW90OyAvJmd0Ow0KLSAgICAgICAgICAgICZsdDsvc2VsZWN0aW9uRW5hYmxlbWVudCZndDsNCi0gICAgICAmbHQ7L21hc3Rlck9wZXJhdGlvbiZndDsgICANCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsgICANCi0tLSZndDsNCi0mbHQ7IS0tDQotRm9yIGVhY2ggb2YgdGhlIHNsYXZlT3BlcmF0aW9ucyByZWZlcmVuY2VkIGFib3ZlLCB5b3UgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBXVFAgT3BlcmF0aW9uIEV4dGVuc2lvbiBkZWNsYXJlZCBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6DQotLS0mZ3Q7DQotJmx0OyEtLQ0KLSZsdDtwcmUmZ3Q7IA0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBpZD0mcXVvdDt3dHB1aUFjaXRvbi5BY21lLkV4dGVuc2lvbnMmcXVvdDsNCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRXh0ZW5kYWJsZU9wZXJhdGlvbiZxdW90OyZndDsNCi0gICAgICAmbHQ7ZXh0ZW5kYWJsZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7DQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9leHRlbmRhYmxlT3BlcmF0aW9uJmd0Ow0KLSAgICAgICZsdDtleHRlbmRhYmxlT3BlcmF0aW9uDQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQSZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9leHRlbmRhYmxlT3BlcmF0aW9uJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuT3BlcmF0aW9uRXh0ZW5zaW9uJnF1b3Q7Jmd0Oy0tJmd0Ow0KLSAgICAgICZsdDshLS0gTWFkZSBvcHRpb25hbCBieSB0aGUgYWJvdmUgZGVjbGFyYXRpb24gLS0mZ3Q7DQotICAgICAgJmx0OyEtLSZsdDtvcGVyYXRpb25FeHRlbnNpb24NCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25BJnF1b3Q7DQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9vcGVyYXRpb25FeHRlbnNpb24mZ3Q7LS0mZ3Q7DQotICAgICAgJmx0OyEtLSBNYWRlIG9wdGlvbmFsIGJ5IHRoZSBhYm92ZSBkZWNsYXJhdGlvbiAtLSZndDsNCi0gICAgICAmbHQ7IS0tJmx0O29wZXJhdGlvbkV4dGVuc2lvbg0KLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25CJnF1b3Q7DQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQSZxdW90OyZndDsNCi0gICAgICAmbHQ7L29wZXJhdGlvbkV4dGVuc2lvbiZndDstLSZndDsgICANCi0gICAgICAmbHQ7IS0tIE5vbi1vcHRpb25hbCBvcGVyYXRpb24sIHdpbGwgYWx3YXlzIHJ1biAtLSZndDsNCi0gICAgICAmbHQ7IS0tJmx0O29wZXJhdGlvbkV4dGVuc2lvbg0KLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25DJnF1b3Q7DQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9vcGVyYXRpb25FeHRlbnNpb24mZ3Q7ICANCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgDQotJmx0Oy9wcmUmZ3Q7DQotLS0mZ3Q7DQotJmx0OyEtLQ0KLUluIGdlbmVyYWwsIHVzZXJzIGV4dGVuZGluZyBleGlzdGluZyBhY3Rpb25zIG9ubHkgbmVlZCB0byBkZWNsYXJlIHRoZSBmb2xsb3dpbmc6IA0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0Ow0KLSAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLk9wZXJhdGlvbkV4dGVuc2lvbiZxdW90OyZndDstLSZndDsgDQotICZsdDshLS0gVGhlIGFjdGlvbiByZWZlcmVuY2VkIG11c3QgYmUgZGVjbGFyZWQgYXMgZXh0ZW5zaWJsZSBieSB0aGUgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRXh0ZW5kYWJsZU9wZXJhdGlvbiBleHRlbnNpb24gcG9pbnQgLS0mZ3Q7ICAgICAgICAgDQotICAgICAgJmx0OyEtLSZsdDtvcGVyYXRpb25FeHRlbnNpb24NCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0mcXVvdDsuLi5ZT1VSIENMQVNTLi4uJnF1b3Q7ICAgICAgICAgICAgDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Li4uSUQgT0YgRVhJU1RJTkcgT1BFUkFUSU9OLi4uJnF1b3Q7Jmd0OyANCi0gICAgICAmbHQ7L29wZXJhdGlvbkV4dGVuc2lvbiZndDsgDQotICZsdDsvZXh0ZW5zaW9uJmd0OyAgICAgIA0KLSZsdDsvcHJlJmd0OyAgICAgIA0KLS0tJmd0Ow0KLSZsdDshLS0NCi1BbmQgaWYgeW91ciBvcGVyYXRpb24gaXMgb3B0aW9uYWwgZGVjbGFyZSB0aGUgc2xhdmVPcGVyYXRpb246DQotLS0mZ3Q7DQotJmx0OyEtLQ0KLSZsdDtwcmUmZ3Q7IA0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkud3RwdWlBY3Rpb24mcXVvdDsmZ3Q7IA0KLSAgICZsdDtzbGF2ZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7Li5OQU1FIE9GIFlPVVIgT1BFUkFUSU9OLi4uJnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7Li4uREVTQ1JJUFRJT04gT0YgWU9VUiBBQ1RJT04uLi4mcXVvdDsNCi0gICAgICAgICAgICBvcGVyYXRpb25DbGFzcz0mcXVvdDsuLi5ZT1VSIENMQVNTLi4uJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvc2xhdmVPcGVyYXRpb24mZ3Q7IA0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAgICAgIA0KLSZsdDsvcHJlJmd0Ow0KLS0tJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvQWRkYWJsZVBhZ2VHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvQWRkYWJsZVBhZ2VHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2MzMzYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0FkZGFibGVQYWdlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotcHVibGljIGludGVyZmFjZSBBZGRhYmxlUGFnZUdyb3VwIGV4dGVuZHMgIElETVBhZ2VHcm91cAotewotICBwdWJsaWMgdm9pZCBhZGRQYWdlKCBJV2l6YXJkUGFnZSBwYWdlICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxTeW5jaEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsU3luY2hIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlZDI3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxTeW5jaEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlRpbWVkTW9kaWZ5TGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIERhdGFNb2RlbFN5bmNoSGVscGVyIGltcGxlbWVudHMgSURhdGFNb2RlbExpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNMaW51eCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiTGludXgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0JcHJvdGVjdGVkIE1hcCB3aWRnZXRUb1Byb3BlcnR5SGFzaDsKLQlwcm90ZWN0ZWQgTWFwIHByb3BlcnR5VG9XaWRnZXRIYXNoOwotCXByb3RlY3RlZCBNYXAgd2lkZ2V0VG9EZXBDb250cm9sczsKLQotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVudFByb3BlcnR5OwotCXByb3RlY3RlZCBXaWRnZXQgY3VycmVudFdpZGdldDsKLQlwcm90ZWN0ZWQgV2lkZ2V0IGN1cnJlbnRXaWRnZXRGcm9tRXZlbnQ7IC8vIFRPRE8gTTQgc2VlIGlmIHRoaXMgc2hvdWxkIGJlIHNldCB3aXRoIGZvcgotCS8vIGxpc3RlbmVycwotCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZU1vZGlmeUV2ZW50ID0gZmFsc2U7Ci0KLQlwcml2YXRlIGNsYXNzIE1vZGlmeVRleHRMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAoaWdub3JlTW9kaWZ5RXZlbnQpCi0JCQkJcmV0dXJuOwotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSB0ZXh0KQotCQkJCXJldHVybjsKLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSB3aWRnZXRUb1Byb3BlcnR5SGFzaC5nZXQodGV4dCk7Ci0JCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRleHQuZ2V0VGV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTW9kaWZ5VGV4dExpc3RlbmVyIG1vZGlmeVRleHRMaXN0ZW5lcjsKLQlwcml2YXRlIFRpbWVkTW9kaWZ5TGlzdGVuZXIgdGltZWRNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgY2xhc3MgQ29tYm9MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAoaWdub3JlTW9kaWZ5RXZlbnQpCi0JCQkJcmV0dXJuOwotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSBjb21ibykKLQkJCQlyZXR1cm47Ci0KLQkJCXRyeSB7Ci0JCQkJY3VycmVudFdpZGdldEZyb21FdmVudCA9IGNvbWJvOwotCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSB3aWRnZXRUb1Byb3BlcnR5SGFzaC5nZXQoY29tYm8pOwotCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGNvbWJvLmdldFRleHQoKTsKLQkJCQkvLyBPbiBhIGNvbWJvIHNlbGVjdGlvbiBsaW51eCBmaXJlcyAyIGV2ZW50czsKLQkJCQkvLyB0aGUgZmlyc3QgY2xlYXJzIHRoZSB2YWx1ZSB3aGljaCBuZWVkcyB0byBiZSBpZ25vcmVkIHdoZW4gdGhlIHR5cGUgaXMgbm90IFN0cmluZwotCQkJCS8vIHRoZSBzZWNvbmQgc2V0cyB0aGUgbmV3IHZhbHVlCi0JCQkJaWYgKGlzTGludXggJiYgZGVzY3JpcHRpb24ubGVuZ3RoKCkgPT0gMCAmJiBkZXNjcmlwdG9ycy5sZW5ndGggIT0gMCAmJiAhKGRlc2NyaXB0b3JzWzBdLmdldFByb3BlcnR5VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChkZXNjcmlwdGlvbi5lcXVhbHMoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpKSkgewotCQkJCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgY29tYm8uZ2V0VGV4dCgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJY3VycmVudFdpZGdldEZyb21FdmVudCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlDb21ibyBjb21ibyA9IChDb21ibykgZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChjdXJyZW50V2lkZ2V0ID09IGNvbWJvKQotCQkJCXJldHVybjsKLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSB3aWRnZXRUb1Byb3BlcnR5SGFzaC5nZXQoY29tYm8pOwotCQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPj0gMCkgewotCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGNvbWJvLmdldEl0ZW0oY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGVzY3JpcHRpb24uZXF1YWxzKGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSkpIHsKLQkJCQkJCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGNvbWJvLmdldEl0ZW0oY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29tYm9MaXN0ZW5lciBjb21ib0xpc3RlbmVyOwotCi0JcHJpdmF0ZSBjbGFzcyBDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChjdXJyZW50V2lkZ2V0ID09IGJ1dHRvbikKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KGJ1dHRvbik7Ci0JCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ldyBCb29sZWFuKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciBjaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyOwotCi0JcHVibGljIERhdGFNb2RlbFN5bmNoSGVscGVyKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBtb2RlbDsKLQkJZGF0YU1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgQ2hlY2tCb3hWaWV3ZXJMaXN0ZW5lciBjaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIGNsYXNzIENoZWNrQm94Vmlld2VyTGlzdGVuZXIgaW1wbGVtZW50cyBJQ2hlY2tTdGF0ZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlDaGVja2JveFRhYmxlVmlld2VyIGNoZWNrQm94VGFibGVWaWV3ZXI7Ci0JCQlDaGVja2JveFRyZWVWaWV3ZXIgY2hlY2tCb3hUcmVlVmlld2VyOwotCQkJT2JqZWN0W10gaXRlbXMgPSBudWxsOwotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIENoZWNrYm94VGFibGVWaWV3ZXIpIHsKLQkJCQljaGVja0JveFRhYmxlVmlld2VyID0gKENoZWNrYm94VGFibGVWaWV3ZXIpIHZpZXdlcjsKLQkJCQlpdGVtcyA9IGNoZWNrQm94VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCQl9IGVsc2UgaWYgKHZpZXdlciBpbnN0YW5jZW9mIENoZWNrYm94VHJlZVZpZXdlcikgewotCQkJCWNoZWNrQm94VHJlZVZpZXdlciA9IChDaGVja2JveFRyZWVWaWV3ZXIpIHZpZXdlcjsKLQkJCQlpdGVtcyA9IGNoZWNrQm94VHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJCX0KLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSB3aWRnZXRUb1Byb3BlcnR5SGFzaC5nZXQodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCQlzZXRQcm9wZXJ0eUl0ZW1zKHByb3BlcnR5TmFtZSwgaXRlbXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJaW50IGZsYWcgPSBldmVudC5nZXRGbGFnKCk7Ci0JCWlmIChmbGFnID09IERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEcpCi0JCQlzZXRFbmFibGVtZW50KHByb3BlcnR5TmFtZSwgZXZlbnQuaXNQcm9wZXJ0eUVuYWJsZWQoKSk7Ci0JCWVsc2UKLQkJCXN5bmNoVUlXaXRoTW9kZWwocHJvcGVydHlOYW1lLCBmbGFnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJY3VycmVudFByb3BlcnR5ID0gcHJvcGVydHlOYW1lOwotCQl0cnkgewotCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpOwotCQl9IGZpbmFsbHkgewotCQkJY3VycmVudFByb3BlcnR5ID0gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5SXRlbXMoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0W10gaXRlbXMpIHsKLQkJY3VycmVudFByb3BlcnR5ID0gcHJvcGVydHlOYW1lOwotCQl0cnkgewotCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgaXRlbXMpOwotCQl9IGZpbmFsbHkgewotCQkJY3VycmVudFByb3BlcnR5ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFVJIHRvIGhhdmUgdGhlIHByb3BlcnR5IHZhbHVlIGRlZmluZWQgaW4gdGhlIG1vZGVsCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBsaW5rIElEYXRhTW9kZWxMaXN0ZW5lciBmb3IgdGhlIGZsYWcgdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoVUlXaXRoTW9kZWwoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgaW50IGZsYWcpIHsKLQkJaWYgKG51bGwgIT0gcHJvcGVydHlUb1dpZGdldEhhc2ggJiYgcHJvcGVydHlUb1dpZGdldEhhc2guY29udGFpbnNLZXkocHJvcGVydHlOYW1lKSkgewotCQkJaWYoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRUaHJlYWQoKSl7Ci0JCQkJZG9TeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgZmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWRvU3luY2hVSVdpdGhNb2RlbChwcm9wZXJ0eU5hbWUsIGZsYWcpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCBydW4gb24gdGhlIFVJIHRocmVhZAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcGFyYW0gZmxhZwotCSAqLwotCXByaXZhdGUgdm9pZCBkb1N5bmNoVUlXaXRoTW9kZWwoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgaW50IGZsYWcpIHsKLQkJdHJ5IHsKLQkJCWN1cnJlbnRXaWRnZXQgPSAoV2lkZ2V0KSBwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5nZXQocHJvcGVydHlOYW1lKTsKLQkJCWlmIChjdXJyZW50V2lkZ2V0ICE9IG51bGwgJiYgY3VycmVudFdpZGdldCAhPSBjdXJyZW50V2lkZ2V0RnJvbUV2ZW50KSB7Ci0JCQkJLy9XZSBtdXN0IGhvbGQgYSBjb3B5IGluIGEgdGVtcCB2YXJpYWJsZSBiZWNhdXNlIHNldHRpbmcgdGhlIHdpZGdldCB2YWx1ZQotCQkJCS8vbWF5IHRyaWdnZXIgYW4gZXZlbnQgdGhhdCB3aWxsIGNhdXNlIHRoaXMgbWV0aG9kIHRvIGJlIGNhbGxlZCBhZ2Fpbi4KLQkJCQlXaWRnZXQgd2lkZ2V0ID0gY3VycmVudFdpZGdldDsKLQkJCQl0cnkgewotCQkJCQlpZ25vcmVNb2RpZnlFdmVudCA9IHRydWU7Ci0JCQkJCWlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgVGV4dCkKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKFRleHQpIGN1cnJlbnRXaWRnZXQpOwotCQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKENvbWJvKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJfSBlbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgQnV0dG9uKQotCQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoQnV0dG9uKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIExhYmVsKQotCQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoTGFiZWwpIGN1cnJlbnRXaWRnZXQpOwotCQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKExpc3QpIGN1cnJlbnRXaWRnZXQpOwotCQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgVGFibGUpCi0JCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChUYWJsZSkgY3VycmVudFdpZGdldCk7Ci0JCQkJCWVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBUcmVlKQotCQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoVHJlZSkgY3VycmVudFdpZGdldCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWdub3JlTW9kaWZ5RXZlbnQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJLy9QYXNzIHRoZSBjb3B5IG9mIHRoZSBjdXJyZW50V2lkZ2V0Ci0JCQkJc2V0RW5hYmxlbWVudCgoQ29udHJvbCkgd2lkZ2V0LCBkYXRhTW9kZWwuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQljdXJyZW50V2lkZ2V0ID0gbnVsbDsKLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIEBwYXJhbSBjb250cm9sCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVtZW50KENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmIChjb250cm9sLmlzRW5hYmxlZCgpICE9IGVuYWJsZWQpCi0JCQljb250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXNldERlcGVuZGVudENvbnRyb2xFbmFibGVtZW50KGNvbnRyb2wsIGVuYWJsZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbmFibGVtZW50KGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAocHJvcGVydHlUb1dpZGdldEhhc2ggIT0gbnVsbCkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIHByb3BlcnR5VG9XaWRnZXRIYXNoLmdldChwcm9wZXJ0eU5hbWUpOwotCQkJCQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlzZXRFbmFibGVtZW50KGNvbnRyb2wsIGVuYWJsZWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlcGVuZGVudENvbnRyb2xFbmFibGVtZW50KENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmICh3aWRnZXRUb0RlcENvbnRyb2xzICE9IG51bGwpIHsKLQkJCUNvbnRyb2xbXSBkZXBlbmRlbnRzID0gKENvbnRyb2xbXSkgd2lkZ2V0VG9EZXBDb250cm9scy5nZXQoY29udHJvbCk7Ci0JCQlpZiAoZGVwZW5kZW50cyAhPSBudWxsKSB7Ci0JCQkJQ29udHJvbCBkZXAgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlkZXAgPSBkZXBlbmRlbnRzW2ldOwotCQkJCQlpZiAoZGVwLmlzRW5hYmxlZCgpICE9IGVuYWJsZWQpCi0JCQkJCQlkZXAuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgQnV0dG9uIGJ1dHRvbikgewotCQlpZiAoKGJ1dHRvbi5nZXRTdHlsZSgpICYgU1dULkNIRUNLKSA9PSBTV1QuQ0hFQ0sgfHwgKGJ1dHRvbi5nZXRTdHlsZSgpICYgU1dULlJBRElPKSA9PSBTV1QuUkFESU8pIHsKLQkJCWJvb2xlYW4gY2hlY2tlZCA9IGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCWlmIChidXR0b24uZ2V0U2VsZWN0aW9uKCkgIT0gY2hlY2tlZCkgewotCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24oY2hlY2tlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgQ29tYm8gY29tYm8pIHsKLQkJaWYgKGZsYWcgPT0gRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRyB8fCBjb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkvLyBEaXNwbGF5IHByb3BlcnRpZXMgc2hvdWxkIG9ubHkgZmlyZSBpZiB0aGUgY29udGVudHMgY2hhbmdlLgotCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBkYXRhTW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbZGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtc1tpXSA9IGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJfQotCQlTdHJpbmcgbmV3VGV4dCA9IGRhdGFNb2RlbC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCk7Ci0JCWludCBzZWxJbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChzZWxJbmRleCA8IDAgfHwgIW5ld1RleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oc2VsSW5kZXgpKSkgewotCQkJU3RyaW5nW10gaXRlbXMgPSBjb21iby5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpdGVtc1tpXS5lcXVhbHMobmV3VGV4dCkpIHsKLQkJCQkJY29tYm8uc2VsZWN0KGkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbWJvLnNldFRleHQobmV3VGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIFRleHQgdGV4dCkgewotCQlTdHJpbmcgbmV3VGV4dCA9IGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoIW5ld1RleHQuZXF1YWxzKHRleHQuZ2V0VGV4dCgpKSkgewotCQkJdGV4dC5zZXRUZXh0KG5ld1RleHQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIFRhYmxlIHRhYmxlKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gKE9iamVjdFtdKSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXNldFRhYmxlSXRlbXNDaGVja2VkKHRhYmxlLmdldEl0ZW1zKCksIGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlqYXZhLnV0aWwuTGlzdCBlbGVtZW50TGlzdCA9IEFycmF5cy5hc0xpc3QoZWxlbWVudHMpOwotCQlUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlSXRlbXNbaV07Ci0JCQlpZiAoZWxlbWVudExpc3QuY29udGFpbnMoaXRlbS5nZXREYXRhKCkpKQotCQkJCWl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCWVsc2UKLQkJCQlpdGVtLnNldENoZWNrZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVJdGVtc0NoZWNrZWQoVGFibGVJdGVtW10gdGFibGVJdGVtcywgYm9vbGVhbiBiKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykKLQkJCXRhYmxlSXRlbXNbaV0uc2V0Q2hlY2tlZChiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgVHJlZSB0cmVlKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gKE9iamVjdFtdKSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWphdmEudXRpbC5MaXN0IGVsZW1lbnRMaXN0ID0gQXJyYXlzLmFzTGlzdChlbGVtZW50cyk7Ci0JCVRyZWVJdGVtW10gdHJlZUl0ZW1zID0gdHJlZS5nZXRJdGVtcygpOwotCQlpZiAoZWxlbWVudExpc3Quc2l6ZSgpID09IDApIHsKLQkJCXNldFRyZWVJdGVtc0dyZXkodHJlZUl0ZW1zLCBmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRyZWVJdGVtcy5sZW5ndGggPiAwKQotCQkJc2V0VHJlZUl0ZW1DaGVja2VkKHRyZWVJdGVtcywgZWxlbWVudExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRyZWVJdGVtc0dyZXkoVHJlZUl0ZW1bXSB0cmVlSXRlbXMsIGJvb2xlYW4gYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRyZWVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IHRyZWVJdGVtc1tpXTsKLQkJCWl0ZW0uc2V0R3JheWVkKGIpOwotCQkJc2V0VHJlZUl0ZW1zR3JleSh0cmVlSXRlbXNbaV0uZ2V0SXRlbXMoKSwgYik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUcmVlSXRlbUNoZWNrZWQoVHJlZUl0ZW1bXSB0cmVlSXRlbXMsIGphdmEudXRpbC5MaXN0IGl0ZW1zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXRlbXMuY29udGFpbnModHJlZUl0ZW1zW2ldLmdldERhdGEoKSkpewotCQkJCXRyZWVJdGVtc1tpXS5zZXRDaGVja2VkKHRydWUpOwotCQkJCXRyZWVJdGVtc1tpXS5zZXRHcmF5ZWQoZmFsc2UpOwotCQkJfWVsc2V7Ci0JCQkJdHJlZUl0ZW1zW2ldLnNldEdyYXllZCh0cnVlKTsKLQkJCX0KLQkJCVRyZWVJdGVtW10gY2hpbGRlcm5JdGVtcyA9IHRyZWVJdGVtc1tpXS5nZXRJdGVtcygpOwotCQkJaWYgKGNoaWxkZXJuSXRlbXMubGVuZ3RoID4gMCkgewotCQkJCXRyZWVJdGVtc1tpXS5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCQlzZXRUcmVlSXRlbUNoZWNrZWQoY2hpbGRlcm5JdGVtcywgaXRlbXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIExhYmVsIGxhYmVsKSB7Ci0JCVN0cmluZyBuZXdUZXh0ID0gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmICghbmV3VGV4dC5lcXVhbHMobGFiZWwuZ2V0VGV4dCgpKSkgewotCQkJbGFiZWwuc2V0VGV4dChuZXdUZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnLCBMaXN0IGxpc3QpIHsKLQkJT2JqZWN0IG5ld0NvbnRlbnRzID0gZGF0YU1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChuZXdDb250ZW50cyA9PSBudWxsKSB7Ci0JCQlsaXN0LnNldEl0ZW1zKG5ldyBTdHJpbmdbMF0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChuZXdDb250ZW50cyBpbnN0YW5jZW9mIGphdmEudXRpbC5MaXN0KSB7Ci0JCQlqYXZhLnV0aWwuTGlzdCBtb2RlbENvbnRlbnRzID0gKGphdmEudXRpbC5MaXN0KSBuZXdDb250ZW50czsKLQkJCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1ttb2RlbENvbnRlbnRzLnNpemUoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsQ29udGVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpdGVtc1tpXSA9IG1vZGVsQ29udGVudHMuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkJfSBlbHNlIGlmIChuZXdDb250ZW50cyBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7Ci0JCQlsaXN0LnNldEl0ZW1zKChTdHJpbmdbXSkgbmV3Q29udGVudHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hBbGxVSVdpdGhNb2RlbCgpIHsKLQkJaWYgKG51bGwgIT0gcHJvcGVydHlUb1dpZGdldEhhc2gpIHsKLQkJCUNvbGxlY3Rpb24ga2V5cyA9IHByb3BlcnR5VG9XaWRnZXRIYXNoLmtleVNldCgpOwotCQkJaWYgKCFrZXlzLmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIHByb3BlcnR5TmFtZXMgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IG51bGw7Ci0JCQkJd2hpbGUgKHByb3BlcnR5TmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCXByb3BlcnR5TmFtZSA9IChTdHJpbmcpIHByb3BlcnR5TmFtZXMubmV4dCgpOwotCQkJCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaENvbXBvc2l0ZShXaWRnZXQgd2lkZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwQ29udHJvbHMpIHsKLQkJaWYgKG51bGwgPT0gd2lkZ2V0VG9Qcm9wZXJ0eUhhc2gpCi0JCQl3aWRnZXRUb1Byb3BlcnR5SGFzaCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChwcm9wZXJ0eVRvV2lkZ2V0SGFzaCA9PSBudWxsKQotCQkJcHJvcGVydHlUb1dpZGdldEhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCQl3aWRnZXRUb1Byb3BlcnR5SGFzaC5wdXQod2lkZ2V0LCBwcm9wZXJ0eU5hbWUpOwotCQlwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5wdXQocHJvcGVydHlOYW1lLCB3aWRnZXQpOwotCQlpZiAoZGVwQ29udHJvbHMgIT0gbnVsbCkgewotCQkJaWYgKHdpZGdldFRvRGVwQ29udHJvbHMgPT0gbnVsbCkKLQkJCQl3aWRnZXRUb0RlcENvbnRyb2xzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXdpZGdldFRvRGVwQ29udHJvbHMucHV0KHdpZGdldCwgZGVwQ29udHJvbHMpOwotCQl9Ci0JCXN5bmNoVUlXaXRoTW9kZWwocHJvcGVydHlOYW1lLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoVGV4dChUZXh0IHRleHQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaFRleHQodGV4dCwgcHJvcGVydHlOYW1lLCBmYWxzZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoVGV4dChUZXh0IHRleHQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gaXNUaW1lTW9kaWZpZWQsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZSh0ZXh0LCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQkJaWYgKGlzVGltZU1vZGlmaWVkKQotCQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRUaW1lZExpc3RlbmVyKCkpOwotCQllbHNlCi0JCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldE1vZGlmeVRleHRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaExhYmVsKExhYmVsIGxhYmVsLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUobGFiZWwsIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGlzIHRvIHN5bmNoIHRoZSBjb250ZW50cyBvZiB0aGUgPGNvZGU+bGlzdDwvY29kZT4gdG8gdGhlIExpc3QgZWxlbWVudHMgcmV0dXJuZWQgZnJvbQotCSAqIHRoZSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoTGlzdChMaXN0IGxpc3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZShsaXN0LCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyB0byBzeW5jaCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBDb21ibyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lLiBUaGUKLQkgKiBwb3NzaWJsZSB2YWx1ZXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGFyZSBkZXRlcm1pbmVkIGJ5IHJldHVybiBvZgotCSAqIElEYXRhTW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykuCi0JICogCi0JICogQHBhcmFtIGNvbWJvCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSBkZXBlbmRlbnRDb250cm9scwotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoQ29tYm8oQ29tYm8gY29tYm8sIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZShjb21ibywgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChudWxsID09IGNvbWJvTGlzdGVuZXIpIHsKLQkJCWNvbWJvTGlzdGVuZXIgPSBuZXcgQ29tYm9MaXN0ZW5lcigpOwotCQl9Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyB0byBzeW5jIHRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNoZWNrYm94IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9wZXJ0eU5hbWUuIFRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIG11c3QgY29udGFpbiBhIGphdmEubGFuZy5Cb29sZWFuIHR5cGVkIE9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gY2hlY2tib3gKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIGRlcGVuZGVudENvbnRyb2xzCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hDaGVja2JveChCdXR0b24gY2hlY2tib3gsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZShjaGVja2JveCwgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChudWxsID09IGNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJCWNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JCWNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoQ2hlY2tCb3hUYWJsZVZpZXdlcihDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVmlld2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUodGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQkJaWYgKG51bGwgPT0gY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyKSB7Ci0JCQljaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIgPSBuZXcgQ2hlY2tCb3hWaWV3ZXJMaXN0ZW5lcigpOwotCQl9Ci0JCXRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoQ2hlY2tCb3hUcmVlVmlld2VyKENoZWNrYm94VHJlZVZpZXdlciB0cmVlVmlld2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJc3luY2hDb21wb3NpdGUodHJlZVZpZXdlci5nZXRDb250cm9sKCksIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCQlpZiAobnVsbCA9PSBjaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIpIHsKLQkJCWNoZWNrQm94Vmlld2VyU3RhdGVMaXN0ZW5lciA9IG5ldyBDaGVja0JveFZpZXdlckxpc3RlbmVyKCk7Ci0JCX0KLQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIoY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaFJhZGlvKEJ1dHRvbiByYWRpbywgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcGVuZGVudENvbnRyb2xzKSB7Ci0JCS8vIFVzZXMgY2hlY2tib3ggc3luY2hlcgotCQlzeW5jaENoZWNrYm94KHJhZGlvLCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQl9Ci0KLQlwcml2YXRlIFRpbWVkTW9kaWZ5TGlzdGVuZXIgZ2V0VGltZWRMaXN0ZW5lcigpIHsKLQkJaWYgKHRpbWVkTW9kaWZ5TGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRpbWVkTW9kaWZ5TGlzdGVuZXIgPSBuZXcgVGltZWRNb2RpZnlMaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLQkJCQkJV2lkZ2V0IHcgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQkJCQlpZiAoY3VycmVudFdpZGdldCA9PSB3IHx8IHcuaXNEaXNwb3NlZCgpKQotCQkJCQkJcmV0dXJuOwotCQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KHcpOwotCQkJCQlzZXRUZXh0UHJvcGVydHkocHJvcGVydHlOYW1lLCAoVGV4dCkgdyk7Ci0JCQkJfQotCQkJfSkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAoaWdub3JlTW9kaWZ5RXZlbnQpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXN1cGVyLm1vZGlmeVRleHQoZSk7Ci0JCQkJfQotCQkJfTsKLQkJcmV0dXJuIHRpbWVkTW9kaWZ5TGlzdGVuZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFRleHQgdGV4dCkgewotCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRleHQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeVRleHRMaXN0ZW5lciBnZXRNb2RpZnlUZXh0TGlzdGVuZXIoKSB7Ci0JCWlmIChudWxsID09IG1vZGlmeVRleHRMaXN0ZW5lcikKLQkJCW1vZGlmeVRleHRMaXN0ZW5lciA9IG5ldyBNb2RpZnlUZXh0TGlzdGVuZXIoKTsKLQkJcmV0dXJuIG1vZGlmeVRleHRMaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGF0YU1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQljaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyID0gbnVsbDsKLQkJY3VycmVudFdpZGdldCA9IG51bGw7Ci0JCW1vZGlmeVRleHRMaXN0ZW5lciA9IG51bGw7Ci0JCXByb3BlcnR5VG9XaWRnZXRIYXNoID0gbnVsbDsKLQkJdGltZWRNb2RpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCXdpZGdldFRvRGVwQ29udHJvbHMgPSBudWxsOwotCQl3aWRnZXRUb1Byb3BlcnR5SGFzaCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2Y2JmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWkuV2FybmluZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZWNsaXBzZS51aS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5QYWdlR3JvdXBNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBDb21tb25VSVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YU1vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSURNUGFnZUhhbmRsZXIgewotCQotCXByaXZhdGUgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0JcHJpdmF0ZSBBZGRhYmxlUGFnZUdyb3VwIHJvb3RQYWdlR3JvdXA7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gcm9vdE9wZXJhdGlvbjsKLQotCXByaXZhdGUgUGFnZUdyb3VwTWFuYWdlciBwYWdlR3JvdXBNYW5hZ2VyOwotCXByaXZhdGUgUGFnZUV4dGVuc2lvbk1hbmFnZXIgcGFnZUV4dGVuc2lvbk1hbmFnZXI7Ci0KLQkvLyBwcml2YXRlIElXaXphcmRQYWdlIGZpcnN0cGFnZTsKLQotCXB1YmxpYyBEYXRhTW9kZWxXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgd2l6YXJkIElEIHRoYXQgY2xpZW50cyBzaG91bGQgZXh0ZW5kIHRvIGFkZCB0byB0aGlzIHdpemFyZAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0V2l6YXJkSUQoKSB7Ci0JCXJldHVybiBnZXREYXRhTW9kZWwoKS5nZXRJRCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyB0aGUgcm9vdCBvcGVyYXRpb24gZm9yIHRoaXMgd2l6YXJkLgotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gZ2V0Um9vdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24pZ2V0RGF0YU1vZGVsKCkuZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgZmluYWxpemVkIHRvIGhhbmRsZSB0aGUgYWRkaW5nIG9mIGV4dGVuZGVkIHBhZ2VzLiBDbGllbnRzIHNob3VsZCBvdmVycmlkZQotCSAqIGRvQWRkUGFnZXMoKSB0byBhZGQgdGhlaXIgcGFnZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWluaXQoKTsKLQkJZG9BZGRQYWdlcygpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBwYWdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZFBhZ2VzKCkgewotCX0KLQotCS8vIFRPRE8gbWFrZSB0aGlzIGZpbmFsCi0JcHVibGljIElXaXphcmRQYWdlIGdldFN0YXJ0aW5nUGFnZSgpIHsKLQkJcGFnZUdyb3VwTWFuYWdlci5yZXNldCgpOwotCQlyZXR1cm4gZ2V0TmV4dFBhZ2UobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyB3aXNoaW5nIHRvIGNvbnRyb2wgdGhlIHBhZ2Ugb3JkZXJpbmcgc2hvdWxkIGRvIHNvIGJ5IG92ZXJyaWRpbmcKLQkgKiBnZXROZXh0UGFnZShTdHJpbmcsIFN0cmluZykgYW5kIGdldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKiAKLQkgKiBAbGluayAjZ2V0TmV4dFBhZ2UoU3RyaW5nLCBTdHJpbmcpCi0JICogQGxpbmsgI2dldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQkvLyBUT0RPIG1ha2UgdGhpcyBmaW5hbAotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0KLQkJSVdpemFyZFBhZ2UgY3VycmVudFBhZ2UgPSBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKTsKLQotCQkvLyBJZiBhbiBlcnJvciBvY2N1cmVkIHRoZW4gdGhlIGN1cnJlbnQgcGFnZSBhbmQgdGhlIG5leHQgcGFnZSB3aWxsIGJlIHRoZSBzYW1lLgotCQlpZiAoY3VycmVudFBhZ2UgIT0gbmV4dFBhZ2UgJiYgbmV4dFBhZ2UgIT0gbnVsbCkgewotCQkJbmV4dFBhZ2Uuc2V0V2l6YXJkKHRoaXMpOwotCQkJbmV4dFBhZ2Uuc2V0UHJldmlvdXNQYWdlKGN1cnJlbnRQYWdlKTsKLQkJfQotCi0JCXJldHVybiBjdXJyZW50UGFnZSA9PSBuZXh0UGFnZSA/IG51bGwgOiBuZXh0UGFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZE5leHRQYWdlTmFtZSkgewotCQlyZXR1cm4gZXhwZWN0ZWROZXh0UGFnZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyB3aXNoaW5nIHRvIGNvbnRyb2wgdGhlIHBhZ2Ugb3JkZXJpbmcgc2hvdWxkIGRvIHNvIGJ5IG92ZXJyaWRpbmcKLQkgKiBnZXROZXh0UGFnZShTdHJpbmcsIFN0cmluZykgYW5kIGdldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKiAKLQkgKiBAbGluayAjZ2V0TmV4dFBhZ2UoU3RyaW5nLCBTdHJpbmcpCi0JICogQGxpbmsgI2dldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQkvLyBUT0RPIG1ha2UgdGhpcyBmaW5hbAotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlyZXR1cm4gcGFnZSAhPSBudWxsID8gcGFnZS5nZXRQcmV2aW91c1BhZ2UoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmV2aW91c1BhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkUHJldmlvdXNQYWdlTmFtZSkgewotCQlyZXR1cm4gZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKCFzdXBlci5jYW5GaW5pc2goKSB8fCAhZ2V0RGF0YU1vZGVsKCkuaXNWYWxpZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgUGFnZUdyb3VwTWFuYWdlciBnZXRQYWdlR3JvdXBNYW5hZ2VyKCkgewotCQlyZXR1cm4gcGFnZUdyb3VwTWFuYWdlcjsKLQl9Ci0JCi0JcHVibGljIFBhZ2VFeHRlbnNpb25NYW5hZ2VyIGdldFBhZ2VFeHRlbnNpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gcGFnZUV4dGVuc2lvbk1hbmFnZXI7Ci0JfQotCi0JLy8gVE9ETyBuZWVkIHRvIGltcGxlbWVudCB0aGlzLiBQZXJoYXBzIGluIHRoZSBQYWdlR3JvdXBNYW5hZ2VyCi0JLy8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldEFmdGVyRmluaXNoRXJyb3IoKSB7Ci0JCS8vIElXaXphcmRQYWdlW10gcGFnZXMgPSBnZXRQYWdlcygpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIERhdGFNb2RlbFdpemFyZFBhZ2Ugd3RwUGFnZSA9IChEYXRhTW9kZWxXaXphcmRQYWdlKSBwYWdlc1tpXTsKLQkJLy8gd3RwUGFnZS52YWxpZGF0ZVBhZ2UodHJ1ZSk7Ci0JCS8vIH0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4ZWN1dGluZygpIHsKLQkJcmV0dXJuIGV4ZWN1dGluZzsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGluZyA9IGZhbHNlOwotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGluZyA9IHRydWU7Ci0JCQlpZiAocHJlUGVyZm9ybUZpbmlzaCgpKSB7Ci0JCQkJc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLQotCQkJCWZpbmFsIElTdGF0dXMgc3QgPSBydW5PcGVyYXRpb25zKCk7Ci0KLQkJCQlpZiAoc3QuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCVdUUFVJUGx1Z2luLmxvZyhzdCk7Ci0JCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzAsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgbmV3IENvcmVFeGNlcHRpb24oc3QpLCAwLCBmYWxzZSk7Ci0JCQkJfSBlbHNlIGlmKHN0LmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKXsKLQkJCQkJV2FybmluZ0RpYWxvZy5vcGVuV2FybmluZyhnZXRTaGVsbCgpLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzIsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIHN0LmdldE1lc3NhZ2UoKSwgc3QsIElTdGF0dXMuV0FSTklORyk7Ci0JCQkJfQotCi0JCQkJcG9zdFBlcmZvcm1GaW5pc2goKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJV1RQVUlQbHVnaW4ubG9nKGV4Yyk7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8wLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzEsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIGV4YywgMCwgZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJZXhlY3V0aW5nID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgcnVuT3BlcmF0aW9ucygpIHsKLQkJZmluYWwgSVN0YXR1c1tdIHN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOwotCQljbGFzcyBDYXRjaFRocm93YWJsZVJ1bm5hYmxlV2l0aFByb2dyZXNzIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQkJCXB1YmxpYyBUaHJvd2FibGUgY2F1Z2h0ID0gbnVsbDsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJCQl0cnkgewotCQkJCQlpZiAocm9vdE9wZXJhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkvL1RoaXMgd2lsbCBiZSB0aGUgdHlwaWNhbCBjYXNlIGJlY2F1c2UgbW9zdCB3aXphcmRzIHdpbGwKLQkJCQkJCS8vbm90IGluaXRpYWxpemUgdGhlIHJvb3Qgb3BlcmF0aW9uIGR1cmluZyBpbml0LgotCQkJCQkJcm9vdE9wZXJhdGlvbiA9IGdldFJvb3RPcGVyYXRpb24oKTsKLQkJCQkJfQotCQkJCQlzdGF0dXNbMF0gPSByb290T3BlcmF0aW9uLmV4ZWN1dGUocG0sIG51bGwpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCWNhdWdodCA9IGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNhdGNoVGhyb3dhYmxlUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgQ2F0Y2hUaHJvd2FibGVSdW5uYWJsZVdpdGhQcm9ncmVzcygpOwotCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4ocnVuRm9ya2VkKCksIGlzQ2FuY2VsYWJsZSgpLCBydW5uYWJsZSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlydW5uYWJsZS5jYXVnaHQgPSBlOwotCQl9Ci0JCWlmIChydW5uYWJsZS5jYXVnaHQgIT0gbnVsbCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHJ1bm5hYmxlLmNhdWdodCk7Ci0JCQlzdGF0dXNbMF0gPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJpZCIsIDAsIHJ1bm5hYmxlLmNhdWdodC5nZXRNZXNzYWdlKCksIHJ1bm5hYmxlLmNhdWdodCk7IC8vJE5PTi1OTFMtMSQKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzAsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgcnVubmFibGUuY2F1Z2h0LCAwLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1c1swXTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlwYWdlR3JvdXBNYW5hZ2VyLnVuZG9BbGxDdXJyZW50T3BlcmF0aW9ucygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0byBwZXJmb3JtIGFueSB0YXNrcyBwcmlvciB0byBydW5uaW5nIHRoZSBvcGVyYXRpb24uIFJldHVybiB0cnVlIHRvCi0JICogaGF2ZSB0aGUgb3BlcmF0aW9uIHJ1biBhbmQgZmFsc2UgdG8gc3RvcCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBvcGVyYXRpb24uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZVBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzYXJ5IGFmdGVyIHBlcmZvcm1pbmcgRmluaXNoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQlwYWdlR3JvdXBNYW5hZ2VyLnN0b3JlRGVmYXVsdFNldHRpbmdzKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBEYXRhTW9kZWxXaXphcmRQYWdlKQotCQkJKChEYXRhTW9kZWxXaXphcmRQYWdlKSBwYWdlKS5zdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCX0KLQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgaWYgdGhleSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsIHdoZW4gc3RvcmluZyB0aGUgZGVmYXVsdAotCSAqIHNldHRpbmdzIGZvciBhIHBhcnRpY3VsYXIgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZQotCSAqIEBwYXJhbSBwYWdlSW5kZXgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncyhJV2l6YXJkUGFnZSBwYWdlLCBpbnQgcGFnZUluZGV4KSB7Ci0JCXN0b3JlRGVmYXVsdFNldHRpbmdzKHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGlmIHRoZSBydW5uaW5nIG9wZXJhdGlvbiBpcyBhbGxvd2VkIHRvIGJlIGNhbmNlbGxlZC4gVGhlIGRlZmF1bHQKLQkgKiBpcyBmYWxzZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYW5jZWxhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcmV0dXJuIGZhbHNlIGlmIHRoZSBydW5uaW5nIG9wZXJhdGlvbiBjYW5ub3QgYmUgcnVuIGZvcmtlZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuRm9ya2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotCQl0aGlzLmRhdGFNb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlpZiAobnVsbCA9PSBkYXRhTW9kZWwpIHsKLQkJCWRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKGdldERlZmF1bHRQcm92aWRlcigpKTsKLQkJfQotCi0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobnVsbCAhPSByb290UGFnZUdyb3VwKSB7Ci0JCQlMaXN0IHBhZ2VzID0gcm9vdFBhZ2VHcm91cC5nZXRQYWdlcyhkYXRhTW9kZWwpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhZ2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQl7Ci0JCQkJT2JqZWN0IHBhZ2UgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJV2l6YXJkUGFnZSkKLQkJCQl7Ci0JCQkJCSgoSVdpemFyZFBhZ2UpcGFnZSkuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobnVsbCAhPSBkYXRhTW9kZWwpIHsKLQkJCWRhdGFNb2RlbC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byByZXR1cm4gYSBTaW1wbGVQYWdlR3JvdXAuIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gb3ZlcnJpZGVkIHRoaXMgbWV0aG9kIHRvCi0JICogcmV0dXJuIGEgZGlmZmVyZW50IHJvb3QgcGFnZSBncm91cCBmb3IgdGhlIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEFkZGFibGVQYWdlR3JvdXAgY3JlYXRlUm9vdFBhZ2VHcm91cCgpIHsKLQkJU3RyaW5nIGlkID0gZ2V0V2l6YXJkSUQoKTsKLQkJLy8gRm9yIHRoZSByb290IHBhZ2UgZ3JvdXAgdGhlIHdpemFyZCBpZCBhbmQgdGhlIGdyb3VwIGlkIGFyZSB0aGUgc2FtZS4KLQkJU2ltcGxlUGFnZUdyb3VwIHBhZ2VHcm91cCA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoaWQsIGlkKTsKLQkJcGFnZUdyb3VwLnNldFBhZ2VIYW5kbGVyKHRoaXMpOwotCQlyZXR1cm4gcGFnZUdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgd2l6YXJkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSUVudmlyb25tZW50IGNyZWF0ZUVudmlyb25tZW50KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VFbnZpcm9ubWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlyb290UGFnZUdyb3VwLmFkZFBhZ2UocGFnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXJvb3RQYWdlR3JvdXAgPSBjcmVhdGVSb290UGFnZUdyb3VwKCk7Ci0JCWlmIChuZWVkc1RvUnVuT3BlcmF0aW9uc0JlZm9yZUZpbmlzaCgpKSB7Ci0JCQlyb290T3BlcmF0aW9uID0gZ2V0Um9vdE9wZXJhdGlvbigpOwotCQkJcGFnZUdyb3VwTWFuYWdlciA9IG5ldyBQYWdlR3JvdXBNYW5hZ2VyKHJvb3RPcGVyYXRpb24sIHJvb3RQYWdlR3JvdXApOwotCQl9IGVsc2UgewotCQkJcGFnZUdyb3VwTWFuYWdlciA9IG5ldyBQYWdlR3JvdXBNYW5hZ2VyKGdldERhdGFNb2RlbCgpLCByb290UGFnZUdyb3VwKTsKLQkJfQotCQlwYWdlRXh0ZW5zaW9uTWFuYWdlciA9IG5ldyBQYWdlRXh0ZW5zaW9uTWFuYWdlcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcmV0dXJuIHRydWUgaWYgdGhleSByZXF1aXJlIHRoZSBydW5uaW5nCi0JICogb2YgdGhlIG9wZXJhdGlvbiBkdXJpbmcgcGFnZSB0dXJuaW5nLgotCSAqIAotCSAqIEByZXR1cm4gQSBib29sZWFuIGRlZmF1bHRlZCB0byBmYWxzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc1RvUnVuT3BlcmF0aW9uc0JlZm9yZUZpbmlzaCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpIHsKLQkJcmV0dXJuIHN1cGVyLm5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpIHx8IGdldFBhZ2VHcm91cE1hbmFnZXIoKS5oYXNNdWx0aXBsZVBhZ2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzc2ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWkuRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsV2l6YXJkRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBEYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIgcmVhZGVyOwotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIERhdGFNb2RlbFdpemFyZCBieSB0aGUgc3BlY2lmaWVkIGlkIGFuZAotCSAqIGNvbnN0cnVjdHMgYSBuZXcgRGF0YU1vZGVsV2l6YXJkIHVzaW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBJRGF0YU1vZGVsCi0JICogbG9va2VkIHVwIHdpdGggdGhlIHNhbWUgaWQuIElmIHRoZSBEYXRhTW9kZWxXaXphcmQgaXMgbm90IGZvdW5kIHRoZW4gYQotCSAqIFJ1bnRpbWVFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBEYXRhTW9kZWxXaXphcmQKLQkgKiBAcmV0dXJuIGEgbmV3IERhdGFNb2RlbFdpemFyZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsV2l6YXJkIGNyZWF0ZVdpemFyZChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGNyZWF0ZVdpemFyZChEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChpZCkpOwotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBEYXRhTW9kZWxXaXphcmQgdXNpbmcgdGhlIGlkIHJldHVyZWQgZnJvbQotCSAqIDxjb2RlPmRhdGFNb2RlbC5nZXRJRCgpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybiBhIG5ldyBEYXRhTW9kZWxXaXphcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERhdGFNb2RlbFdpemFyZCBjcmVhdGVXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIGxvYWRXaXphcmQoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEYXRhTW9kZWxXaXphcmQgbG9hZFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAobnVsbCA9PSByZWFkZXIpIHsKLQkJCXJlYWRlciA9IG5ldyBEYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVhZGVyLmdldFdpemFyZChkYXRhTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBEYXRhTW9kZWxXaXphcmQgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGNsYXNzIGFzIHRoZSBpZC4gVGhpcyBtZXRob2QgaXMgZXF1YXZhbGVudCB0bwotCSAqIDxjb2RlPmNyZWF0ZVdpemFyZChjbGFzc0lELmdldE5hbWUoKSk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc0lECi0JICogICAgICAgICAgICB0aGUgY2xhc3Mgd2hvc2UgbmFtZSBpcyB0aGUgaWQgb2YgdGhlIERhdGFNb2RlbFdpemFyZAotCSAqIEByZXR1cm4gYSBuZXcgRGF0YU1vZGVsV2l6YXJkCi0JICovCi0JcHVibGljIHN0YXRpYyBEYXRhTW9kZWxXaXphcmQgY3JlYXRlV2l6YXJkKENsYXNzIGRhdGFNb2RlbFByb3ZpZGVySUQpIHsKLQkJcmV0dXJuIGNyZWF0ZVdpemFyZChkYXRhTW9kZWxQcm92aWRlcklELmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdiZjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5WYWxpZGF0aW9uU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhTW9kZWxXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyLCBJRGF0YU1vZGVsTGlzdGVuZXIgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5FWFQgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSRVZJT1VTID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT01QT1NJVEVfQk9SREVSID0gU1dULk5VTEw7Ci0JcHJpdmF0ZSBWYWxpZGF0aW9uU3RhdHVzIHN0YXR1cyA9IG5ldyBWYWxpZGF0aW9uU3RhdHVzKCk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGlzRmlyc3RUaW1lVG9QYWdlID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBtb2RlbDsKLQlwcml2YXRlIE1hcCB2YWxpZGF0aW9uTWFwOwotCXByaXZhdGUgU3RyaW5nW10gdmFsaWRhdGlvblByb3BlcnR5TmFtZXM7Ci0JcHJvdGVjdGVkIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCXByaXZhdGUgU3RyaW5nIGluZm9wb3BJRDsKLQlwcml2YXRlIERhdGFNb2RlbFdpemFyZCB3aXphcmQ7Ci0JcHJpdmF0ZSBJV2l6YXJkUGFnZSBwcmV2aW91c1BhZ2U7Ci0KLQkvKioKLQkgKiBKMkVFV2l6YXJkUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBEYXRhTW9kZWxXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJbW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCXN5bmNoSGVscGVyID0gaW5pdGlhbGl6ZVN5bmNoSGVscGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIERhdGFNb2RlbFN5bmNoSGVscGVyIGluaXRpYWxpemVTeW5jaEhlbHBlcihJRGF0YU1vZGVsIGRtKSB7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIoZG0pOwotCX0KLQotCS8qKgotCSAqIEoyRUVXaXphcmRQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHRpdGxlSW1hZ2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCBEYXRhTW9kZWxXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHRpdGxlLCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IgdGl0bGVJbWFnZSkgewotCQlzdXBlcihwYWdlTmFtZSwgdGl0bGUsIHRpdGxlSW1hZ2UpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCW1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQlzeW5jaEhlbHBlciA9IGluaXRpYWxpemVTeW5jaEhlbHBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9wIGxldmVsIGNvbnRyb2wgZm9yIHRoaXMgZGlhbG9nIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuIFRoaXMKLQkgKiBtZXRob2QgaGFzIGJlZW4gYWJzdHJhY3QgYW5kIGl0IHVzZXMgdGhlIHRlbXBsYXRlIHBhdHRlcm4gdG8gZ2V0IHRoZSBjb3JyZWN0IGl0ZW1zIHNldHVwIGluCi0JICogdGhlIGNvcnJlY3Qgb3JkZXIuIFNlZSB0aGUgc2V0IG9mIG1ldGhvZHMgYmVsb3cgdGhhdCBhcmUgY2FsbGVkIGluIHRoaXMgbWV0aG9kLgotCSAqIDxwPgotCSAqIEltcGxlbWVudG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIGNyZWF0ZWQgY29udHJvbCBjYW4gYmUgYWNjZXNzZWQgdmlhCi0JICogPGNvZGU+Z2V0Q29udHJvbDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRvcCA9IGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWFkZEV4dGVuZGVkQ29udHJvbHModG9wKTsKLQkJc2V0Q29udHJvbCh0b3ApOwotCQlzZXR1cEluZm9wb3AodG9wKTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWluaXRpYWxpemVWYWxpZGF0aW9uUHJvcGVydGllcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFeHRlbmRlZENvbnRyb2xzKENvbXBvc2l0ZSB0b3ApIHsKLQkJSVdpemFyZCBfd2l6YXJkID0gZ2V0V2l6YXJkKCk7Ci0JCWlmIChfd2l6YXJkIGluc3RhbmNlb2YgRGF0YU1vZGVsV2l6YXJkKSB7Ci0JCQlQYWdlRXh0ZW5zaW9uTWFuYWdlciBwYWdlRXh0ZW5zaW9uTWFuYWdlciA9ICgoRGF0YU1vZGVsV2l6YXJkKSBfd2l6YXJkKS5nZXRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpOwotCQkJcGFnZUV4dGVuc2lvbk1hbmFnZXIuY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKHRvcCwgbW9kZWwsIGdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCkgewotCQl2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9IGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0JCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9PSBudWxsIHx8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCA9PSAwKQotCQkJdmFsaWRhdGlvbk1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJZWxzZSB7Ci0JCQl2YWxpZGF0aW9uTWFwID0gbmV3IEhhc2hNYXAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspCi0JCQkJdmFsaWRhdGlvbk1hcC5wdXQodmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV0sIG5ldyBJbnRlZ2VyKGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQkvLyBUT0RPIHdoeSBpcyB0aGF0IGxhc3QgZ2V0TmV4dFBhZ2UoKSBjYWxsIGhlcmU/Pz8KLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCkgJiYgKChudWxsICE9IHdpemFyZCAmJiB3aXphcmQuZ2V0UGFnZUdyb3VwTWFuYWdlcigpLmhhc05leHRQYWdlKCkgfHwgbnVsbCAhPSBnZXROZXh0UGFnZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkUGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaXphcmQoSVdpemFyZCBuZXdXaXphcmQpIHsKLQkJc3VwZXIuc2V0V2l6YXJkKG5ld1dpemFyZCk7Ci0JCWlmIChuZXdXaXphcmQgaW5zdGFuY2VvZiBEYXRhTW9kZWxXaXphcmQpIHsKLQkJCXdpemFyZCA9IChEYXRhTW9kZWxXaXphcmQpIG5ld1dpemFyZDsKLQkJfQotCX0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoKSB7Ci0JCXJldHVybiBwcmV2aW91c1BhZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXNQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJc3VwZXIuc2V0UHJldmlvdXNQYWdlKHBhZ2UpOwotCQlwcmV2aW91c1BhZ2UgPSBwYWdlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIHNob3VsZCByZXR1cm4gdGhlIG1vZGVsIHByb3BlcnR5IG5hbWVzIHRoYXQgbmVlZCB0byBiZSB2YWxpZGF0ZWQgb24gdGhpcyBwYWdlIGluIHRoZQotCSAqIG9yZGVyIHRoYXQgdGhleSBzaG91bGQgcHJlc2VudCB0aGVpciBtZXNzYWdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRvcCBsZXZlbCBDb21wb3NpdGUgZm9yIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogU2V0IHVwIGluZm8gcG9wIGhvb2tzIGlmIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEluZm9wb3AoQ29udHJvbCBwYXJlbnQpIHsKLQkJaWYgKGdldEluZm9wb3BJRCgpICE9IG51bGwpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgZ2V0SW5mb3BvcElEKCkpOwotCX0KLQotCS8qKgotCSAqIFNldHVwIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhpcyBwYWdlLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBwcm92aWRlIGFwcHJvcHJpYXRlCi0JICogZGVmYXVsdHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JCXJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaWYgdGhleSBoYXZlIGRlZmF1bHQgc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gc3RvcmVkCi0JICogYW5kIG5lZWQgdG8gYmUgcmVzdG9yZWQuCi0JICogCi0JICogQHNlZSBzdG9yZURlZmF1bHRTZXR0aW5ncygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgTGlzdGVuZXJzIHRvIGNvbnRyb2xzIGF0IHRoaXMgcG9pbnQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZXZlbnRzLiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRvIGFkZCBsaXN0ZW5lcnMgdG8gaXRzIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFnZSBpcyBiZWluZyBtYWRlIGN1cnJlbnQgYW5kIHZpc2libGUuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKLQkJdHJ5IHsKLQkJCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgbW92aW5nIGJhY2sgb25lIHBhZ2UuCi0JCQlpZiAobnVsbCAhPSB3aXphcmQgJiYgd2l6YXJkLmdldFByZXZpb3VzUGFnZSh3aXphcmQuZ2V0UGFnZUdyb3VwTWFuYWdlcigpLmdldEN1cnJlbnRQYWdlKCkpID09IHRoaXMpIHsKLQkJCQl3aXphcmQuZ2V0UGFnZUdyb3VwTWFuYWdlcigpLm1vdmVCYWNrT25lUGFnZSgpOwotCQkJfQotCi0JCQl2YWxpZGF0ZVBhZ2Uoc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaXNGaXJzdFRpbWVUb1BhZ2UgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiB0cnVlIHVubGVzcyBpdCBpcyB0aGUgZmlyc3QgdGltZSBlbnRlcmluZyB0aGlzIHBhZ2UgaW4KLQkgKiB3aGljaCBjYXNlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHBhZ2UgYW5kIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vdC4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpZiB0aGV5IGRvIG5vdCB3YW50IHRoaXMgZGVmYXVsdCBiZWhhdmlvci4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93VmFsaWRhdGlvbkVycm9yc09uRW50ZXIoKSB7Ci0JCXJldHVybiAhaXNGaXJzdFRpbWVUb1BhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gdHJ1ZSB1bmxlc3MgaXQgaXMgdGhlIGZpcnN0IHRpbWUgZW50ZXJpbmcgdGhpcyBwYWdlIGluCi0JICogd2hpY2ggY2FzZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBwYWdlIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBub3QuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaWYgdGhleSBkbyBub3Qgd2FudCB0aGlzIGRlZmF1bHQgYmVoYXZpb3IuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB1c2Ugc2hvd1ZhbGlkYXRvaW5FcnJvcnNPbkVudGVyIGluc3RlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZU9uRW50ZXIoKSB7Ci0JCXJldHVybiBzaG93VmFsaWRhdGlvbkVycm9yc09uRW50ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGl0aW5nIHRoZSBwYWdlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhpdCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRTdGF0dXMoSW50ZWdlciBrZXkpIHsKLQkJcmV0dXJuIHN0YXR1cy5oYXNFcnJvcihrZXkpOwotCX0KLQotCS8qKgotCSAqIFNlbnQgd2hlbiBhbiBldmVudCB0aGF0IHRoZSByZWNlaXZlciBoYXMgcmVnaXN0ZXJlZCBmb3Igb2NjdXJzLiBJZiBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGlzCi0JICogbWV0aG9kLCBpdCBtdXN0IGNhbGwgc3VwZXIuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZXZlbnQgd2hpY2ggb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBwYWdlIGJhc2VkIG9uIHRoZSBsYXN0IGVycm9yIGluIHRoZSBWYWxpZGF0aW9uU3RhdHVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yID0gc3RhdHVzLmdldExhc3RFcnJNc2coKTsKLQkJaWYgKGVycm9yID09IG51bGwpIHsKLQkJCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJCXNldEVycm9yTWVzc2FnZSgoU3RyaW5nKSBudWxsKTsKLQkJCVN0cmluZyB3YXJuaW5nID0gc3RhdHVzLmdldExhc3RXYXJuaW5nTXNnKCk7Ci0JCQlpZiAod2FybmluZyA9PSBudWxsKSB7Ci0JCQkJaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGdldE1lc3NhZ2VUeXBlKCkgPT0gSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKQotCQkJCQlzZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBpbmZvID0gc3RhdHVzLmdldExhc3RJbmZvTXNnKCk7Ci0JCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCWlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBnZXRNZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pCi0JCQkJCQkJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfSBlbHNlIGlmICghaW5mby5lcXVhbHMoZ2V0TWVzc2FnZSgpKSkgewotCQkJCQkJc2V0TWVzc2FnZShpbmZvLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIXdhcm5pbmcuZXF1YWxzKGdldE1lc3NhZ2UoKSkpCi0JCQkJc2V0TWVzc2FnZSh3YXJuaW5nLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQl9IGVsc2UgaWYgKCFlcnJvci5lcXVhbHMoZ2V0RXJyb3JNZXNzYWdlKCkpKQotCQkJCQkJCXNldEVycm9yTWVzc2FnZShlcnJvcik7Ci0JCQkJCQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvclN0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0RXJyb3JTdGF0dXMoa2V5LCBlcnJvck1lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdhcm5pbmdTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyB3YXJuaW5nTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0V2FybmluZ1N0YXR1cyhrZXksIHdhcm5pbmdNZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5mb1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGluZm9NZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRJbmZvU3RhdHVzKGtleSwgaW5mb01lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9LU3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCXN0YXR1cy5zZXRPS1N0YXR1cyhrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT5EaWFsb2dQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklEaWFsb2dQYWdlPC9jb2RlPiBtZXRob2Qgc2V0cwotCSAqIHRoZSBjb250cm9sIHRvIHRoZSBnaXZlbiB2aXNpYmlsaXR5IHN0YXRlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJZW50ZXIoKTsKLQkJfSBlbHNlCi0JCQlleGl0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBXaXphcmQganVzdCBwcmlvciB0byBydW5uaW5nIHRoZSBwZXJmb3JtRmluaXNoIG9wZXJhdGlvbi4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBzdG9yZSB0aGVpciBkZWZhdWx0IHNldHRpbmdzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCX0KLQotCS8qKgotCSAqIFRoZSBwYWdlIGlzIG5vdyBiZWluZyB2YWxpZGF0ZWQuIEF0IHRoaXMgdGltZSwgZWFjaCBjb250cm9sIGlzIHZhbGlkYXRlZCBhbmQgdGhlbiB0aGUKLQkgKiBjb250cm9scyBhcmUgdXBkYXRlZCBiYXNlZCBvbiB0aGUgcmVzdWx0cyBpbiB0aGUgVmFsaWRhdGlvblN0YXR1cyB3aGljaCB3YXMgdXBkYXRlZCBkdXJpbmcKLQkgKiA8Y29kZT52YWxpZGF0ZUNvbnRyb2xzKCk8L2NvZGU+LiBGaW5hbGx5LCBpdCB3aWxsIGRpc3BsYXkgdGhlIGxhc3QgZXJyb3IgbWVzc2FnZSBhbmQgaXQKLQkgKiB3aWxsIHNldCB0aGUgcGFnZSBjb21wbGV0ZS4gU3ViY2xhc3NlcyB3aWxsIG5vdCB0eXBpY2FsbHkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotCQl2YWxpZGF0ZVBhZ2UodHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKGJvb2xlYW4gc2hvd01lc3NhZ2UpIHsKLQkJaWYgKCFpc1ZhbGlkYXRpbmcpIHsKLQkJCWlzVmFsaWRhdGluZyA9IHRydWU7Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRlQ29udHJvbHNCYXNlKCk7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCQlpZiAoc2hvd01lc3NhZ2UpCi0JCQkJCXNldEVycm9yTWVzc2FnZSgpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShzdGF0dXMuZ2V0TGFzdEVyck1zZygpID09IG51bGwpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpc1ZhbGlkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGluZGl2aWR1YWwgY29udHJvbHMuIFVzZSB2YWxpZGF0aW9uIGtleXMgdG8ga2VlcCB0cmFjayBvZiBlcnJvcnMuCi0JICogCi0JICogQHNlZSBzZXRPS1N0YXR1cyhJbnRlZ2VyKSBhbmQgc2V0RXJyb3JNZXNzYWdlKEludGVnZXIsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHZhbGlkYXRlQ29udHJvbHNCYXNlKCkgewotCQlpZiAoIXZhbGlkYXRpb25NYXAuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJvcE5hbWUgPSB2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXTsKLQkJCQlJbnRlZ2VyIHZhbEtleSA9IChJbnRlZ2VyKSB2YWxpZGF0aW9uTWFwLmdldChwcm9wTmFtZSk7Ci0JCQkJaWYgKHZhbEtleSAhPSBudWxsKQotCQkJCQl2YWxpZGF0ZVByb3BlcnR5KHByb3BOYW1lLCB2YWxLZXkpOwotCQkJCWlmICghZ2V0U3RhdHVzKHZhbEtleSkpCi0JCQkJCXJldHVybiBwcm9wTmFtZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIHZhbGlkYXRpb25rZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBJbnRlZ2VyIHZhbGlkYXRpb25LZXkpIHsKLQkJc2V0T0tTdGF0dXModmFsaWRhdGlvbktleSk7Ci0JCUlTdGF0dXMgc3RhdHVzMSA9IG1vZGVsLnZhbGlkYXRlUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKCFzdGF0dXMxLmlzT0soKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMxLmlzTXVsdGlTdGF0dXMoKSA/IHN0YXR1czEuZ2V0Q2hpbGRyZW4oKVswXS5nZXRNZXNzYWdlKCkgOiBzdGF0dXMxLmdldE1lc3NhZ2UoKTsKLQkJCXN3aXRjaCAoc3RhdHVzMS5nZXRTZXZlcml0eSgpKSB7Ci0JCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQkJc2V0RXJyb3JTdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQkJc2V0V2FybmluZ1N0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJU3RhdHVzLklORk8gOgotCQkJCQlzZXRJbmZvU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgZW5hYmxlbWVudCBvZiBjb250cm9scyBhZnRlciB2YWxpZGF0aW9uLiBTdWJsY2Fzc2VzIHNob3VsZCBjaGVjayB0aGUgc3RhdHVzIG9mCi0JICogdmFsaWRhdGlvbiBrZXlzIHRvIGRldGVybWluZSBlbmFibGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGlzRmlyc3RUaW1lVG9QYWdlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpcnN0VGltZVRvUGFnZSgpIHsKLQkJcmV0dXJuIGlzRmlyc3RUaW1lVG9QYWdlOwotCX0KLQotCS8vIHByb3RlY3RlZCB2b2lkIHNldEphdmFTdGF0dXNNZXNzYWdlKElTdGF0dXMgamF2YVN0YXR1cywgSW50ZWdlciBzdGF0dXNLZXksIFN0cmluZyBtZXNzYWdlKSB7Ci0JLy8gaWYgKGphdmFTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JLy8gc2V0V2FybmluZ1N0YXR1cyhzdGF0dXNLZXksIG1lc3NhZ2UpOwotCS8vIGVsc2UKLQkvLyBzZXRFcnJvclN0YXR1cyhzdGF0dXNLZXksIG1lc3NhZ2UpOwotCS8vIH0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rmlyc3RUaW1lVG9QYWdlKGJvb2xlYW4gYikgewotCQlpc0ZpcnN0VGltZVRvUGFnZSA9IGI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdvdERhdGFNb2RlbFdpemFyZCA9IGZhbHNlOwotCXByaXZhdGUgRGF0YU1vZGVsV2l6YXJkIGRhdGFNb2RlbFdpemFyZCA9IG51bGw7Ci0JcHJvdGVjdGVkIERhdGFNb2RlbFdpemFyZCBnZXREYXRhTW9kZWxXaXphcmQoKXsKLQkJaWYoIWdvdERhdGFNb2RlbFdpemFyZCl7Ci0JCQlnb3REYXRhTW9kZWxXaXphcmQgPSB0cnVlOwotCQkJSVdpemFyZCB3aXphcmQgPSBnZXRXaXphcmQoKTsKLQkJCWlmKHdpemFyZCBpbnN0YW5jZW9mIERhdGFNb2RlbFdpemFyZCl7Ci0JCQkJZGF0YU1vZGVsV2l6YXJkID0gKERhdGFNb2RlbFdpemFyZCl3aXphcmQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRhdGFNb2RlbFdpemFyZDsKLQl9Ci0JCi0JCi0JLyoKLQkgKiBJZiBhIHByb3BlcnR5IGNoYW5nZXMgdGhhdCB3ZSB3YW50IHRvIHZhbGlkYXRlLCBmb3JjZSB2YWxpZGF0aW9uIG9uIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2VkKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChmaW5hbCBEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlEYXRhTW9kZWxXaXphcmQgdyA9IGdldERhdGFNb2RlbFdpemFyZCgpOwotCQlpZih3ID09IG51bGwgfHwgIXcuaXNFeGVjdXRpbmcoKSkKLQkJewotCQkgICAgZmluYWwgUnVubmFibGUgdWlDaGFuZ2VzID0gbmV3IFJ1bm5hYmxlKCkKLQkJICAgIHsKLQkJICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotCQkgICAgICAgIHsKLSAgICAgICAgCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICAJCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMgIT0gbnVsbCAmJiAoZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyB8fCAoIWlzUGFnZUNvbXBsZXRlKCkgJiYgZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTElEX1ZBTFVFU19DSEcpKSkgewotICAgICAgICAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAJCQkJCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotICAgICAgICAJCQkJCQl2YWxpZGF0ZVBhZ2Uoc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkpOwotICAgICAgICAJCQkJCQlicmVhazsKLSAgICAgICAgCQkJCQl9Ci0gICAgICAgIAkJCQl9Ci0gICAgICAgIAkJCX0KLQkJICAgICAgICB9Ci0JCSAgICB9OwotCQkgICAgaWYoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRUaHJlYWQoKSl7Ci0JCSAgICAJdWlDaGFuZ2VzLnJ1bigpOwotCQkgICAgfSBlbHNlIHsKLQkJICAgIAlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWModWlDaGFuZ2VzKTsKLQkJICAgIH0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoc3luY2hIZWxwZXIgIT0gbnVsbCkgewotCQkJc3luY2hIZWxwZXIuZGlzcG9zZSgpOwotCQkJc3luY2hIZWxwZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmZvcG9wSUQoKSB7Ci0JCXJldHVybiBpbmZvcG9wSUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5mb3BvcElEKFN0cmluZyBpbmZvcG9wSUQpIHsKLQkJdGhpcy5pbmZvcG9wSUQgPSBpbmZvcG9wSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxMDVjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURNUGFnZUdyb3VwIAotewotICBwdWJsaWMgU3RyaW5nIGdldFdpemFyZElEKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VHcm91cElEKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VHcm91cEluc2VydGlvbklEKCk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd3NFeHRlbmRlZFBhZ2VzKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkRGF0YU9wZXJhdGlvblRvUnVuKCk7Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRQYWdlcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCk7Ci0gIAotICBwdWJsaWMgSURNUGFnZUhhbmRsZXIgZ2V0UGFnZUhhbmRsZXIoIElEYXRhTW9kZWwgZGF0YU1vZGVsICk7Ci0gIAotICBwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBnZXRQYWdlR3JvdXBIYW5kbGVyKCBJRGF0YU1vZGVsIGRhdGFNb2RlbCApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUdyb3VwSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUdyb3VwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTcwZTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VHcm91cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLS8qKgotICogCi0gKiBUaGUgd2l6YXJkIGZyYW1ld29yayBhbGxvd3MgcGFnZSBncm91cHMgdG8gYmUgaW5zZXJ0ZWQgYWZ0ZXIgb3RoZXIgcGFnZSBncm91cC4KLSAqIElmIG1vcmUgdGhhbiBvbmUgcGFnZSBncm91cCBpbnNlcnRzIGl0c2VsZiBhZnRlciBhIHBhcnRpY3VsYXIgcGFnZSBncm91cCBpdCBtYXkKLSAqIG5vdCBiZSBkZXRlcm1pbmlzdGljIHdoaWNoIHBhZ2UgZ3JvdXAgc2hvdWxkIGZvbGxvdyBlYWNoIG90aGVyLiAgVGhpcyBjbGFzcwotICogYWxsb3dzIGEgcGFydGljdWxhciBwYWdlIGdyb3VwIHRvIGRldGVybWluZSB0aGUgb3JkZXIgaW4gd2hpY2ggc3Vic2VxdWVudCBwYWdlCi0gKiBncm91cHMgc2hvdWxkIGJlIG9yZGVyZWQuCi0gKiAKLSAqIEZvciBleGFtcGxlOiBBIHBhZ2UgZ3JvdXAgVCBoYXMgdGhyZWUgcGFnZSBncm91cHMgWCwgWSwgYW5kIFogdGhhdCBoYXZlIHJlZ2lzdGVyZWQKLSAqICAgICAgICAgICAgICB2aWEgdGhlIHdpemFyZFBhZ2VHcm91cCBleHRlbnNpb24gcG9pbnQgdG8gZm9sbG93IGl0LgotICogICAgICAgICAgICAgIFRoZSB3aXphcmQgZnJhbWV3b3JrIHdpbGwgY2FsbCBnZXROZXh0R3JvdXAgd2l0aDoKLSAqICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICBULmdldE5leHRHcm91cCggbnVsbCwgeyAiWCIsICJZIiwgIloiIH0gKQotICogICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gZWl0aGVyICJYIiwgIlkiLCAiWiIsIG9yIG51bGwgaWYgbm8gcGFnZSBncm91cAotICogICAgICAgICAgICAgIHNob3VsZCBmb2xsb3cuICBJZiAiWSIgd2FzIHJldHVybmVkIHRoZW4gYSBzdWJlcXVlbnQgY2FsbAotICogICAgICAgICAgICAgIHdpbGwgYmUgbWFkZSBieSB0aGUgZnJhbWV3b3JrIHdpdGg6Ci0gKiAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgVC5nZXROZXh0R3JvdXAoICJZIiwgeyAiWCIsICJZIiwgIloiIH0gKQotICogICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgIEFnYWluIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gZWl0aGVyICJYIiwgIlkiLCAiWiIsIG9yIG51bGwgaWYgbm8gcGFnZQotICogICAgICAgICAgICAgIGdyb3VwIHNob3VsZCBmb2xsb3cgdGhpcyBwYWdlIGdyb3VwICJZIi4KLSAqICAgICAgICAgICAgICAKLSAqIE5vdGU6IGFueSBwYWdlIGdyb3VwIGNhbiBoYXZlIGEgcGFnZSBncm91cCBoYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCBpdCBzbyB0aGlzIG1ldGhvZAotICogICAgICAgY2FsbCBpcyByZWN1cnNpdmUgaW4gbmF0dXJlLiAgRm9yIGV4YW1wbGU6IHRoZSBwYWdlIGdyb3VwIFkgbWlnaHQgaGF2ZSBwYWdlCi0gKiAgICAgICBncm91cHMgWTEsIFkyLCBhbmQgWTMgZm9sbG93aW5nIGl0LiAgVGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBjYWxsczoKLSAqICAgICAgIAotICogICAgICAgICAgICAgICAgIFQuZ2V0TmV4dEdyb3VwKCBudWxsLCB7ICJYIiwgIlkiLCAiWiIgfSApICAvLyAiWSIgaXMgc2VsZWN0ZWQgdXNpbmcgVHMgaGFuZGxlci4KLSAqICAgICAgICAgICAgICAgICBZLmdldE5leHRHcm91cCggbnVsbCwgeyAiWTEiLCAiWTIiLCAiWTMiIH0gKSAvLyAiWTEiIGlzIHNlbGVjdGVkIHVzaW5nIFlzIGhhbmRsZXIuCi0gKiAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgRm9yIHRoaXMgZXhhbXBsZSBZMSBoYXMgbm8gcGFnZSBncm91cHMgZm9sbG93aW5nIGl0LgotICogICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgIFQuZ2V0TmV4dEdyb3VwKCAiWSIsIHsgIlgiLCAiWSIsICJaIiB9ICkgIC8vIG51bGwgaXMgc2VsZWN0ZWQgdXNpbmcgVHMgaGFuZGxlci4KLSAqICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICBGb3IgdGhpcyBleGFtcGxlLCB0aGUgVCBoYW5kbGVyIGRlY2lkZWQgdGhhdCBubyBwYWdlIGdyb3VwIGZvbGxvd2VkIFkgbm90IGV2ZW4gWCBvciBaLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE1QYWdlR3JvdXBIYW5kbGVyIAotewotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBjdXJyZW50UGFnZUdyb3VwSUQgdGhlIGN1cnJlbnQgcGFnZSBncm91cCBJRC4gIFRoaXMgdmFsdWUgd2lsbCBiZSBudWxsIHRoZSBmaXJzdCB0aW1lIAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLSAgICogQHBhcmFtIHBhZ2VHcm91cElEcyBhIGxpc3Qgb2YgcGFnZSBncm91cCBJRHMgdGhhdCBmb2xsb3cgdGhlIHBhZ2UgZ3JvdXAgZm9yIHRoaXMgaGFuZGxlci4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBwYWdlIGdyb3VwIGlkIHRoYXQgc2hvdWxkIGZvbGxvdyBjdXJyZW50UGFnZUdyb3VwSUQsIG9yIGl0Ci0gICAqIHNob3VsZCByZXR1cm4gbnVsbCBpZiBubyBwYWdlIGdyb3VwIGZvbGxvd3MgY3VycmVudFBhZ2VHcm91cElELgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2VHcm91cCggU3RyaW5nIGN1cnJlbnRQYWdlR3JvdXBJRCwgU3RyaW5nW10gcGFnZUdyb3VwSURzICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0MTlhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURNUGFnZUhhbmRsZXIgewotCi0JLyoqCi0JICogcmV0dXJuIHRoaXMgYXMgdGhlIHBhZ2UgbmFtZSBpZiB0aGUgZXhwZWN0ZWROZXh0UGFnZU5hbWUgb3IgZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lIHNob3VsZAotCSAqIGJlIHNraXBwZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1BBR0UgPSAiSURNRXh0ZW5kZWRQYWdlSGFuZGxlci5TS0lQX1BBR0UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBwcmVmaXggdGhpcyBzdHJpbmcgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcGFnZSB3aGljaCBvY2N1cnMgYmVmb3JlIHRoZSBwYWdlIHRoYXQgc2hvdWxkIGJlCi0JICogcmV0dXJuZWQuIEUuRy4gc3VwcG9zZSB5b3VyIHBhZ2UgY29udHJpYnV0aW9ucyBrbm93IGFib3V0IHBhZ2VzIEEsIEIgYW5kIEMsIGFuZCB5b3Ugd2FudCB0aGUKLQkgKiB0byBza2lwIHBhZ2VzIEIgYW5kIEMsIHdoZW4gZ29pbmcgdG8gdGhlIG5leHQgcGFnZSBmcm9tIEEuIFRvIGRvIHRoaXMsIHJldHVybiBQQUdFX0FGVEVSK0MuCi0JICogVGhlIGZyYW1ld29yayB3aWxsIHRoZW4gYXNrIHRoZSB3aXphcmQgZm9yIHRoZSBwYWdlIHRoYXQgbm9ybWFsbHkgY29tZXMgYWZ0ZXIgcGFnZSBDLgotCSAqIFBBR0VfQkVGT1JFIHdvcmtzIHNpbWlsYXJseS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0FGVEVSID0gIklETUV4dGVuZGVkUGFnZUhhbmRsZXIuUEFHRV9BRlRFUiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIHNhbWUgYXMgUEFHRV9BRlRFUiwgZXhjZXB0IGZvciByZXR1cmluZyB0aGUgcGFnZSBiZWZvcmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9CRUZPUkUgPSAiSURNRXh0ZW5kZWRQYWdlSGFuZGxlci5QQUdFX0JFRk9SRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFnZSB0aGF0IHNob3VsZCBiZSBuZXh0Ci0JICogCi0JICogQHBhcmFtIGN1cnJlbnRQYWdlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2UgdGhlIHdpemFyZCBpcyBjdXJyZW50bHkgb24KLQkgKiBAcGFyYW0gZXhwZWN0ZWROZXh0UGFnZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgbmV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZE5leHRQYWdlTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhZ2UgdGhhdCBzaG91bGQgYmUgcHJldmlvdXMKLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudFBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0aGUgd2l6YXJkIGlzIGN1cnJlbnRseSBvbgotCSAqIEBwYXJhbSBleHBlY3RlZE5leHRQYWdlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2UgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBwcmV2aW91cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXZpb3VzUGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL1BhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9QYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJlYThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL1BhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aS5Db21tb25VSVBsdWdpbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkRNV2l6YXJkUGFnZUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBvcmdhbml6ZXMgdGhlIHdpemFyZCBwYWdlIGV4dGVuc2lvbnMgZm9yIGEgcGFydGljdWxhciB3aXphcmQuIAotICogCi0gKiBAYXV0aG9yIGtyYWV2Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRXh0ZW5zaW9uTWFuYWdlciB7Ci0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCB3aGVyZSB0aGUgd2l6YXJkIHBhZ2UgZXh0ZW5zaW9ucyBhcmUKLQkgKiBjb250cmlidXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0lOVF9XSVpBUkRfUEFHRV9HUk9VUCA9ICJ3aXphcmRQYWdlR3JvdXAiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCdzIGVsZW1lbnQgd2hlcmUgdGhlIHdpemFyZCBwYWdlCi0JICogZXh0ZW5zaW9ucyBhcmUgY29udHJpYnV0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9XSVpBUkRfUEFHRSA9ICJ3aXphcmRQYWdlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU3RyaW5nIHdpemFyZElEOwotCXByaXZhdGUgRE1XaXphcmRQYWdlRWxlbWVudFtdIGVsZW1lbnRzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgcGFnZSBleHRlbnNpb24gbWFuYWdlciBmb3IgdGhlIHNwZWNpZmllZCB3aXphcmQuCi0JICogCi0JICogQHBhcmFtIHdpemFyZCAtCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHRvIGNvbnN0cnVjdCB0aGUgbWFuYWdlciBmb3IuCi0JICovCi0JcHVibGljIFBhZ2VFeHRlbnNpb25NYW5hZ2VyKERhdGFNb2RlbFdpemFyZCB3aXphcmQpIHsKLQkJdGhpcy53aXphcmRJRCA9IHdpemFyZC5nZXRXaXphcmRJRCgpOwotCQlsb2FkRWxlbWVudHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFkZGl0aW9uYWwgY29udHJvbHMgZm9yIHRoZSBzcGVjaWZpZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogPHA+Ci0JICogVGhlIGFkZGl0aW9uYWwgY29udHJvbHMgYXJlIGNvbnRyaWJ1dGVkIGJ5IHRoZSB3aXphcmQgcGFnZSBleHRlbnNpb25zCi0JICogdGhhdCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgPGNpdGU+d2l6YXJkUGFnZTwvY2l0ZT4gZWxlbWVudCBvZiB0aGUKLQkgKiA8Y2l0ZT53aXphcmRQYWdlR3JvdXA8L2NpdGU+IGV4dGVuc2lvbiBwb2ludCBhbmQgdGhlIDxjaXRlPndpemFyZElEPC9jaXRlPgotCSAqIGF0dHJpYnV0ZSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgd2l6YXJkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlIHdoZXJlIHRoZSBhZGRpdGlvbmFsIGNvbnRyb2xzIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGFkZGVkIHRvLgotCSAqIEBwYXJhbSBtb2RlbCAtCi0JICogICAgICAgICAgICB0aGUgZGF0YSBtb2RlbCBvZiB0aGUgd2l6YXJkLgotCSAqIEBwYXJhbSBwYWdlTmFtZSAtCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5kZWQgd2l6YXJkIHBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlETVdpemFyZFBhZ2VFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmICh3aXphcmRJRC5lcXVhbHMoZWxlbWVudC5nZXRXaXphcmRJRCgpKSkgewotCQkJCWVsZW1lbnQuY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKHBhcmVudCwgbW9kZWwsIHBhZ2VOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZEVsZW1lbnRzKCkgeyAKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KENvbW1vblVJUGx1Z2luQ29uc3RhbnRzLlBMVUdJTl9JRCwgUE9JTlRfV0laQVJEX1BBR0VfR1JPVVApOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBhbGxFbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGFsbEVsZW1lbnRzW2ldOwotCQkJaWYgKEVMRU1FTlRfV0laQVJEX1BBR0UuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCXJlc3VsdC5hZGQobmV3IERNV2l6YXJkUGFnZUVsZW1lbnQoZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCQotCQllbGVtZW50cyA9IChETVdpemFyZFBhZ2VFbGVtZW50W10pIHJlc3VsdC50b0FycmF5KG5ldyBETVdpemFyZFBhZ2VFbGVtZW50W10geyB9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL1NpbXBsZVBhZ2VHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvU2ltcGxlUGFnZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTM2ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvU2ltcGxlUGFnZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVBhZ2VHcm91cCBpbXBsZW1lbnRzIEFkZGFibGVQYWdlR3JvdXAgewotCXByaXZhdGUgU3RyaW5nIGdyb3VwSUQ7Ci0JcHJpdmF0ZSBTdHJpbmcgd2l6YXJkSUQ7Ci0JcHJpdmF0ZSBib29sZWFuIGFsbG93RXh0ZW5kZWRQYWdlczsKLQlwcml2YXRlIFN0cmluZyByZXF1aXJlZERhdGFPcGVyYXRpb247Ci0JcHJpdmF0ZSBTZXQgICAgZGF0YU1vZGVsSURzOwotCi0JcHJpdmF0ZSBJRE1QYWdlSGFuZGxlciBwYWdlSGFuZGxlcjsKLQlwcml2YXRlIElETVBhZ2VHcm91cEhhbmRsZXIgcGFnZUdyb3VwSGFuZGxlcjsKLQlwcml2YXRlIFZlY3RvciBwYWdlczsKLQotCXB1YmxpYyBTaW1wbGVQYWdlR3JvdXAoU3RyaW5nIGdyb3VwSUQsIFN0cmluZyB3aXphcmRJRCwgYm9vbGVhbiBhbGxvd0V4dGVuZGVkUGFnZXMsIFN0cmluZyByZXF1aXJlRGF0YU9wZXJhdGlvbikgewotCQl0aGlzLmdyb3VwSUQgPSBncm91cElEOwotCQl0aGlzLndpemFyZElEID0gd2l6YXJkSUQ7Ci0JCXRoaXMuYWxsb3dFeHRlbmRlZFBhZ2VzID0gYWxsb3dFeHRlbmRlZFBhZ2VzOwotCQl0aGlzLnJlcXVpcmVkRGF0YU9wZXJhdGlvbiA9IHJlcXVpcmVEYXRhT3BlcmF0aW9uOwotCQlwYWdlcyA9IG5ldyBWZWN0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlUGFnZUdyb3VwKFN0cmluZyBncm91cElELCBTdHJpbmcgd2l6YXJkSUQpIHsKLQkJdGhpcyhncm91cElELCB3aXphcmRJRCwgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXBhZ2VzLmFkZChwYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcyhJV2l6YXJkUGFnZVtdIG5ld1BhZ2VzKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBuZXdQYWdlcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCXBhZ2VzLmFkZChuZXdQYWdlc1tpbmRleF0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dzRXh0ZW5kZWRQYWdlcygpIHsKLQkJcmV0dXJuIGFsbG93RXh0ZW5kZWRQYWdlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWdlR3JvdXBIYW5kbGVyKElETVBhZ2VHcm91cEhhbmRsZXIgaGFuZGxlcikgewotCQlwYWdlR3JvdXBIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBnZXRQYWdlR3JvdXBIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBIYW5kbGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhZ2VIYW5kbGVyKElETVBhZ2VIYW5kbGVyIGhhbmRsZXIpIHsKLQkJcGFnZUhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBnZXRQYWdlSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gcGFnZUhhbmRsZXI7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UGFnZXMoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIHBhZ2VzOwotCX0KLQkKLQlwdWJsaWMgSVdpemFyZFBhZ2VbXSBnZXRFeHRlbmRlZFBhZ2VzKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiAoSVdpemFyZFBhZ2VbXSkgcGFnZXMudG9BcnJheShuZXcgSVdpemFyZFBhZ2VbMF0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSUQoKSB7Ci0JCXJldHVybiBncm91cElEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSW5zZXJ0aW9uSUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWREYXRhT3BlcmF0aW9uVG9SdW4oKSB7Ci0JCXJldHVybiByZXF1aXJlZERhdGFPcGVyYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRJRCgpIHsKLQkJcmV0dXJuIHdpemFyZElEOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0RGF0YU1vZGVsSURzKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsSURzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbElEcyhTZXQgZGF0YU1vZGVsSURzKSB7Ci0JCXRoaXMuZGF0YU1vZGVsSURzID0gZGF0YU1vZGVsSURzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL0Vycm9yRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9FcnJvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjBkMTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL0Vycm9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVycm9yRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBFcnJvckRpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkgfHwgc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGwgKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9JbmZvRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9JbmZvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYzU2NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvSW5mb0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmZvRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICogPHA+Ci0gICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZSBvZgotICAgKiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgKiBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbAotICAgKiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLSAgICogPC9wPgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgSW5mb0RpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkgKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9NZXNzYWdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9NZXNzYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNDg2MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvTWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURpYWxvZyBleHRlbmRzIERpYWxvZwotewotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotICAvKioKLSAgICogUmVzZXJ2ZSByb29tIGZvciB0aGlzIG1hbnkgbGlzdCBpdGVtcy4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExJU1RfSVRFTV9DT1VOVCA9IDc7Ci0KLSAgLyoqCi0gICAqIFRoZSBEZXRhaWxzIGJ1dHRvbi4KLSAgICovCi0gIHByb3RlY3RlZCBCdXR0b24gZGV0YWlsc0J1dHRvbjsKLQotICAvKioKLSAgICogVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0gIC8qKgotICAgKiBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOwotCi0gIC8qKgotICAgKiBUaGUgU1dUIGxpc3QgY29udHJvbCB0aGF0IGRpc3BsYXlzIHRoZSBlcnJvciBkZXRhaWxzLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgbGlzdDsKLSAgcHJvdGVjdGVkIFRleHQgZGV0YWlsczsKLQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVycm9yIGRldGFpbHMgdmlld2VyIGlzIGN1cnJlbnRseSBjcmVhdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gbGlzdENyZWF0ZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsc0NyZWF0ZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogRmlsdGVyIG1hc2sgZm9yIGRldGVybWluaW5nIHdoaWNoIHN0YXR1cyBpdGVtcyB0byBkaXNwbGF5LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBkaXNwbGF5TWFzayA9IDB4RkZGRjsKLQotICAvKioKLSAgICogVGhlIG1haW4gc3RhdHVzIG9iamVjdC4KLSAgICovCi0gIHByb3RlY3RlZCBJU3RhdHVzIHN0YXR1czsKLSAgCi0gIHByaXZhdGUgUG9pbnQgc2F2ZWRTaXplID0gbnVsbDsKLQotICAvKioKLSAgICogTGlzdCBvZiB0aGUgbWFpbiBlcnJvciBvYmplY3QncyBkZXRhaWxlZCBlcnJvcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+U3RhdHVzPC9jb2RlPikuCi0gICAqLwotICBwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3Qgc3RhdHVzTGlzdDsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VEaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgIHRoaXMudGl0bGUgPSBkaWFsb2dUaXRsZSA9PSBudWxsID8gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9ibGVtX09jY3VycmVkIikgOiAvLyROT04tTkxTLTEkCi0gIGRpYWxvZ1RpdGxlOwotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgPT0gbnVsbCA/IHN0YXR1cy5nZXRNZXNzYWdlKCkgOiBKRmFjZVJlc291cmNlcy5mb3JtYXQoIlJlYXNvbiIsIG5ldyBPYmplY3RbXSB7IG1lc3NhZ2UsIHN0YXR1cy5nZXRNZXNzYWdlKCl9KTsgLy8kTk9OLU5MUy0xJAotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICAgIHN0YXR1c0xpc3QgPSBBcnJheXMuYXNMaXN0KHN0YXR1cy5nZXRDaGlsZHJlbigpKTsKLSAgICB0aGlzLmRpc3BsYXlNYXNrID0gZGlzcGxheU1hc2s7Ci0gICAgc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLSAgfQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIEhhbmRsZXMgdGhlIHByZXNzaW5nIG9mIHRoZSBPayBvcgotICAgKiBEZXRhaWxzIGJ1dHRvbiBpbiB0aGlzIGRpYWxvZy4gSWYgdGhlIE9rIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIGNsb3NlCi0gICAqIHRoaXMgZGlhbG9nLiBJZiB0aGUgRGV0YWlscyBidXR0b24gd2FzIHByZXNzZWQgdGhlbiB0b2dnbGUgdGhlIGRpc3BsYXlpbmcKLSAgICogb2YgdGhlIGVycm9yIGRldGFpbHMgYXJlYS4gTm90ZSB0aGF0IHRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIG9ubHkgYmUKLSAgICogdmlzaWJsZSBpZiB0aGUgZXJyb3IgYmVpbmcgZGlzcGxheWVkIHNwZWNpZmllcyBjaGlsZCBkZXRhaWxzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpCi0gIHsKLSAgICBpZiAoaWQgPT0gU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpCi0gICAgeyAvLyB3YXMgdGhlIGRldGFpbHMgYnV0dG9uIHByZXNzZWQ/Ci0gICAgICB0b2dnbGVEZXRhaWxzQXJlYSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0gICAgfQotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIFdpbmRvdy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQodGl0bGUpOwotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkgfHwgc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGwgKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkpOwotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzCi0gICAqIG9mIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotCi0gICAgLy8gY3JlYXRlIGNvbXBvc2l0ZQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgQ29tcG9zaXRlIGltYWdlQW5kTGFiZWwgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGltYWdlQW5kTGFiZWwuc2V0TGF5b3V0KGdsKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSk7Ci0gICAgCi0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgSW1hZ2UgaW1hZ2UgPSBnZXREaWFsb2dJbWFnZSgpOwotICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGltYWdlQW5kTGFiZWwsIDApOwotICAgICAgaW1hZ2Uuc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgbGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YSgKLSAgICAgICAgbmV3IEdyaWREYXRhKAotICAgICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSCi0gICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSBtZXNzYWdlCi0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChpbWFnZUFuZExhYmVsLCBTV1QuUkVBRF9PTkxZfFNXVC5XUkFQKTsKLSAgICAgIHRleHQuc2V0VGV4dChtZXNzYWdlKTsKLSAgICAgIEdyaWREYXRhIGRhdGEgPQotICAgICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgICAgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0gICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0gICAgICBkYXRhLndpZHRoSGludCA9Ci0gICAgICAgIGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEgpOwotICAgICAKLSAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIHRleHQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY3JlYXRlRHJvcERvd25MaXN0KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgdGhlIGxpc3QKLSAgICBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQotICAgIC8vIGZpbGwgdGhlIGxpc3QKLSAgICBwb3B1bGF0ZUxpc3QobGlzdCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0KLSAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGRhdGEuaGVpZ2h0SGludCA9IGxpc3QuZ2V0SXRlbUhlaWdodCgpICogTElTVF9JVEVNX0NPVU5UOwotICAgIGxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBsaXN0Q3JlYXRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgcHJvdGVjdGVkIFRleHQgY3JlYXRlRHJvcERvd25EZXRhaWxzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBkZXRhaWxzID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0gICAgLy9kZXRhaWxzLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBDb2xvciBjb2xvciA9IG5ldyBDb2xvcihwYXJlbnQuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIDI1NSwgMjU1LCAyNTUpOwotICAgIGRldGFpbHMuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gICAgcG9wdWxhdGVEZXRhaWxzKGRldGFpbHMsIHN0YXR1cywgMCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9Ci0gICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0gICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICBkZXRhaWxzLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZGV0YWlscy5zZXRTZWxlY3Rpb24oMCk7Ci0gICAgZGV0YWlsc0NyZWF0ZWQgPSB0cnVlOwotICAgIHJldHVybiBkZXRhaWxzOwotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLSAgICovCi0gIC8qKgotICAgKiBFeHRlbmRzIDxjb2RlPldpbmRvdy5vcGVuKCk8L2NvZGU+LiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheQotICAgKiB0aGUgZXJyb3IuIElmIHlvdSBzcGVjaWZpZWQgYSBtYXNrIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZQotICAgKiBjaGlsZHJlbiwgdGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQotICAgKiBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0gICAqLwotICBwdWJsaWMgaW50IG9wZW4oKQotICB7Ci0gICAgaWYgKHNob3VsZERpc3BsYXkoc3RhdHVzLCBkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuIHN1cGVyLm9wZW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyoqCi0gICAqIFRoaXMgZXNzZW50aWFsbHkgZG9lcyB0aGUgd29yayBvZiBhIGZhY3RvcnkgT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvCi0gICAqIGRpc3BsYXkgdGhlIGdpdmVuIGVycm9yLiBVc2UgdGhpcyBtZXRob2QgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZwotICAgKiBkaXNwbGF5ZWQgZG9lcyBub3QgY29udGFpbiBjaGlsZCBpdGVtcywgb3IgaWYgeW91IHdpc2ggdG8gZGlzcGxheSBhbGwgc3VjaAotICAgKiBpdGVtcyB3aXRob3V0IGZpbHRlcmluZy4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnQKLSAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEByZXR1cm4gdGhlIGNvZGUgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwotICAgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLSAgICogICAgICAgICBidXR0b24gd2FzIHByZXNzZWQsIG9yIDxjb2RlPkRpYWxvZy5DQU5DRUw8L2NvZGU+IGlmIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cncyBjbG9zZSB3aW5kb3cgZGVjb3JhdGlvbiBvciB0aGUgRVNDIGtleSB3YXMgdXNlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5NZXNzYWdlKAotICAgIFNoZWxsIHBhcmVudCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMpCi0gIHsKLQotICAgIHN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpCi0gICAgewotICAgICAgY2FzZSBJU3RhdHVzLklORk8gOgotICAgICAgICByZXR1cm4gb3BlbkluZm8oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgc3RhdHVzLAotICAgICAgICAgIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKTsKLSAgICAgIGNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLSAgICAgICAgcmV0dXJuIG9wZW5XYXJuaW5nKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBkaWFsb2dUaXRsZSwKLSAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUik7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgcmV0dXJuIG9wZW5FcnJvcigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTyB8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpOwotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3Blbk1lc3NhZ2UoCi0gICAgU2hlbGwgcGFyZW50LAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBDaG9pY2VbXSBvcHRpb25zKQotICB7Ci0KLSAgICByZXR1cm4gb3Blbk9wdGlvbnMoCi0gICAgICBwYXJlbnQsCi0gICAgICBkaWFsb2dUaXRsZSwKLSAgICAgIG1lc3NhZ2UsCi0gICAgICBzdGF0dXMsCi0gICAgICBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUiwKLSAgICAgIG9wdGlvbnMpOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZQotICAgKiBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3Ugd2lzaAotICAgKiB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0gICAqIGNoaWxkcmVuLiBUaGUgZXJyb3IgZGlhbG9nIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0gICAqIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqIEByZXR1cm4gdGhlIGNvZGUgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwotICAgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLSAgICogICAgICAgICBidXR0b24gd2FzIHByZXNzZWQsIG9yIDxjb2RlPkRpYWxvZy5DQU5DRUw8L2NvZGU+IGlmIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cncyBjbG9zZSB3aW5kb3cgZGVjb3JhdGlvbiBvciB0aGUgRVNDIGtleSB3YXMgdXNlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5FcnJvcigKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgRXJyb3JEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBFcnJvckRpYWxvZyhwYXJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3BlbkluZm8oCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIEluZm9EaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBJbmZvRGlhbG9nKHBhcmVudFNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBvcGVuV2FybmluZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgV2FybmluZ0RpYWxvZyBkaWFsb2cgPQotICAgICAgbmV3IFdhcm5pbmdEaWFsb2cocGFyZW50U2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgICByZXR1cm4gZGlhbG9nLm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5PcHRpb25zKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyB0aXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2ssCi0gICAgQ2hvaWNlW10gb3B0aW9ucykKLSAgewotICAgIE9wdGlvbnNEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBPcHRpb25zRGlhbG9nKAotICAgICAgICBwYXJlbnRTaGVsbCwKLSAgICAgICAgdGl0bGUsCi0gICAgICAgIG1lc3NhZ2UsCi0gICAgICAgIHN0YXR1cywKLSAgICAgICAgZGlzcGxheU1hc2ssCi0gICAgICAgIG9wdGlvbnMpOwotICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgcmV0dXJuIGRpYWxvZy5nZXRSZXR1cm5Db2RlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUG9wdWxhdGVzIHRoZSBsaXN0IHVzaW5nIHRoaXMgZXJyb3IgZGlhbG9nJ3Mgc3RhdHVzIG9iamVjdC4gVGhpcyB3YWxrcyB0aGUKLSAgICogY2hpbGQgc3RhdGkgb2YgdGhlIHN0YXR1cyBvYmplY3QgYW5kIGRpc3BsYXlzIHRoZW0gaW4gYSBsaXN0LiBUaGUgZm9ybWF0Ci0gICAqIGZvciBlYWNoIGVudHJ5IGlzIHN0YXR1c19wYXRoIDogc3RhdHVzX21lc3NhZ2UgSWYgdGhlIHN0YXR1cydzIHBhdGggd2FzCi0gICAqIG51bGwgdGhlbiBpdCAoYW5kIHRoZSBjb2xvbikgYXJlIG9taXR0ZWQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdCkKLSAgewotICAgIEl0ZXJhdG9yIGVudW1lcmF0aW9uID0gc3RhdHVzTGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSVN0YXR1cyBjaGlsZFN0YXR1cyA9IChJU3RhdHVzKSBlbnVtZXJhdGlvbi5uZXh0KCk7Ci0gICAgICBwb3B1bGF0ZUxpc3QobGlzdCwgY2hpbGRTdGF0dXMsIDApOwotICAgIH0KLSAgfQotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdCwgSVN0YXR1cyBzdGF0dXMsIGludCBuZXN0aW5nKQotICB7Ci0gICAgaWYgKCFzdGF0dXMubWF0Y2hlcyhkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspCi0gICAgewotICAgICAgc2IuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHNiLmFwcGVuZChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICBsaXN0LmFkZChzYi50b1N0cmluZygpKTsKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHBvcHVsYXRlTGlzdChsaXN0LCBjaGlsZHJlbltpXSwgbmVzdGluZyArIDEpOwotICAgIH0KLSAgfQotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVEZXRhaWxzKFRleHQgdGV4dCwgSVN0YXR1cyBzdGF0dXMsIGludCBuZXN0aW5nKQotICB7Ci0gICAgaWYgKCFzdGF0dXMubWF0Y2hlcyhkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gICAgU3RyaW5nICAgIHRhYkNoYXJzICAgID0gcmVwZWF0KCAnICcsIG5lc3RpbmcgKiAyICk7Ci0gICAgU3RyaW5nICAgIG1lc3NhZ2VMaW5lID0gdGFiQ2hhcnMgKyBzdGF0dXMuZ2V0TWVzc2FnZSgpICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0gICAgVGhyb3dhYmxlIGV4Y2VwdCAgICAgID0gc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotICAgIAotICAgIHRleHQuYXBwZW5kKCBtZXNzYWdlTGluZSApOwotICAgIAotICAgIGlmKCBleGNlcHQgIT0gbnVsbCApCi0gICAgewotICAgICAgU3RyaW5nW10gdHJhY2UgPSBnZXRTdGFja1RyYWNlKCBleGNlcHQgKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNlLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIHRleHQuYXBwZW5kKCB0YWJDaGFycyArICIgICAgIiArIHRyYWNlW2luZGV4XSArIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBwb3B1bGF0ZURldGFpbHModGV4dCwgY2hpbGRyZW5baV0sIG5lc3RpbmcgKyAxKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gc3RhdHVzIG9iamVjdCBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIGEgc3RhdHVzIG9iamVjdAotICAgKiBAcGFyYW0gbWFzawotICAgKiAgICAgICAgICAgIGEgbWFzayBhcyBwZXIgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHN0YXR1cyBzaG91bGQgYmUgZGlzcGxheWVkLCBhbmQKLSAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkRGlzcGxheShJU3RhdHVzIHN0YXR1cywgaW50IG1hc2spCi0gIHsKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3RhdHVzLm1hdGNoZXMobWFzayk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGNoaWxkcmVuW2ldLm1hdGNoZXMobWFzaykpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIFRvZ2dsZXMgdGhlIHVuZm9sZGluZyBvZiB0aGUgZGV0YWlscyBhcmVhLiBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlcgotICAgKiBwcmVzc2luZyB0aGUgZGV0YWlscyBidXR0b24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgdG9nZ2xlRGV0YWlsc0FyZWEoKQotICB7Ci0gICAgUG9pbnQgd2luZG93U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotICAgIGludCAgIG5ld0hlaWdodCAgPSAtMTsKLSAgICAKLSAgICBpZiAoZGV0YWlsc0NyZWF0ZWQpCi0gICAgewotICAgICAgZGV0YWlscy5kaXNwb3NlKCk7Ci0gICAgICBkZXRhaWxzQ3JlYXRlZCA9IGZhbHNlOwotICAgICAgZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLSAgICAgIAotICAgICAgLy8gV2l0aG91dCB0aGUgZm9sbG93aW5nIGNvbXB1dGVTaXplIGNhbGwgdGhlIHNldFNpemUgY2FsbCBiZWxvdyB0aHJvd3MgYW4gYXJyYXkgb3V0IG9mIGJvdW5kcyBleGNlcHRpb24uCi0gICAgICAvLyBWZXJ5IHdlaXJkLgotICAgICAgZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgCi0gICAgICBuZXdIZWlnaHQgPSBzYXZlZFNpemUueTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmKCBzYXZlZFNpemUgPT0gbnVsbCApIHNhdmVkU2l6ZSA9IHdpbmRvd1NpemU7Ci0gICAgICAgIAotICAgICAgZGV0YWlscyA9IGNyZWF0ZURyb3BEb3duRGV0YWlscygoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLSAgICAgIGRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0gICAgICBuZXdIZWlnaHQgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLSAgICB9Ci0KLQotICAgIG5ld0hlaWdodCA9IG5ld0hlaWdodCA+IDQwMCA/IDQwMCA6IG5ld0hlaWdodDsKLSAgICAKLSAgICBnZXRTaGVsbCgpLnNldFNpemUoIG5ldyBQb2ludCh3aW5kb3dTaXplLngsIG5ld0hlaWdodCkgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRTdGFja1RyYWNlKCBUaHJvd2FibGUgZXhjICkKLSAgewotICAgIFZlY3RvciAgICAgICBsaW5lcyAgICAgICAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciAgcHJpbnRXcml0ZXIgID0gbmV3IFByaW50V3JpdGVyKCBzdHJpbmdXcml0ZXIgKTsKLSAgICAKLSAgICBleGMucHJpbnRTdGFja1RyYWNlKCBwcmludFdyaXRlciApOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHByaW50V3JpdGVyLmNsb3NlKCk7Ci0gICAgICBzdHJpbmdXcml0ZXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2goIEV4Y2VwdGlvbiBuZXN0ZWRFeGMgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmdSZWFkZXIgc3RyaW5nUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlciggc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkgKTsKLSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgICAgID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBzdHJpbmdSZWFkZXIgKTsKLSAgICBTdHJpbmcgICAgICAgICBsaW5lICAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgCi0gICAgICB3aGlsZSggbGluZSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgbGluZXMuYWRkKCBsaW5lLnRyaW0oKSApOwotICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gbmVzdGVkRXhjICkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSlsaW5lcy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIHJlcGVhdCggY2hhciB0aGVfY2hhciwgaW50IGNvdW50ICkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCBjb3VudCApOwotCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBidWYuYXBwZW5kKCB0aGVfY2hhciApOwotICAgIH0KLQotICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL09wdGlvbnNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL09wdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NjliMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9PcHRpb25zRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25zRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotICBwcml2YXRlIENob2ljZVtdIGNob2ljZXM7Ci0gIHByaXZhdGUgaW50IHJldHVybkNvZGVfOwotCi0gIHB1YmxpYyBPcHRpb25zRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2ssCi0gICAgQ2hvaWNlW10gY2hvaWNlcykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgdGhpcy5jaG9pY2VzID0gY2hvaWNlczsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIGEgYnV0dG9uIGZvciBlYWNoIG9wdGlvbnMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgY2hvaWNlc1tpXS5nZXRTaG9ydGN1dCgpLCBjaG9pY2VzW2ldLmdldExhYmVsKCksIHRydWUpOwotICAgIH0KLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKQotICB7Ci0gICAgaWYgKGlkID09IFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lEKQotICAgICAgLy8gd2FzIHRoZSBEZXRhaWxzIGJ1dHRvbiBwcmVzc2VkPwotICAgICAgc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldFJldHVybkNvZGUoaWQpOwotICAgICAgY2xvc2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXR1cm5Db2RlKGludCBpZCkKLSAgewotICAgIHJldHVybkNvZGVfID0gaWQ7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFJldHVybkNvZGUoKQotICB7Ci0gICAgcmV0dXJuIHJldHVybkNvZGVfOwotICB9Ci0gIC8qCi0gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgbWV0aG9kcyB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQotICAgKiBzdWJjbGFzc2VzLiBUaGUgaW1hZ2UgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBEaWFsb2cgY2xhc3MKLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZSBnZXREaWFsb2dJbWFnZSgpCi0gIHsKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICBzd2l0Y2ggKHN0YXR1cy5nZXRTZXZlcml0eSgpKQotICAgIHsKLSAgICAgIGNhc2UgSVN0YXR1cy5JTkZPIDoKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgICAgIGNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUik7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL1N0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2EzNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTsKLQotLyoqCi0qIENvbnN0YW50cyBmb3Igc3RhdHVzIGRpYWxvZ3MKLSovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1c0RpYWxvZ0NvbnN0YW50cyB7Ci0KLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiWWVzIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVTX0lEID0gMjsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiWWVzIHRvIGFsbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFU19UT19BTExfSUQgPSA0OwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJDYW5jZWwiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5DRUxfSUQgPSAxOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJPSyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0lEID0gMDsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiRGV0YWlscyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVEFJTFNfSUQgPSAxMzsKLQotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJZZXMiIGJ1dHRvbgotICAqLwotIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFU19MQUJFTCA9IEVudmlyb25tZW50UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfWUVTX0xBQkVMIik7Ci0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIlllcyB0byBhbGwiIGJ1dHRvbgotICAqLwotIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFU19UT19BTExfTEFCRUwgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lc3NhZ2UoIiVTVEFUVVNfRElBTE9HX1lFU19UT19BTExfTEFCRUwiKTsKLSAgLyoKLSAgKiBCdXR0b24gbGFiZWwgZm9yIHRoZSAiQ2FuY2VsIiBidXR0b24KLSAgKi8KLSAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5DRUxfTEFCRUwgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lc3NhZ2UoIiVTVEFUVVNfRElBTE9HX0NBTkNFTF9MQUJFTCIpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvV2FybmluZ0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvV2FybmluZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzY2ZDgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL1dhcm5pbmdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFdhcm5pbmdEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBXYXJuaW5nRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0ssIENhbmNlbCBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwKLSAgICAgIGZhbHNlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZUVudmlyb25tZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZUVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmZmNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL0VjbGlwc2VFbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5TaW1wbGVVUklGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGFuIElFbnZpcm9ubWVudCBjbGFzcyBmb3IgdGhlIEVjbGlwc2UgSUVudmlyb25tZW50LgotICogVGhpcyBJRW52aXJvbm1lbnQgY3VycmVudGx5IHN1cHBvcnRzIHRoZSAicGxhdGZvcm0iIHByb3RvY29sIGFuZCB0aGUgImZpbGUiCi0gKiBwcm90b2NvbC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlRW52aXJvbm1lbnQgaW1wbGVtZW50cyBJRW52aXJvbm1lbnQKLXsKLSAgcHJpdmF0ZSBTaW1wbGVVUklGYWN0b3J5IHVyaUZhY3RvcnlfICAgICAgPSBudWxsOwotICBwcml2YXRlIElTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXJfICAgPSBudWxsOwotICBwcml2YXRlIElMb2cgICAgICAgICAgICAgIGxvZ2dlcl8gICAgICAgICAgPSBudWxsOwotICAKLSAgcHVibGljIEVjbGlwc2VFbnZpcm9ubWVudCgpCi0gIHsKLSAgICB0aGlzKCBuZXcgRWNsaXBzZVN0YXR1c0hhbmRsZXIoKSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFY2xpcHNlRW52aXJvbm1lbnQoIElTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0gIHsKLSAgICBJVVJJU2NoZW1lIGVjbGlwc2VTY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpOwotICAgIElVUklTY2hlbWUgZmlsZVNjaGVtZSAgICA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCk7Ci0gICAgCi0gICAgdXJpRmFjdG9yeV8gICAgICA9IG5ldyBTaW1wbGVVUklGYWN0b3J5KCk7Ci0gICAgc3RhdHVzSGFuZGxlcl8gICA9IHN0YXR1c0hhbmRsZXI7Ci0gICAgCi0gICAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJwbGF0Zm9ybSIsIGVjbGlwc2VTY2hlbWUgKTsgLy8kTk9OLU5MUy0xJAotICAgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAiZmlsZSIsIGZpbGVTY2hlbWUgKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCNnZXRMb2coKQotICAgKi8KLSAgcHVibGljIElMb2cgZ2V0TG9nKCkKLSAgewotCSAgaWYoIGxvZ2dlcl8gPT0gbnVsbCApCi0gICAgeyAgCi0gICAgICBsb2dnZXJfID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VMb2coKTsgCi0gICAgfTsKLQkKLSAgICByZXR1cm4gbG9nZ2VyXzsKLSAgfQotICAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50I2dldFN0YXR1c0hhbmRsZXIoKQotICAgKi8KLSAgcHVibGljIElTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1c0hhbmRsZXJfOwotICB9Ci0KLSAgLyoqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCNnZXRVUklGYWN0b3J5KCkKLSAgICovCi0gIHB1YmxpYyBJVVJJRmFjdG9yeSBnZXRVUklGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiB1cmlGYWN0b3J5XzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL0VjbGlwc2VTdGF0dXNIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZVN0YXR1c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkYzgyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZVN0YXR1c0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aS5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWkuU3RhdHVzRGlhbG9nQ29uc3RhbnRzOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgRWNsaXBzZSBVSSB2ZXJzaW9uIG9mIHRoZSBJU3RhdHVzSGFuZGxlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVN0YXR1c0hhbmRsZXIgaW1wbGVtZW50cyBJU3RhdHVzSGFuZGxlcgotewotICBwcml2YXRlIFNoZWxsICAgICAgICBzaGVsbF87Ci0gIAotICBwdWJsaWMgRWNsaXBzZVN0YXR1c0hhbmRsZXIoKQotICB7Ci0gICAgdGhpcyggbmV3IFNoZWxsKCkgKTsKLSAgfQotCi0gIHB1YmxpYyBFY2xpcHNlU3RhdHVzSGFuZGxlcihTaGVsbCBzaGVsbCkKLSAgewotICAgIHNoZWxsXyA9IHNoZWxsOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1cywgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5DaG9pY2VbXSkKLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgcmVwb3J0KElTdGF0dXMgc3RhdHVzLCBDaG9pY2VbXSBjaG9pY2VzKSAKLSAgewotICAgIGludCByZXN1bHQgPQotICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICAgIHNoZWxsXywKLSAgICAgICAgTWVzc2FnZXMuVElUTEVfV0FSTklORywKLQkJCQludWxsLAotCQkJCXN0YXR1cywKLQkJCQljaG9pY2VzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspCi0gICAgIHsKLSAgICAgIGlmIChjaG9pY2VzW2ldLmdldFNob3J0Y3V0KCkgPT0gcmVzdWx0KQotICAgICAgICByZXR1cm4gY2hvaWNlc1tpXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydChJU3RhdHVzIHN0YXR1cykgdGhyb3dzIFN0YXR1c0V4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiB1c2VyT2sgPSBmYWxzZTsKLSAgICAKLSAgICBzd2l0Y2ggKHN0YXR1cy5nZXRTZXZlcml0eSgpKQotICAgIHsKLSAgICAgIC8vIGFuIGVycm9yIGhhcyBiZWVuIHJlcG9ydGVkIGFuZCB3ZSBuZWVkIHRvIHN0b3AgZXhlY3V0aW5nIHRoZSBjb21taW5nCi0gICAgICAvLyBjb21tYW5kcwotICAgICAgY2FzZSBTdGF0dXMuRVJST1IgOgotICAgICAgewotICAgICAgICB1c2VyT2sgPSByZXBvcnRFcnJvclN0YXR1cyhzdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgU3RhdHVzLldBUk5JTkcgOgotICAgICAgewotICAgICAgICB1c2VyT2sgPSByZXBvcnRXYXJuaW5nKHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAgCi0gICAgICBjYXNlIFN0YXR1cy5JTkZPIDoKLSAgICAgIHsKLSAgICAgICAgdXNlck9rID0gdHJ1ZTsKLSAgICAgICAgcmVwb3J0SW5mbyhzdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYoICF1c2VyT2sgKSB0aHJvdyBuZXcgU3RhdHVzRXhjZXB0aW9uKCBzdGF0dXMgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydFdhcm5pbmcoSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICBpbnQgdXNlclJlc3BvbnNlID0KLSAgICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICAgIHNoZWxsXywKLSAgICAgICAgTWVzc2FnZXMuVElUTEVfV0FSTklORywKLSAgICAgICAgbnVsbCwKLSAgICAgICAgc3RhdHVzKTsKLSAgICByZXR1cm4gKHVzZXJSZXNwb25zZSA9PSBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydEVycm9yU3RhdHVzKElTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSgKLSAgICAgIHNoZWxsXywKLSAgICAgIE1lc3NhZ2VzLlRJVExFX0VSUk9SLAotICAgICAgbnVsbCwKLSAgICAgIHN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyI3JlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICByZXBvcnRFcnJvclN0YXR1cyggc3RhdHVzICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXIjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICBNZXNzYWdlRGlhbG9nLm9wZW5NZXNzYWdlKAotICAgICAgICBzaGVsbF8sCi0gICAgICAgIE1lc3NhZ2VzLlRJVExFX0lORk8sCi0gICAgICAgIG51bGwsCi0gICAgICAgIHN0YXR1cyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YzI5ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpLmVudmlyb25tZW50IjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVElUTEVfV0FSTklORzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVElUTEVfRVJST1I7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRJVExFX0lORk87Ci0gIAotICBzdGF0aWMKLSAgewotICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoIEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyApOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvZW52aXJvbm1lbnQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZkZTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1USVRMRV9XQVJOSU5HPVdhcm5pbmc6Ci1USVRMRV9FUlJPUj1FcnJvcjoKLVRJVExFX0lORk89SW5mbzoKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0NvbW1vblVJUGx1Z2luQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9Db21tb25VSVBsdWdpbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGI1NWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0NvbW1vblVJUGx1Z2luQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi0vKioKLSAqIEBhdXRob3IgYmxhbmNldHQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vblVJUGx1Z2luQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWYwY2ZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUdyb3VwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IERhdGFNb2RlbFdpemFyZFBhZ2VbXSBjcmVhdGVQYWdlR3JvdXAoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlR3JvdXBJRCk7Ci0KLQkvKgotCSAqIHRoaXMgaXMgb3B0aW9uYWwKLQkgKi8KLQlwdWJsaWMgSURNUGFnZUhhbmRsZXIgY3JlYXRlUGFnZUhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlR3JvdXBJRCkgCi0JewotCSAgcmV0dXJuIG51bGw7Ci0JfQotCQkKLQkvKioKLQkgKiBUaGlzIHBhZ2UgZ3JvdXAgaGFuZGxlciBjYW4gYmUgb3B0aW9uYWxseSBvdmVycmlkZW4uCi0JICovCi0JcHVibGljIElETVBhZ2VHcm91cEhhbmRsZXIgY3JlYXRlUGFnZUdyb3VwSGFuZGxlciggSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlR3JvdXBJRCApCi0JewotCSAgcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDcwY2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udmVuaWVudCBtZXRob2RzIGZvciBhY2Nlc3NpbmcgdGhlIHNlbWFudGljcyBvZiB0aGUKLSAqIGdpdmVuIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gaW4gdGhlIGNvbnRleHQgb2YgdGhlIHRoZQotICogPGNpdGU+d2l6YXJkUGFnZTwvY2l0ZT4gZWxlbWVudCBvZiB0aGUgPGNpdGU+d2l6YXJkUGFnZUdyb3VwPC9jaXRlPgotICogZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIGtyYWV2Ci0gKi8KLXB1YmxpYyBjbGFzcyBETVdpemFyZFBhZ2VFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IgewotCQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBwb2ludHMgdG8gdGhlIHdpemFyZCwgd2hpY2ggcGFnZXMgYXJlCi0JICogZXh0ZW5kZWQgYnkgdGhlIGN1cnJlbnQgY29udHJpYnV0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9XSVpBUkRfSUQgPSAid2l6YXJkSUQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZmFjdG9yeSBjbGFzcyBuYW1lLCB3aGVyZSBpcwotCSAqIHRoZSBKYXZhIGNvZGUgdGhhdCBjb250cmlidXRlcyB0aGUgbmV3IGNvbnRyb2xzIHRvIHRoZSB3aXphcmQgcGFnZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9GQUNUT1JZID0gImZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIFN0cmluZyB3aXphcmRJRDsKLQlwcm90ZWN0ZWQgRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgZmFjdG9yeUVsZW1lbnQ7Ci0JCi0JcHJpdmF0ZSBpbnQgbG9hZE9yZGVyOwotCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RE1XaXphcmRQYWdlRWxlbWVudDwvY29kZT4gZnJvbSB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5JQ29uZmlndXJhdGlvbkVsZW1lbnQ8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5JQ29uZmlndXJhdGlvbkVsZW1lbnQ8L2NvZGU+IHRvIHdyYXAuCi0JICovCi0JcHVibGljIERNV2l6YXJkUGFnZUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JCQotCQl3aXphcmRJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9XSVpBUkRfSUQpOwotCQlyZWFkRmFjdG9yeShlbGVtZW50KTsKLQkJCi0JCWxvYWRPcmRlciA9IGxvYWRPcmRlckNvdW50ZXIrKzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElkZW50aWZpYWJsZSNnZXRJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJU3RyaW5nIGlkID0gd2l6YXJkSUQ7Ci0JCWlmIChmYWN0b3J5RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZCA9IGlkICsgIkAiICsgZmFjdG9yeUVsZW1lbnQuY2xhc3NOYW1lOwotCQl9Ci0JCXJldHVybiBpZDsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBJZGVudGlmaWFibGUjZ2V0TG9hZE9yZGVyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLQkJcmV0dXJuIGxvYWRPcmRlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIHdpemFyZCB3aGljaCBwYWdlcyB0aGUgY3VycmVudCBleHRlbnNpb24gd2lsbAotCSAqIGNvbnRyaWJ1dGUgdG8uCi0JICogCi0JICogQHJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkSUQoKSB7Ci0JCXJldHVybiB3aXphcmRJRDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFkZGl0aW9uYWwgY29udHJvbHMgZm9yIHRoZSBzcGVjaWZpZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogPHA+Ci0JICogVGhlIGN1cnJlbnQgZXh0ZW5zaW9uIGNvbnRyaWJ1dGVzIGFkZGl0aW9uYWwgY29udHJvbHMgdG8gdGhlIHNwZWNpZmllZAotCSAqIHBhcmVudCBjb21wb3NpdGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSB3aXphcmQgcGFnZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgYWRkaXRpb25hbCBjb250cm9scyB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbW9kZWwgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIHdpemFyZC4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJaWYgKGZhY3RvcnlFbGVtZW50ICE9IG51bGwpCi0JCQlmYWN0b3J5RWxlbWVudC5jcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMocGFyZW50LCBtb2RlbCwgcGFnZU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmFjdG9yaWVzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFTEVNRU5UX0ZBQ1RPUlkpOwotCQlpZiAoZmFjdG9yaWVzICE9IG51bGwgJiYgZmFjdG9yaWVzLmxlbmd0aCA+IDApIHsKLQkJCWZhY3RvcnlFbGVtZW50ID0gbmV3IERNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50KGZhY3Rvcmllc1swXSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyZDVmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgY2xhc3Mgd2hlcmUgdGhlIGFjdHVhbCBleHRlbmRpbmcgb2YgdGhlIHdpemFyZCBwYWdlcyBoYXBwZW4uCi0gKiAKLSAqIDxwPgotICogSW1wbGVtZW50YXRpb24gb2YgdGhpcyBhYnN0cmFjdCBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZCBpbiB0aGUKLSAqIDxjaXRlPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS53aXphcmRQYWdlR3J1b3A8L2NpdGU+IGV4dGVuc2lvbgotICogcG9pbnQgPiA8Y2l0ZT53aXphcmRQYWdlPC9jaXRlPiA+IDxjaXRlPmZhY3Rvcnk8L2NpdGU+ID4gPGNpdGU+Y2xhc3NOYW1lPC9jaXRlPi4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBrcmFldgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFkZGl0aW9uYWwgY29udHJvbHMgZm9yIHRoZSBzcGVjaWZpZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgYWRkaXRpb25hbCBjb250cm9scyB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbW9kZWwgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIHdpemFyZC4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjkwYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gYnVnIDIxMzkyNwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBDb21tb25VSVJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIERNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfVUkgPSAib3JnLmVjbGlwc2UudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIERNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JSGFzaE1hcCB3aXphcmRQbHVnaW5JRE1hcCA9IG51bGw7Ci0KLQlUcmVlTWFwIHdpemFyZFBhZ2VFbGVtZW50cyA9IG51bGw7Ci0KLQkvLyBwcml2YXRlIFRyZWVTZXQgd2l6YXJkRXh0UGFnZUVsZW1lbnRzID0gbnVsbDsKLQlMaXN0IG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIFdpemFyZFBhZ2VFeHRlbnNpb25SZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpIHsKLQkJc2V0dXBXaXphcmRQbHVnaW5JRE1hcCgpOwotCQlyZWFkRnJvbVJlZ2lzdHJ5KCk7Ci0JCXBvc3RSZWFkRnJvbVJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldHVwV2l6YXJkUGx1Z2luSURNYXAoKSB7Ci0JCXdpemFyZFBsdWdpbklETWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gZ2V0IGVkaXRvciBwbHVnaW4gYW5kIHNhdmUgaXQgdG8gYSBoYXNoIG1hcAotCQkvLyBOb3RlOiBlZGl0b3JzIGV4dGVuc2lvbiBpZCBpcyBkaWZmZXJlbnQgZnJvbSBlZGl0b3IgaWQKLQotCQlJRXh0ZW5zaW9uUG9pbnRbXSBwb2ludCA9IG5ldyBJRXh0ZW5zaW9uUG9pbnRbXXtQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KE9SR19FQ0xJUFNFX1VJLCAiZXhwb3J0V2l6YXJkcyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoT1JHX0VDTElQU0VfVUksICJpbXBvcnRXaXphcmRzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChPUkdfRUNMSVBTRV9VSSwgIm5ld1dpemFyZHMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiLCAiZXh0ZW5kYWJsZVdpemFyZCIpfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwb2ludC5sZW5ndGg7IHgrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludFt4XS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgd2l6YXJkSUQgPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGx1Z2luSUQgPSBlbGVtZW50c1tpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJCQl3aXphcmRQbHVnaW5JRE1hcC5wdXQod2l6YXJkSUQsIHBsdWdpbklEKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRnJvbVJlZ2lzdHJ5KCkgewotCQl3aXphcmRQYWdlRWxlbWVudHMgPSBuZXcgVHJlZU1hcCgpOwotCQkvLyB3aXphcmRFeHRQYWdlRWxlbWVudHMgPSBuZXcgVHJlZVNldCgpOwotCQlub25TeW5jZWRQYWdlRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFJlYWQgYWxsIHBhZ2UgZXh0ZW5zaW9ucyBpbnRvIGVkaXRvclBhZ2VFbGVtZW50cwotCQlyZWFkZXIgPSBuZXcgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlcigpOwotCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCQlwdWJsaWMgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlcigpIHsKLQkJCXN1cGVyKENvbW1vblVJUGx1Z2luQ29uc3RhbnRzLlBMVUdJTl9JRCwgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50LkVMRU1FTlRfUEFHRV9HUk9VUCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKCFETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuRUxFTUVOVF9QQUdFX0dST1VQLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXcgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KGVsZW1lbnQpOwotCi0JCQkvLyBwdXQgdGhlIGVsZW1lbnQgaW50byBhIGhhc2htYXAsIHdpemFyZElEIGFzIGtleSwKLQkJCS8vIGxpc3Qgb2YgcGFnZSBlbGVtZW50cyBhcyBvYmplY3QKLQkJCVN0cmluZyB3aXphcmRJRCA9IG5ld0VsZW1lbnQuZ2V0V2l6YXJkSUQoKTsKLQkJCWlmICghd2l6YXJkUGFnZUVsZW1lbnRzLmNvbnRhaW5zS2V5KHdpemFyZElEKSkgewotCQkJCXdpemFyZFBhZ2VFbGVtZW50cy5wdXQod2l6YXJkSUQsIGNyZWF0ZVBhZ2VNYXBFbnRyeShuZXdFbGVtZW50KSk7Ci0JCQl9IGVsc2UgewotCQkJCVRyZWVNYXAgcGFnZU1hcCA9IChUcmVlTWFwKSB3aXphcmRQYWdlRWxlbWVudHMuZ2V0KHdpemFyZElEKTsKLQkJCQlpbnNlcnRQYWdlRWxlbWVudChwYWdlTWFwLCBuZXdFbGVtZW50KTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnNlcnRQYWdlRWxlbWVudChUcmVlTWFwIHBhZ2VNYXAsIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCQlpZiAobmV3RWxlbWVudC5wYWdlSW5zZXJ0aW9uSUQgPT0gbnVsbCkgewotCQkJCXBhZ2VNYXAucHV0KG5ld0VsZW1lbnQsIG5ldyBUcmVlU2V0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBuZXdFbGVtZW50LnBhZ2VJbnNlcnRpb25JRDsKLQkJCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IGdldFBhZ2VFbGVtZW50KGVsZW1lbnROYW1lLCBwYWdlTWFwKTsKLQkJCQlpbnNlcnRFeHRQYWdlRWxlbWVudChwYWdlTWFwLCBwYXJlbnRFbGVtZW50LCBuZXdFbGVtZW50KTsKLQkJCX0KLQotCQkJbmV3RWxlbWVudC5nZXRQYWdlSW5zZXJ0aW9uSUQoKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGluc2VydEV4dFBhZ2VFbGVtZW50KFRyZWVNYXAgcGFnZU1hcCwgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IHBhcmVudEVsZW1lbnQsIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCQlpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LmFkZChuZXdFbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoIXBhcmVudEVsZW1lbnQuYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKCkpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzAsIG5ldyBPYmplY3RbXXtwYXJlbnRFbGVtZW50LmdldFBhZ2VJRCgpfSkpOwotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMSwgbmV3IE9iamVjdFtde25ld0VsZW1lbnQuZ2V0UGFnZUlEKCl9KSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJVHJlZVNldCBzZXQgPSAoVHJlZVNldCkgcGFnZU1hcC5nZXQocGFyZW50RWxlbWVudCk7Ci0JCQlzZXQuYWRkKG5ld0VsZW1lbnQpOwotCi0JCQlpZiAobmV3RWxlbWVudC5hbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIpCi0JCQkJcGFnZU1hcC5wdXQobmV3RWxlbWVudCwgbmV3IFRyZWVTZXQoKSk7Ci0KLQkJCWlmIChub25TeW5jZWRQYWdlRWxlbWVudExpc3QuY29udGFpbnMobmV3RWxlbWVudCkpCi0JCQkJbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnJlbW92ZShuZXdFbGVtZW50KTsKLQkJfQotCi0JCXByaXZhdGUgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGdldFBhZ2VFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSwgVHJlZU1hcCBtYXApIHsKLQkJCVNldCBrZXlTZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRQYWdlSUQoKS5lcXVhbHMoZWxlbWVudE5hbWUpKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCi0JCX0KLQotCQlwcml2YXRlIFRyZWVNYXAgY3JlYXRlUGFnZU1hcEVudHJ5KERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCQlUcmVlTWFwIHBhZ2VNYXAgPSBuZXcgVHJlZU1hcCgpOwotCQkJVHJlZVNldCBwYWdlRXh0ZW5zaW9uU2V0ID0gbmV3IFRyZWVTZXQoKTsKLQkJCXBhZ2VNYXAucHV0KG5ld0VsZW1lbnQsIHBhZ2VFeHRlbnNpb25TZXQpOwotCQkJcmV0dXJuIHBhZ2VNYXA7Ci0KLQkJfQotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uRWxlbWVudHMoU3RyaW5nIHdpemFyZElEKSB7Ci0JCVRyZWVNYXAgdHJlZU1hcCA9IChUcmVlTWFwKSB3aXphcmRQYWdlRWxlbWVudHMuZ2V0KHdpemFyZElEKTsKLQkJcmV0dXJuIHRyZWVNYXAuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnRbXSBnZXRQYWdlRWxlbWVudHMoU3RyaW5nIHdpemFyZElEKSB7Ci0JCVRyZWVNYXAgZWxlbWVudE1hcCA9IChUcmVlTWFwKSB3aXphcmRQYWdlRWxlbWVudHMuZ2V0KHdpemFyZElEKTsKLQkJaWYgKGVsZW1lbnRNYXAgPT0gbnVsbCB8fCBlbGVtZW50TWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG5ldyBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnRbMF07Ci0JCX0KLQkJQXJyYXlMaXN0IGFscmVhZHlWaXN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50TWFwLnNpemUoKSk7Ci0JCVNldCBhbGxQYWdlRWxlbWVudHNMaXN0ID0gZWxlbWVudE1hcC5rZXlTZXQoKTsKLQkJQXJyYXlMaXN0IG9yZGVyZWRQYWdlTGlzdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudE1hcC5zaXplKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhZ2VFbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgZWxlbWVudCA9IChETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFscmVhZHlWaXN0ZWRMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKEVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZWxlbWVudC5nZXRJRCgpLCBudWxsKS5pc0VuYWJsZWQoKSkgewotCQkJCW9yZGVyZWRQYWdlTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJVHJlZVNldCB0cmVlU2V0ID0gKFRyZWVTZXQpIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmICh0cmVlU2V0ICE9IG51bGwgJiYgIXRyZWVTZXQuaXNFbXB0eSgpKQotCQkJCQlmbGF0ZW5UcmVlU2V0KHRyZWVTZXQsIGFsbFBhZ2VFbGVtZW50c0xpc3QsIGFscmVhZHlWaXN0ZWRMaXN0LCBvcmRlcmVkUGFnZUxpc3QsIGVsZW1lbnRNYXApOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRQYWdlQXJyYXkob3JkZXJlZFBhZ2VMaXN0KTsKLQotCX0KLQotCXByaXZhdGUgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50W10gZ2V0UGFnZUFycmF5KEFycmF5TGlzdCBvcmRlcmVkUGFnZUxpc3QpIHsKLQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50W10gcGFnZUVsZW1lbnRzID0gbmV3IERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudFtvcmRlcmVkUGFnZUxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcmVkUGFnZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXBhZ2VFbGVtZW50c1tpXSA9IChETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQpIG9yZGVyZWRQYWdlTGlzdC5nZXQoaSk7Ci0JCX0KLQkJcmV0dXJuIHBhZ2VFbGVtZW50czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmxhdGVuVHJlZVNldChUcmVlU2V0IHRyZWVTZXQsIFNldCBhbGxQYWdlRWxlbWVudHNMaXN0LCBBcnJheUxpc3QgYWxyZWFkeVZpc3RlZExpc3QsIEFycmF5TGlzdCBvcmRlcmVkUGFnZUxpc3QsIFRyZWVNYXAgZWxlbWVudE1hcCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0cmVlU2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChhbHJlYWR5VmlzdGVkTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMiwgbmV3IE9iamVjdFtde2VsZW1lbnQuZ2V0UGFnZUlEKCksIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudC5BVFRfUEFHRV9JTlNFUlRJT05fSUR9KSk7IAotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChhbGxQYWdlRWxlbWVudHNMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJVHJlZVNldCBzZXQgPSAoVHJlZVNldCkgZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJb3JkZXJlZFBhZ2VMaXN0LmFkZChlbGVtZW50KTsKLQkJCQlhbHJlYWR5VmlzdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJZmxhdGVuVHJlZVNldChzZXQsIGFsbFBhZ2VFbGVtZW50c0xpc3QsIGFscmVhZHlWaXN0ZWRMaXN0LCBvcmRlcmVkUGFnZUxpc3QsIGVsZW1lbnRNYXApOwotCQkJfSBlbHNlIHsKLQkJCQlvcmRlcmVkUGFnZUxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCWFscmVhZHlWaXN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvLyBpZiBjaGlsZCBlbGVtZW50cyBhcmUgcmVhZCBpbiBiZWZvcmUgcGFyZW50IGVsZW1lbnQuIERvIHBvc3QgcmVhZC4KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGxpc3RSZW1vdmVPYmplY3RzOwotCi0JcHJpdmF0ZSB2b2lkIHBvc3RSZWFkRnJvbVJlZ2lzdHJ5KCkgewotCQlsaXN0UmVtb3ZlT2JqZWN0cyA9IG5ldyBBcnJheUxpc3Qobm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgZWxlbWVudCA9IChETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQpIG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5nZXQoaSk7Ci0JCQlUcmVlTWFwIHBhZ2VNYXAgPSAoVHJlZU1hcCkgd2l6YXJkUGFnZUVsZW1lbnRzLmdldChlbGVtZW50LndpemFyZElEKTsKLQkJCWlmIChlbGVtZW50LnBhZ2VJbnNlcnRpb25JRCA9PSBudWxsKSB7Ci0JCQkJYWRkVG9GaXJzdEF2aWFsaWFibGUocGFnZU1hcCwgZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKHJlYWRlciAhPSBudWxsICYmIHBhZ2VNYXAgIT0gbnVsbCkKLQkJCQlyZWFkZXIuaW5zZXJ0UGFnZUVsZW1lbnQocGFnZU1hcCwgZWxlbWVudCk7Ci0JCX0KLQkJbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnJlbW92ZUFsbChsaXN0UmVtb3ZlT2JqZWN0cyk7Ci0JCWlmICghbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LmlzRW1wdHkoKSkKLQkJCWxvZ01pc3NpbmdDbGFzc0Vycm9yKCk7Ci0JCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5jbGVhcigpOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhZ2VNYXAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUb0ZpcnN0QXZpYWxpYWJsZShUcmVlTWFwIHBhZ2VNYXAsIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCWJvb2xlYW4gaW5zZXJ0Tm90Rm91bmQgPSB0cnVlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYWdlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcikgewotCQkJCVRyZWVTZXQgc2V0ID0gKFRyZWVTZXQpIHBhZ2VNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCXNldC5hZGQobmV3RWxlbWVudCk7Ci0JCQkJbGlzdFJlbW92ZU9iamVjdHMuYWRkKG5ld0VsZW1lbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAoaW5zZXJ0Tm90Rm91bmQpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlsb2dnZXIubG9nRXJyb3IoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMyk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dNaXNzaW5nQ2xhc3NFcnJvcigpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25TeW5jZWRQYWdlRWxlbWVudExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCURNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBlbGVtZW50ID0gKERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCkgbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LmdldChpKTsKLQkJCWxvZ2dlci5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfNCwgbmV3IE9iamVjdFtde2VsZW1lbnQucGFnZUluc2VydGlvbklELCBlbGVtZW50LmdldFBhZ2VJRCgpLCBlbGVtZW50LnBsdWdpbklEfSkpOwotCQl9Ci0JCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5jbGVhcigpOwotCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRWpiUGFnZUV4dGVuc2lvblJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwOWE4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udmVuaWVudCBtZXRob2RzIGZvciBhY2Nlc3NpbmcgdGhlIHNlbWFudGljcyBvZiB0aGUKLSAqIGdpdmVuIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gaW4gdGhlIGNvbnRleHQgb2YgdGhlCi0gKiA8Y2l0ZT5mYWN0b3J5PC9jaXRlPiBlbGVtZW50IGFzIGEgY2hpbGQgZWxlbWVudCBvZiB0aGUgPGNpdGU+d2l6YXJkUGFnZTwvY2l0ZT4KLSAqIGVsZW1lbnQgb2YgdGhlIDxjaXRlPndpemFyZFBhZ2VHcm91cDwvY2l0ZT4gZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIGtyYWV2Ci0gKi8KLXB1YmxpYyBjbGFzcyBETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCBleHRlbmRzIENvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlciB7Ci0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHBvaW50cyB0byBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUKLQkgKiBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIDxjb2RlPkRNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3Rvcnk8L2NvZGU+Ci0JICogYWJzdHJhY3QgY2xhc3MuIFRoaXMgY2xhc3MgZG9lcyB0aGUgYWN0dWFsIGpvYiBvbiBleHRlbmRpbmcgYSB3aXphcmQKLQkgKiBwYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTU19OQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsKLQlwcm90ZWN0ZWQgRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeSB3aXphcmRQYWdlRmFjdG9yeTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhZ2VGYWN0b3J5SW5pdGlhbGl6ZWQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkRNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50PC9jb2RlPiBmcm9tIHRoZSBnaXZlbgotCSAqIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gdG8gd3JhcC4KLQkgKi8KLQlwdWJsaWMgRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JCWNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU19OQU1FKTsKLQkJCi0JCWlzUGFnZUZhY3RvcnlJbml0aWFsaXplZCA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYWRkaXRpb25hbCBjb250cm9scyBmb3IgdGhlIHNwZWNpZmllZCB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQotCSAqIDxjb2RlPkRNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3Rvcnk8L2NvZGU+IGFic3RyYWN0IGNsYXNzLCB0aGF0IGlzCi0JICogZGVmaW5lZCBpbiB0aGUgPGNpdGU+Y2xhc3NOYW1lPC9jaXRlPiBhdHRyaWJ1dGUsIGlzIGluaXRpYWxpemVkLiBUaGVuCi0JICogdGhlIG1ldGhvZCBmb3J3YXJkcyB0aGUgY2FsbCB0byB0aGUgZmFjdG9yeSBjbGFzcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgYWRkaXRpb25hbCBjb250cm9scyB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbW9kZWwgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIHdpemFyZC4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJaWYgKCFpc1BhZ2VGYWN0b3J5SW5pdGlhbGl6ZWQpCi0JCQlpbml0UGFnZUZhY3RvcnkoKTsKLQotCQlpZiAod2l6YXJkUGFnZUZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXdpemFyZFBhZ2VGYWN0b3J5LmNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhwYXJlbnQsIG1vZGVsLCBwYWdlTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0UGFnZUZhY3RvcnkoKSB7Ci0JCXRyeSB7Ci0JCQl3aXphcmRQYWdlRmFjdG9yeSA9IChETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTX05BTUUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXJyb3IgZ2V0dGluZyBwYWdlIGZhY3Rvcnk6ICIgKyBjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaXNQYWdlRmFjdG9yeUluaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3YWE3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlQ29tcGFyYXRvcjsKLQotcHVibGljIGNsYXNzIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBR0VfR1JPVVAgPSAid2l6YXJkUGFnZUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BBR0VfSUQgPSAicGFnZUdyb3VwSUQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfV0laQVJEX0lEID0gIndpemFyZElEIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1JFUVVJUkVTX0RBVEFfT1BFUkFUSU9OX0lEID0gInJlcXVpcmVzRGF0YU9wZXJhdGlvbklkIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RBVEFfTU9ERUxfSURTID0gImRhdGFNb2RlbElkcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9BTExPV1NfRVhURU5ERURfUEFHRVNfQUZURVIgPSAiYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BBR0VfSU5TRVJUSU9OX0lEID0gInBhZ2VHcm91cEluc2VydGlvbklEIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9GQUNUT1JZID0gImZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRE1XaXphcmRQYWdlR3JvdXBGYWN0b3J5RWxlbWVudCB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBwbHVnaW5JRDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHdpemFyZElEOwotCXB1YmxpYyBTdHJpbmcgcGFnZUdyb3VwSUQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB3aXphcmRGYWN0b3J5RWxlbWVudDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXF1aXJlc0RhdGFPcGVyYXRpb25JZDsKLQlwcm90ZWN0ZWQgU2V0IGRhdGFNb2RlbElEczsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhZ2VJbnNlcnRpb25JRDsKLQlwcml2YXRlIGludCBsb2FkT3JkZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGxvYWRPcmRlckNvdW50ZXI7Ci0KLQotCXByaXZhdGUgaW50IHR5cGU7Ci0KLQlwdWJsaWMgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50MSkgewotCQlzdXBlcihlbGVtZW50MSk7Ci0JCXBsdWdpbklEID0gZWxlbWVudDEuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCXdpemFyZElEID0gZWxlbWVudDEuZ2V0QXR0cmlidXRlKEFUVF9XSVpBUkRfSUQpOwotCQlwYWdlR3JvdXBJRCA9IGVsZW1lbnQxLmdldEF0dHJpYnV0ZShBVFRfUEFHRV9JRCk7Ci0JCXJlcXVpcmVzRGF0YU9wZXJhdGlvbklkID0gZWxlbWVudDEuZ2V0QXR0cmlidXRlKEFUVF9SRVFVSVJFU19EQVRBX09QRVJBVElPTl9JRCk7Ci0JCWRhdGFNb2RlbElEcyA9IGdldERhdGFNb2RlbElkcyggZWxlbWVudDEgKTsKLQkJcmVhZEFsbG93c0V4dGVuZGVkUGFnZUFmdGVyKGVsZW1lbnQxKTsKLQkJcGFnZUluc2VydGlvbklEID0gZWxlbWVudDEuZ2V0QXR0cmlidXRlKEFUVF9QQUdFX0lOU0VSVElPTl9JRCk7Ci0JCXJlYWRGYWN0b3J5KGVsZW1lbnQxKTsKLQkJdmFsaWRhdGVTZXR0aW5ncygpOwotCQlsb2FkT3JkZXIgPSBsb2FkT3JkZXJDb3VudGVyKys7Ci0JfQotCi0gIHByaXZhdGUgU2V0IGdldERhdGFNb2RlbElkcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCApCi0gIHsKLSAgICBIYXNoU2V0IGlkcyAgICA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgU3RyaW5nICBpZExpc3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREFUQV9NT0RFTF9JRFMpOwotICAgIAotICAgIGlmKCBpZExpc3QgIT0gbnVsbCApCi0gICAgewotICAgICAgU3RyaW5nW10gZGF0YU1vZGVsSURzID0gaWRMaXN0LnNwbGl0KCAiICoiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGFNb2RlbElEcy5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBpZHMuYWRkKCBkYXRhTW9kZWxJRHNbaW5kZXhdICk7ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGlkczsKLSAgfQotICAKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTZXR0aW5ncygpIHsKLQkJaWYgKHdpemFyZElEID09IG51bGwgfHwgd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ID09IG51bGwpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiSW5jb21wbGV0ZSBwYWdlIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCByZWFkQWxsb3dzRXh0ZW5kZWRQYWdlQWZ0ZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQxKSB7Ci0JCVN0cmluZyBhbGxvd3NQYWdlQWZ0ZXJWYWx1ZSA9IGVsZW1lbnQxLmdldEF0dHJpYnV0ZShBVFRfQUxMT1dTX0VYVEVOREVEX1BBR0VTX0FGVEVSKTsKLQkJYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyID0gYWxsb3dzUGFnZUFmdGVyVmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi52YWx1ZU9mKGFsbG93c1BhZ2VBZnRlclZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQxKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY3RvcmllcyA9IGVsZW1lbnQxLmdldENoaWxkcmVuKEVMRU1FTlRfRkFDVE9SWSk7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCAmJiBmYWN0b3JpZXMubGVuZ3RoID4gMCkgewotCQkJd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ID0gbmV3IERNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQoZmFjdG9yaWVzWzBdLCBwYWdlR3JvdXBJRCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUhhbmRsZXIgY3JlYXRlUGFnZUhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCAhPSBudWxsKQotCQkJcmV0dXJuIHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5jcmVhdGVQYWdlSGFuZGxlcihkYXRhTW9kZWwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkUGFnZVtdIGNyZWF0ZVBhZ2VHcm91cChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAod2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50LmNyZWF0ZVBhZ2VHcm91cChkYXRhTW9kZWwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBjcmVhdGVQYWdlR3JvdXBIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuY3JlYXRlUGFnZUdyb3VwSGFuZGxlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCXJldHVybiBJZGVudGlmaWFibGVDb21wYXJhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0aGlzLCBvKTsKLQkJLyoKLQkJICogaWYgKG8gPT0gbnVsbCkgcmV0dXJuIEdSRUFURVJfVEhBTjsgV2l6YXJkUGFnZUVsZW1lbnQgZWxlbWVudCA9IChXaXphcmRQYWdlRWxlbWVudCkgbzsgaWYKLQkJICogKGdldElEKCkgPT0gbnVsbCAmJiBlbGVtZW50LmdldElEKCkgPT0gbnVsbCkgcmV0dXJuIGNvbXBhcmVMb2FkT3JkZXIoZWxlbWVudCk7IGlmCi0JCSAqIChnZXRJRCgpID09IG51bGwpIHJldHVybiBHUkVBVEVSX1RIQU47IGVsc2UgaWYgKGVsZW1lbnQuZ2V0SUQoKSA9PSBudWxsKSByZXR1cm4KLQkJICogTEVTU19USEFOOwotCQkgKiAKLQkJICogaW50IHByaW9yaXR5ID0gZ2V0UHJpb3JpdHkoKTsgaW50IGVsZW1lbnRQcmlvcml0eSA9ZWxlbWVudC5nZXRQcmlvcml0eSgpOwotCQkgKiAKLQkJICogaWYgKHByaW9yaXR5ID09IGVsZW1lbnRQcmlvcml0eSkgcmV0dXJuIGNvbXBhcmVMb2FkT3JkZXIoZWxlbWVudCk7IGlmIChwcmlvcml0eSA8Ci0JCSAqIGVsZW1lbnRQcmlvcml0eSkgcmV0dXJuIEdSRUFURVJfVEhBTjsgaWYgKHByaW9yaXR5ID4gZWxlbWVudFByaW9yaXR5KSByZXR1cm4gTEVTU19USEFOOwotCQkgKiByZXR1cm4gRVFVQUw7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIoKSB7Ci0JCXJldHVybiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBwbHVnaW5JRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBJRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlSW5zZXJ0aW9uSUQoKSB7Ci0JCXJldHVybiBwYWdlSW5zZXJ0aW9uSUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TG9hZE9yZGVyKCkgewotCQlyZXR1cm4gbG9hZE9yZGVyOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIoKSB7Ci0JCXJldHVybiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcgotCSAqICAgICAgICAgICAgVGhlIGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKGJvb2xlYW4gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKSB7Ci0JCXRoaXMuYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyID0gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQoKSB7Ci0JCXJldHVybiByZXF1aXJlc0RhdGFPcGVyYXRpb25JZDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVzRGF0YU9wZXJhdGlvbklkKFN0cmluZyBkYXRhT3BlcmF0aW9uSWQpIHsKLQkJcmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQgPSBkYXRhT3BlcmF0aW9uSWQ7Ci0JfQotCi0JcHVibGljIFNldCBnZXREYXRhTW9kZWxJRHMoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWxJRHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsSUQoU2V0IG5ld0RhdGFNb2RlbElEcykgewotCQlkYXRhTW9kZWxJRHMgPSBuZXdEYXRhTW9kZWxJRHM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3aXphcmRGYWN0b3J5RWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEZhY3RvcnlFbGVtZW50KCkgewotCQlyZXR1cm4gd2l6YXJkRmFjdG9yeUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpemFyZEZhY3RvcnlFbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgd2l6YXJkRmFjdG9yeUVsZW1lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpemFyZEZhY3RvcnlFbGVtZW50KFN0cmluZyB3aXphcmRGYWN0b3J5RWxlbWVudCkgewotCQl0aGlzLndpemFyZEZhY3RvcnlFbGVtZW50ID0gd2l6YXJkRmFjdG9yeUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3aXphcmRJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZElEKCkgewotCQlyZXR1cm4gd2l6YXJkSUQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpemFyZElECi0JICogICAgICAgICAgICBUaGUgd2l6YXJkSUQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpemFyZElEKFN0cmluZyB3aXphcmRJRCkgewotCQl0aGlzLndpemFyZElEID0gd2l6YXJkSUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuCi0JICovCi0JcHVibGljIERNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQgZ2V0V2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50KCkgewotCQlyZXR1cm4gd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudChETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCkgewotCQl0aGlzLndpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCA9IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudDsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBwYWdlSUQKLQkgKiAgICAgICAgICAgIFRoZSBwYWdlSUQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VJRChTdHJpbmcgcGFnZUlEKSB7Ci0JCXRoaXMucGFnZUdyb3VwSUQgPSBwYWdlSUQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBnZXRQYWdlSUQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0YmEyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlSGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50IGV4dGVuZHMgQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTX05BTUUgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWU7Ci0JcHJvdGVjdGVkIERNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeSB3aXphcmRQYWdlR3JvdXBGYWN0b3J5OwotCXByb3RlY3RlZCBib29sZWFuIGlzUGFnZUdyb3VwRmFjdG9yeUluaXRpYWxpemVkOwotCXByb3RlY3RlZCBTdHJpbmcgcGFnZUdyb3VwSUQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcGFnZUdyb3VwSUQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JCWNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU19OQU1FKTsKLQkJdGhpcy5wYWdlR3JvdXBJRCA9IHBhZ2VHcm91cElEOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBjcmVhdGVQYWdlSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAoIWlzUGFnZUdyb3VwRmFjdG9yeUluaXRpYWxpemVkKQotCQkJaW5pdFBhZ2VGYWN0b3J5KCk7Ci0JCWlmICh3aXphcmRQYWdlR3JvdXBGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJRE1QYWdlSGFuZGxlciBoYW5kbGVyID0gd2l6YXJkUGFnZUdyb3VwRmFjdG9yeS5jcmVhdGVQYWdlSGFuZGxlcihkYXRhTW9kZWwsIHBhZ2VHcm91cElEKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZFBhZ2VbXSBjcmVhdGVQYWdlR3JvdXAoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKCFpc1BhZ2VHcm91cEZhY3RvcnlJbml0aWFsaXplZCkKLQkJCWluaXRQYWdlRmFjdG9yeSgpOwotCi0JCWlmICh3aXphcmRQYWdlR3JvdXBGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlEYXRhTW9kZWxXaXphcmRQYWdlW10gcGFnZXMgPSB3aXphcmRQYWdlR3JvdXBGYWN0b3J5LmNyZWF0ZVBhZ2VHcm91cChkYXRhTW9kZWwsIHBhZ2VHcm91cElEKTsKLQkJCi0JCXJldHVybiBwYWdlczsKLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBjcmVhdGVQYWdlR3JvdXBIYW5kbGVyKCBJRGF0YU1vZGVsIGRhdGFNb2RlbCApCi0JewotCSAgaWYgKCFpc1BhZ2VHcm91cEZhY3RvcnlJbml0aWFsaXplZCkgaW5pdFBhZ2VGYWN0b3J5KCk7Ci0JCQotCSAgaWYoIHdpemFyZFBhZ2VHcm91cEZhY3RvcnkgPT0gbnVsbCApIHJldHVybiBudWxsOwotCSAgCi0JICByZXR1cm4gd2l6YXJkUGFnZUdyb3VwRmFjdG9yeS5jcmVhdGVQYWdlR3JvdXBIYW5kbGVyKCBkYXRhTW9kZWwsIHBhZ2VHcm91cElEICk7Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgaW5pdFBhZ2VGYWN0b3J5KCkgewotCQl0cnkgewotCQkJd2l6YXJkUGFnZUdyb3VwRmFjdG9yeSA9IChETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1NfTkFNRSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFcnJvciBnZXR0aW5nIHBhZ2UgZmFjdG9yeTogIiArIGNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpc1BhZ2VHcm91cEZhY3RvcnlJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlN2I3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbFdpemFyZEV4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT04gPSAiRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UID0gIkRhdGFNb2RlbFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEhhc2hNYXAgZXh0ZW5zaW9uczsKLQotCXB1YmxpYyBEYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIoKSB7Ci0JCXN1cGVyKFdUUFVJUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTEVNRU5UKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0lEKTsKLQkJaWYgKG51bGwgPT0gaWQgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIEVMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9JRCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfQ0xBU1MpOwotCQlpZiAobnVsbCA9PSBjbGFzc05hbWUgfHwgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBFTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfQ0xBU1MpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlhZGRFeHRlbnNpb24oaWQsIGVsZW1lbnQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRXh0ZW5zaW9uKFN0cmluZyBpZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGV4dGVuc2lvbnMuY29udGFpbnNLZXkoaWQpKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkR1cGxpY2F0ZSAiICsgRUxFTUVOVCArICIgIiArIEFUVFJJQlVURV9JRCArICIgIiArIGlkKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJZXh0ZW5zaW9ucy5wdXQoaWQsIGVsZW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQlpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlleHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgZXh0ZW5zaW9ucy5nZXQoaWQpOwotCQlpZiAobnVsbCA9PSBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIEVMRU1FTlQgKyAiIG5vdCBmb3VuZCBmb3IgIiArIEFUVFJJQlVURV9JRCArICI6ICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkIGdldFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlEYXRhTW9kZWxXaXphcmQgd2l6YXJkID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRFeHRlbnNpb24oZGF0YU1vZGVsLmdldElEKCkpOwotCi0JCXRyeSB7Ci0JCQl3aXphcmQgPSAoRGF0YU1vZGVsV2l6YXJkKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUklCVVRFX0NMQVNTKTsKLQkJCXdpemFyZC5zZXREYXRhTW9kZWwoZGF0YU1vZGVsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHdpemFyZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9FeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9FeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWVlMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2libGVWaWV3UmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5IElOU1RBTkNFID0gbnVsbDsKLQlwcml2YXRlIE1hcCBleHRlbmRlZFZpZXdlck1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZGVzY3JpcHRvck1hcCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgaW50ZXJmYWNlIEVsZW1lbnRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfVklFV0VSID0gImV4dGVuZGVkVmlld2VyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXRVJfSUQgPSAidmlld2VySUQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9WSUVXRVJfSUQgPSAicGFyZW50Vmlld2VySUQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUllfQ0xBU1MgPSAiZmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVU5DVElPTl9HUk9VUF9JRCA9ICJmdW5jdGlvbkdyb3VwSUQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeSgpIHsKLQkJc3VwZXIoV1RQVUlQbHVnaW4uUExVR0lOX0lELCBXVFBVSVBsdWdpbi5FWFRFTkRFRF9WSUVXRVJfUkVHSVNUUllfRVhURU5TSU9OX1BPSU5UKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEV4dGVuc2libGVWaWV3UmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5KCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihTdHJpbmcgdmlld2VySUQpIHsKLQkJcmV0dXJuIChEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yTWFwKCkuZ2V0KHZpZXdlcklEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnJlZ2lzdHJ5LlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFbGVtZW50cy5FWFRFTkRFRF9WSUVXRVIpKSB7Ci0JCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWdldERlc2NyaXB0b3JNYXAoKS5wdXQoZGVzY3JpcHRvci5nZXRWaWV3ZXJJRCgpLCBkZXNjcmlwdG9yKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVuZGVkVmlld2VyTWFwLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0RXh0ZW5kZWRWaWV3ZXJNYXAoKSB7Ci0JCWlmIChleHRlbmRlZFZpZXdlck1hcCA9PSBudWxsKQotCQkJZXh0ZW5kZWRWaWV3ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRWaWV3ZXJNYXA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yTWFwLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0RGVzY3JpcHRvck1hcCgpIHsKLQkJaWYgKGRlc2NyaXB0b3JNYXAgPT0gbnVsbCkKLQkJCWRlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvck1hcDsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRGVzY3JpcHRvciB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdmlld2VySUQgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBwYXJlbnRWaWV3ZXJJRCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZhY3RvcnlDbGFzcyA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGljb24gPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZ1bmN0aW9uR3JvdXBJRCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmdDYWNoZSA9IG51bGw7Ci0JCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0JCS8qKgotCQkgKiAgCi0JCSAqLwotCQlwdWJsaWMgRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQotCQkJdGhpcy52aWV3ZXJJRCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5WSUVXRVJfSUQpOwotCQkJdGhpcy5wYXJlbnRWaWV3ZXJJRCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5QQVJFTlRfVklFV0VSX0lEKTsKLQkJCXRoaXMuZmFjdG9yeUNsYXNzID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LkVsZW1lbnRzLkZBQ1RPUllfQ0xBU1MpOwotCQkJdGhpcy5pY29uID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LkVsZW1lbnRzLklDT04pOwotCQkJdGhpcy5sYWJlbCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5MQUJFTCk7Ci0JCQl0aGlzLmZ1bmN0aW9uR3JvdXBJRCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5GVU5DVElPTl9HUk9VUF9JRCk7Ci0JCX0KLQotCQlwdWJsaWMgSUV4dGVuc2libGVWaWV3RmFjdG9yeSBjcmVhdGVGYWN0b3J5SW5zdGFuY2UoKSB7Ci0JCQlJRXh0ZW5zaWJsZVZpZXdGYWN0b3J5IGZhY3RvcnlJbnN0YW5jZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWZhY3RvcnlJbnN0YW5jZSA9IChJRXh0ZW5zaWJsZVZpZXdGYWN0b3J5KSB0aGlzLmVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihnZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlXVFBVSVBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCXJldHVybiBmYWN0b3J5SW5zdGFuY2U7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBmYWN0b3J5Q2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpIHsKLQkJCXJldHVybiBmYWN0b3J5Q2xhc3M7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBmdW5jdGlvbkdyb3VwSUQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEZ1bmN0aW9uR3JvdXBJRCgpIHsKLQkJCXJldHVybiBmdW5jdGlvbkdyb3VwSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBpY29uLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRJY29uKCkgewotCQkJcmV0dXJuIGljb247Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBsYWJlbC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJlbnRWaWV3ZXJJRC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50Vmlld2VySUQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50Vmlld2VySUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB2aWV3ZXJJRC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Vmlld2VySUQoKSB7Ci0JCQlyZXR1cm4gdmlld2VySUQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKHRvU3RyaW5nQ2FjaGUgPT0gbnVsbCkKLQkJCQl0b1N0cmluZ0NhY2hlID0gIkV4dGVuc2libGVWaWV3UmVnaXN0cnkuSW5mbyBbdmlld2VySUQ9XCIiICsgZ2V0Vmlld2VySUQoKSArICJcIixwYXJlbnRWaWV3ZXJJRD1cIiIgKyBnZXRQYXJlbnRWaWV3ZXJJRCgpICsgIlwiLGZhY3RvcnlDbGFzcz0iICsgZ2V0RmFjdG9yeUNsYXNzKCkgKyAiXCIsZnVuY3Rpb25Hcm91cElEPVwiIiArIGdldEZ1bmN0aW9uR3JvdXBJRCgpICsgIlwiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJcmV0dXJuIHRvU3RyaW5nQ2FjaGU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lFeHRlbnNpYmxlVmlld0ZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lFeHRlbnNpYmxlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxOTM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9JRXh0ZW5zaWJsZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuc2libGVWaWV3RmFjdG9yeSB7Ci0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvSU9wZXJhdGlvbk5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lPcGVyYXRpb25Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0N2I1Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvSU9wZXJhdGlvbk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDUsIDIwMDQKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtCi0gKiBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVyYXRpb25Ob2RlIHsKLQotCXB1YmxpYyBJT3BlcmF0aW9uTm9kZVtdIGdldENoaWxkcmVuKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKTsKLQotCS8qKgotCSAqIFNhbWUgYXMgY2FsbGluZyBzZXRDaGVja2VkKGNoZWNrZWQsIHRydWUpCi0JICogCi0JICogQHBhcmFtIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCXB1YmxpYyBJT3BlcmF0aW9uTm9kZSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fsd2F5c0V4ZWN1dGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Fic3RyYWN0V1RQVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQWJzdHJhY3RXVFBVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODNmMjk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQWJzdHJhY3RXVFBVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMTAsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuSU1zZ0xvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V1RQVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIGltcGxlbWVudHMgSU1zZ0xvZ2dlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gbnVsbDsKLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBBYnN0cmFjdFdUUFVJUGx1Z2luIGluc3RhbmNlID0gbnVsbDsgCi0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFdUUFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkgewotCQkJbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRQbHVnaW5JRCgpKTsKLQkJCXNldFJlbmRlcmVyKGxvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBsdWdpbklEKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYUxvZ2dlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJlbmRlcmVyKExvZ2dlciBhTG9nZ2VyKSB7Ci0JCW5ldyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihhTG9nZ2VyKTsKLQl9Ci0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uICB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQ2xvc2FibGVXaXphcmREaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQ2xvc2FibGVXaXphcmREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNmM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Nsb3NhYmxlV2l6YXJkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENsb3NhYmxlV2l6YXJkRGlhbG9nIGV4dGVuZHMgV2l6YXJkRGlhbG9nIHsKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gbmV3V2l6YXJkCi0JICovCi0JcHVibGljIENsb3NhYmxlV2l6YXJkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJV2l6YXJkIG5ld1dpemFyZCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgbmV3V2l6YXJkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaW5pc2hBbmRDbG9zZSgpIHsKLQkJc3VwZXIuZmluaXNoUHJlc3NlZCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0RNUGFnZUdyb3VwRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRE1QYWdlR3JvdXBFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmFlZjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRE1QYWdlR3JvdXBFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBidWcgMjEzOTI3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aS5ETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBETVBhZ2VHcm91cEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSURNUGFnZUdyb3VwIHsKLQlwcml2YXRlIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBwYWdlR3JvdXBFbGVtZW50OwotCi0JcHJpdmF0ZSBMaXN0IHBhZ2VzOwotCQotCXB1YmxpYyBETVBhZ2VHcm91cEVsZW1lbnRJbXBsKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXBhZ2VHcm91cEVsZW1lbnQgPSBuZXcgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEFsbG93c0V4dGVuZGVkUGFnZXMoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWREYXRhT3BlcmF0aW9uVG9SdW4oKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFJlcXVpcmVzRGF0YU9wZXJhdGlvbklkKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXREYXRhTW9kZWxJRHMoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldERhdGFNb2RlbElEcygpOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGdldFBhZ2VHcm91cEhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEVsZW1lbnQuY3JlYXRlUGFnZUdyb3VwSGFuZGxlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFBhZ2VzKElEYXRhTW9kZWwgZGF0YU1vZGVsKXsKLQkJaWYgKHBhZ2VzID09IG51bGwpIHsKLQkJCXBhZ2VzID0gQXJyYXlzLmFzTGlzdChwYWdlR3JvdXBFbGVtZW50LmNyZWF0ZVBhZ2VHcm91cChkYXRhTW9kZWwpKTsKLQkJfQotCQlyZXR1cm4gcGFnZXM7Ci0JfQotCQotCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBnZXRQYWdlSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gcGFnZUdyb3VwRWxlbWVudC5jcmVhdGVQYWdlSGFuZGxlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFBhZ2VJRCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSW5zZXJ0aW9uSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFBhZ2VJbnNlcnRpb25JRCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFdpemFyZElEKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Rpc3BsYXlVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Rpc3BsYXlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0N2Y1OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9EaXNwbGF5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTksIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIERpc3BsYXlVdGlsaXR5IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLQotCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGQgPT0gbnVsbCkKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCWVsc2UKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9FcnJvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9FcnJvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzI0NDI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXJyb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBZGRlZCBhIERldGFpbHMgYnV0dG9uIHRvIHRoZSBNZXNzYWdlRGlhbG9nIHRvIHNob3cgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZS4KLSAqIAotICogQm9ycm93ZWQgZnJvbSBhbiBlY2xpcHNlIEludGVybmFsRXJyb3JEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIEVycm9yRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0sgPSB7SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0tfQ0FOQ0VMID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PS19ERVRBSUxTID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PS19DQU5DRUxfREVUQUlMUyA9IHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUx9OwotCXByaXZhdGUgVGhyb3dhYmxlIGRldGFpbDsKLQlwcml2YXRlIGludCBkZXRhaWxCdXR0b25JRCA9IC0xOwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0JLy9Xb3JrYXJvdW5kLiBTV1QgZG9lcyBub3Qgc2VlbSB0byBzZXQgdGhlIGRlZmF1bHQgYnV0dG9uIGlmCi0JLy90aGVyZSBpcyBub3QgY29udHJvbCB3aXRoIGZvY3VzLiBCdWc6IDE0NjY4Ci0JcHJpdmF0ZSBpbnQgZGVmYXVsdEJ1dHRvbkluZGV4ID0gMDsKLQkvKioKLQkgKiBTaXplIG9mIHRoZSB0ZXh0IGluIGxpbmVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX0xJTkVfQ09VTlQgPSAxNTsKLQotCXB1YmxpYyBFcnJvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBJbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgVGhyb3dhYmxlIGRldGFpbCwgaW50IGRpYWxvZ0ltYWdlVHlwZSwgU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwgZGlhbG9nSW1hZ2VUeXBlLCBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JCWRlZmF1bHRCdXR0b25JbmRleCA9IGRlZmF1bHRJbmRleDsKLQkJdGhpcy5kZXRhaWwgPSBkZXRhaWw7Ci0JCW1lc3NhZ2UgPSBkaWFsb2dNZXNzYWdlOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUpOwotCX0KLQotCS8vV29ya2Fyb3VuZC4gU1dUIGRvZXMgbm90IHNlZW0gdG8gc2V0IHJpZ3RoIHRoZSBkZWZhdWx0IGJ1dHRvbiBpZgotCS8vdGhlcmUgaXMgbm90IGNvbnRyb2wgd2l0aCBmb2N1cy4gQnVnOiAxNDY2OAotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJY3JlYXRlKCk7Ci0JCUJ1dHRvbiBiID0gZ2V0QnV0dG9uKGRlZmF1bHRCdXR0b25JbmRleCk7Ci0JCWIuc2V0Rm9jdXMoKTsKLQkJYi5nZXRTaGVsbCgpLnNldERlZmF1bHRCdXR0b24oYik7Ci0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZXRhaWwgYnV0dG9uOwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERldGFpbEJ1dHRvbihpbnQgaW5kZXgpIHsKLQkJZGV0YWlsQnV0dG9uSUQgPSBpbmRleDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gZGV0YWlsQnV0dG9uSUQpIHsKLQkJCXRvZ2dsZURldGFpbHNBcmVhKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRSZXR1cm5Db2RlKGJ1dHRvbklkKTsKLQkJCWNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgcHJlc3NpbmcgdGhlIGRldGFpbHMKLQkgKiBidXR0b24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXRleHQuZGlzcG9zZSgpOwotCQkJdGV4dCA9IG51bGw7Ci0JCQlnZXRCdXR0b24oZGV0YWlsQnV0dG9uSUQpLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJY3JlYXRlRHJvcERvd25UZXh0KChDb21wb3NpdGUpIGdldENvbnRlbnRzKCkpOwotCQkJZ2V0QnV0dG9uKGRldGFpbEJ1dHRvbklEKS5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLQkJfQotCQlQb2ludCBuZXdTaXplID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlnZXRTaGVsbCgpLnNldFNpemUobmV3IFBvaW50KHdpbmRvd1NpemUueCwgd2luZG93U2l6ZS55ICsgKG5ld1NpemUueSAtIG9sZFNpemUueSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhpcyBkaWFsb2cncyBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEcm9wRG93blRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIGxpc3QKLQkJdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCS8vIHByaW50IHRoZSBzdGFja3RyYWNlIGluIHRoZSB0ZXh0IGZpZWxkCi0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCVByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGJhb3MpOwotCQkJZGV0YWlsLnByaW50U3RhY2tUcmFjZShwcyk7Ci0JCQlpZiAoKGRldGFpbCBpbnN0YW5jZW9mIFNXVEVycm9yKSAmJiAoKChTV1RFcnJvcikgZGV0YWlsKS50aHJvd2FibGUgIT0gbnVsbCkpIHsKLQkJCQlwcy5wcmludGxuKCJcbioqKiBTdGFjayB0cmFjZSBvZiBjb250YWluZWQgZXhjZXB0aW9uICoqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJKChTV1RFcnJvcikgZGV0YWlsKS50aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHBzKTsKLQkJCX0gZWxzZSBpZiAoKGRldGFpbCBpbnN0YW5jZW9mIFNXVEV4Y2VwdGlvbikgJiYgKCgoU1dURXhjZXB0aW9uKSBkZXRhaWwpLnRocm93YWJsZSAhPSBudWxsKSkgewotCQkJCXBzLnByaW50bG4oIlxuKioqIFN0YWNrIHRyYWNlIG9mIGNvbnRhaW5lZCBleGNlcHRpb24gKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkoKFNXVEV4Y2VwdGlvbikgZGV0YWlsKS50aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHBzKTsKLQkJCX0KLQkJCXBzLmZsdXNoKCk7Ci0JCQliYW9zLmZsdXNoKCk7Ci0JCQl0ZXh0LnNldFRleHQoYmFvcy50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIFRFWFRfTElORV9DT1VOVDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZGV0YWlsLCBpbnQgZGVmYXVsdEluZGV4LCBib29sZWFuIHNob3dDYW5jZWwpIHsKLQkJU3RyaW5nW10gbGFiZWxzOwotCQlpZiAoZGV0YWlsID09IG51bGwpCi0JCQlsYWJlbHMgPSBzaG93Q2FuY2VsID8gTEFCRUxTX09LX0NBTkNFTCA6IExBQkVMU19PSzsKLQkJZWxzZQotCQkJbGFiZWxzID0gc2hvd0NhbmNlbCA/IExBQkVMU19PS19DQU5DRUxfREVUQUlMUyA6IExBQkVMU19PS19ERVRBSUxTOwotCQlFcnJvckRpYWxvZyBkaWFsb2cgPSBuZXcgRXJyb3JEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIGRldGFpbCwgRVJST1IsIGxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJaWYgKGRldGFpbCAhPSBudWxsKQotCQkJZGlhbG9nLnNldERldGFpbEJ1dHRvbihsYWJlbHMubGVuZ3RoIC0gMSk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0JCS8vIGNyZWF0ZSBpbWFnZQotCQlJbWFnZSBpbWFnZSA9IGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCAwKTsKLQkJCWltYWdlLnNldEJhY2tncm91bmQobGFiZWwuZ2V0QmFja2dyb3VuZCgpKTsKLQkJCWxhYmVsLnNldEltYWdlKGltYWdlKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCX0KLQkJLy8gY3JlYXRlIG1lc3NhZ2UKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJbGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJfQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXhlY3V0aW9uTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXhlY3V0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjNzc4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0V4ZWN1dGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEV4ZWN1dGlvbkxpc3RlbmVyCi17Ci0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHVuZG9FeGVjdXRlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0dlbmVyaWNXaXphcmROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0dlbmVyaWNXaXphcmROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzY5YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9HZW5lcmljV2l6YXJkTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY1dpemFyZE5vZGUgaW1wbGVtZW50cyBJV2l6YXJkTm9kZSB7Ci0KLQlwcm90ZWN0ZWQgSVdpemFyZCB3aXphcmQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgR2VuZXJpY1dpemFyZE5vZGUuCi0JICovCi0JcHVibGljIEdlbmVyaWNXaXphcmROb2RlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBJV2l6YXJkTm9kZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAod2l6YXJkICE9IG51bGwpCi0JCQl3aXphcmQuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJV2l6YXJkTm9kZSNnZXRDb250ZW50cygpCi0JICovCi0JcHVibGljIFBvaW50IGdldENvbnRlbnRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSVdpemFyZCBnZXRXaXphcmQoKSB7Ci0JCWlmICh3aXphcmQgPT0gbnVsbCkKLQkJCXdpemFyZCA9IGNyZWF0ZVdpemFyZCgpOwotCQlyZXR1cm4gd2l6YXJkOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0byBjcmVhdGUgdGhlIHdpemFyZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJV2l6YXJkIGNyZWF0ZVdpemFyZCgpOwotCi0JLyoKLQkgKiBAc2VlIElXaXphcmROb2RlI2lzQ29udGVudENyZWF0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGVudENyZWF0ZWQoKSB7Ci0JCXJldHVybiB3aXphcmQgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkTm9kZSNnZXRFeHRlbnQoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRFeHRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9JbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmI2ZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9JbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfcHJvamVjdENvbnRlbnRzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV91c2VEZWZhdWx0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9sb2NhdGlvbkxhYmVsOwotCi0KLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDM4YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0TWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDUsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciBkZmhvbHQKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TWVzc2FnZURpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByb3RlY3RlZCBTdHJpbmdbXSBsaXN0SXRlbXM7Ci0JcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotCS8qKgotCSAqIEVKQlNlbGVjdGl2ZUltcG9ydERpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0JICogQHBhcmFtIGRpYWxvZ01lc3NhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nSW1hZ2VUeXBlCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTGlzdE1lc3NhZ2VEaWFsb2cob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLCBqYXZhLmxhbmcuU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwgZGlhbG9nSW1hZ2VUeXBlLCBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogTGlzdE1lc3NhZ2VEaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlSW1hZ2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotCSAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpYWxvZ0ltYWdlVHlwZQotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGRpYWxvZ0J1dHRvbkxhYmVscwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIGRlZmF1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIExpc3RNZXNzYWdlRGlhbG9nKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgaW50IGRpYWxvZ0ltYWdlVHlwZSwgamF2YS5sYW5nLlN0cmluZ1tdIGRpYWxvZ0J1dHRvbkxhYmVscywgaW50IGRlZmF1bHRJbmRleCwgU3RyaW5nW10gbmFtZXMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLCBkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJbGlzdEl0ZW1zID0gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgYW4gYXJlYSBvZiB0aGUgZGlhbG9nIHdoaWNoIGFwcGVhcnMgYmVsb3cgdGhlIG1lc3NhZ2UgYW5kCi0JICogYWJvdmUgdGhlIGJ1dHRvbiBiYXIuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uIFN1YmNsYXNzZXMKLQkgKiBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgY3VzdG9tIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBjdXN0b20gYXJlYSBjb250cm9sLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgMCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJaWYgKGxpc3RJdGVtcyAhPSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IExpc3QoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQlsaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsaXN0LnNldEl0ZW1zKGxpc3RJdGVtcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCi0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzaW1wbGUgY29uZmlybSAoT0svQ2FuY2VsKSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHByZXNzZXMgdGhlIE9LIGJ1dHRvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuQ29uZmlybShTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gT0sKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHN0YW5kYXJkIGVycm9yIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBpdGVtcykgewotCQlMaXN0TWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdyBpY29uCi0JCQkJCW1lc3NhZ2UsIEVSUk9SLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gb2sgaXMgdGhlCi0JCS8vIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgaW5mb3JtYXRpb24gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmZvcm1hdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgSU5GT1JNQVRJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfSwgMCwgaXRlbXMpOwotCQkvLyBvayBpcyB0aGUgZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzaW1wbGUgWWVzL05vIHF1ZXN0aW9uIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgT0sgYnV0dG9uLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5RdWVzdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8geWVzCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzdGFuZGFyZCB3YXJuaW5nIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuV2FybmluZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgV0FSTklORywgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9LCAwLCBpdGVtcyk7IC8vIG9rIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0ZW5lckxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTGlzdGVuZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzJlYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0ZW5lckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckxpc3QgewotCXByaXZhdGUgZmluYWwgc3RhdGljIEFjdGlvbkxpc3RlbmVyW10gTlVMTF9BUlJBWSA9IG5ldyBBY3Rpb25MaXN0ZW5lclswXTsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IEFjdGlvbkxpc3RlbmVyW10gbGlzdGVuZXJMaXN0ID0gTlVMTF9BUlJBWTsKLQotCS8qKgotCSAqIEFkZCB0aGUgbGlzdGVuZXIgYXMgYSBsaXN0ZW5lciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHQKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZAotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEFjdGlvbkxpc3RlbmVyIGwpIHsKLQkJaWYgKGwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGxpc3RlbmVyTGlzdCA9PSBOVUxMX0FSUkFZKSB7Ci0JCQkvLyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBsaXN0ZW5lciBhZGRlZCwKLQkJCS8vIGluaXRpYWxpemUgdGhlIGxpc3RzCi0JCQlsaXN0ZW5lckxpc3QgPSBuZXcgQWN0aW9uTGlzdGVuZXJbXXtsfTsKLQkJfSBlbHNlIHsKLQkJCS8vIE90aGVyd2lzZSBjb3B5IHRoZSBhcnJheSBhbmQgYWRkIHRoZSBuZXcgbGlzdGVuZXIKLQkJCWludCBpID0gbGlzdGVuZXJMaXN0Lmxlbmd0aDsKLQkJCUFjdGlvbkxpc3RlbmVyW10gdG1wID0gbmV3IEFjdGlvbkxpc3RlbmVyW2kgKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJMaXN0LCAwLCB0bXAsIDAsIGkpOwotCi0JCQl0bXBbaSArIDFdID0gbDsKLQotCQkJbGlzdGVuZXJMaXN0ID0gdG1wOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgbGlzdGVuZXJzIGZvciB0aGlzIGxpc3RlbmVybGlzdAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGlzdGVuZXJDb3VudCgpIHsKLQkJcmV0dXJuIGxpc3RlbmVyTGlzdC5sZW5ndGg7Ci0JfQotCi0JcHVibGljIEFjdGlvbkxpc3RlbmVyW10gZ2V0TGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbGlzdGVuZXJMaXN0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAobCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVyTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgewotCQkJaWYgKGxpc3RlbmVyTGlzdFtpXS5lcXVhbHMobCkpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQlBY3Rpb25MaXN0ZW5lcltdIHRtcCA9IG5ldyBBY3Rpb25MaXN0ZW5lcltsaXN0ZW5lckxpc3QubGVuZ3RoIC0gMV07Ci0JCQkvLyBDb3B5IHRoZSBsaXN0IHVwIHRvIGluZGV4Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVyTGlzdCwgMCwgdG1wLCAwLCBpbmRleCk7Ci0JCQkvLyBDb3B5IGZyb20gdHdvIHBhc3QgdGhlIGluZGV4LCB1cCB0bwotCQkJLy8gdGhlIGVuZCBvZiB0bXAgKHdoaWNoIGlzIHR3byBlbGVtZW50cwotCQkJLy8gc2hvcnRlciB0aGFuIHRoZSBvbGQgbGlzdCkKLQkJCWlmIChpbmRleCA8IHRtcC5sZW5ndGgpCi0JCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lckxpc3QsIGluZGV4ICsgMSwgdG1wLCBpbmRleCwgdG1wLmxlbmd0aCAtIGluZGV4KTsKLQkJCS8vIHNldCB0aGUgbGlzdGVuZXIgYXJyYXkgdG8gdGhlIG5ldyBhcnJheSBvciBudWxsCi0JCQlsaXN0ZW5lckxpc3QgPSAodG1wLmxlbmd0aCA9PSAwKSA/IE5VTExfQVJSQVkgOiB0bXA7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9OZXdQcm9qZWN0R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTmV3UHJvamVjdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjMzZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9OZXdQcm9qZWN0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldzsKLQotcHVibGljIGNsYXNzIE5ld1Byb2plY3RHcm91cCBpbXBsZW1lbnRzIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3IHsKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHVibGljIFRleHQgcHJvamVjdE5hbWVGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgbG9jYXRpb25QYXRoRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uID0gbnVsbDsKLQkvLyBjb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JLy8gZGVmYXVsdCB2YWx1ZXMKLQlwcml2YXRlIFN0cmluZyBkZWZQcm9qZWN0TmFtZUxhYmVsID0gV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuTmFtZV87Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5Ccm93c2VfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZEaXJEaWFsb2dMYWJlbCA9ICJEaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCi0JcHVibGljIE5ld1Byb2plY3RHcm91cChDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJc3luY2hIZWxwZXIgPSBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIobW9kZWwpOwotCQlidWlsZENvbXBvc2l0ZXMocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbnRyb2xzIHdpdGhpbiB0aGlzIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZVByb2plY3ROYW1lR3JvdXAocGFyZW50KTsKLQkJY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAocGFyZW50KTsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRGb2N1cygpOwotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJLy8gcHJvamVjdCBzcGVjaWZpY2F0aW9uIGdyb3VwCi0JCUNvbXBvc2l0ZSBwcm9qZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcHJvamVjdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gbmV3IHByb2plY3QgbGFiZWwKLQkJTGFiZWwgcHJvamVjdExhYmVsID0gbmV3IExhYmVsKHByb2plY3RHcm91cCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TGFiZWwuc2V0Rm9udChmb250KTsKLQkJcHJvamVjdExhYmVsLnNldFRleHQoZGVmUHJvamVjdE5hbWVMYWJlbCk7Ci0KLQkJLy8gbmV3IHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotCQlwcm9qZWN0TmFtZUZpZWxkID0gbmV3IFRleHQocHJvamVjdEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlwcm9qZWN0TmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0Rm9udChmb250KTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHByb2plY3ROYW1lRmllbGQsIFBST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtwcm9qZWN0TGFiZWx9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwcm9qZWN0IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gY29udHJvbHMuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0JCS8vIHByb2plY3Qgc3BlY2lmaWNhdGlvbiBncm91cAotCQlHcm91cCBwcm9qZWN0R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXByb2plY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvamVjdEdyb3VwLnNldEZvbnQoZm9udCk7Ci0JCXByb2plY3RHcm91cC5zZXRUZXh0KEludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0Q29udGVudHNMYWJlbCk7Ci0KLQkJZmluYWwgQnV0dG9uIHVzZURlZmF1bHRzQnV0dG9uID0gbmV3IEJ1dHRvbihwcm9qZWN0R3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5SSUdIVCk7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldFRleHQoSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3VzZURlZmF1bHRMYWJlbCk7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3godXNlRGVmYXVsdHNCdXR0b24sIFVTRV9ERUZBVUxUX0xPQ0FUSU9OLCBudWxsKTsKLQotCQlHcmlkRGF0YSBidXR0b25EYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ1dHRvbkRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VEZWZhdWx0c0J1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGEpOwotCi0JCWNyZWF0ZVVzZXJTcGVjaWZpZWRQcm9qZWN0TG9jYXRpb25Hcm91cChwcm9qZWN0R3JvdXApOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVVc2VyU3BlY2lmaWVkUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHByb2plY3RHcm91cCkgewotCQlGb250IGZvbnQgPSBwcm9qZWN0R3JvdXAuZ2V0Rm9udCgpOwotCQkvLyBsb2NhdGlvbiBsYWJlbAotCQlmaW5hbCBMYWJlbCBsb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKHByb2plY3RHcm91cCwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkxhYmVsLnNldEZvbnQoZm9udCk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0VGV4dChJbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfbG9jYXRpb25MYWJlbCk7Ci0KLQkJLy8gcHJvamVjdCBsb2NhdGlvbiBlbnRyeSBmaWVsZAotCQlsb2NhdGlvblBhdGhGaWVsZCA9IG5ldyBUZXh0KHByb2plY3RHcm91cCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJbG9jYXRpb25QYXRoRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbG9jYXRpb25QYXRoRmllbGQuc2V0Rm9udChmb250KTsKLQotCQkvLyBicm93c2UgYnV0dG9uCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocHJvamVjdEdyb3VwLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRGb250KGZvbnQpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIElEYXRhTW9kZWwgbG9jYWxNb2RlbCA9IG1vZGVsOwotCi0JCWNsYXNzIExvY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgSURhdGFNb2RlbExpc3RlbmVyIHsKLQkJCXByaXZhdGUgYm9vbGVhbiB0eXBpbmcgPSBmYWxzZTsKLQotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFsb2NhbE1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXR5cGluZyA9IHRydWU7Ci0JCQkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KFVTRVJfREVGSU5FRF9MT0NBVElPTiwgbG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXR5cGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlib29sZWFuIHVzZURlZmF1bHQgPSBsb2NhbE1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTik7Ci0JCQkJaWYgKFVTRV9ERUZBVUxUX0xPQ0FUSU9OLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJbG9jYXRpb25MYWJlbC5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJCQkJbG9jYXRpb25QYXRoRmllbGQuc2V0RW5hYmxlZCghdXNlRGVmYXVsdCk7Ci0JCQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJCQkJaWYgKHVzZURlZmF1bHQpIHsKLQkJCQkJCWxvY2F0aW9uUGF0aEZpZWxkLnNldFRleHQobG9jYWxNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERUZBVUxUX0xPQ0FUSU9OKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KGxvY2FsTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCF0eXBpbmcpIHsKLQkJCQkJaWYgKCh1c2VEZWZhdWx0ICYmIERFRkFVTFRfTE9DQVRJT04uZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgfHwgKCF1c2VEZWZhdWx0ICYmIFVTRVJfREVGSU5FRF9MT0NBVElPTi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSkgewotCQkJCQkJbG9jYXRpb25QYXRoRmllbGQuc2V0VGV4dCgoU3RyaW5nKSBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lcigpOwotCi0JCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChuZXcgRGF0YU1vZGVsRXZlbnQobW9kZWwsIFVTRV9ERUZBVUxUX0xPQ0FUSU9OLCBJRGF0YU1vZGVsLlZBTFVFX0NIRykpOwotCi0JCWxvY2F0aW9uUGF0aEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJbW9kZWwuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGxvY2F0aW9uUGF0aEZpZWxkLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShkZWZEaXJEaWFsb2dMYWJlbCk7Ci0JCVN0cmluZyBkaXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKTsKLQkJaWYgKGRpck5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWRpck5hbWUgPSBuZXcgUGF0aChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERUZBVUxUX0xPQ0FUSU9OKSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvT1NTdHJpbmcoKTsKLQkJfQotCi0JCWlmICgoZGlyTmFtZSAhPSBudWxsKSAmJiAoZGlyTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkgewotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShVU0VSX0RFRklORURfTE9DQVRJT04sIHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHN5bmNoSGVscGVyKTsKLQkJc3luY2hIZWxwZXIuZGlzcG9zZSgpOwotCQltb2RlbCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9PdmVybGF5SWNvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9PdmVybGF5SWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmY3YjBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvT3ZlcmxheUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi1wdWJsaWMgY2xhc3MgT3ZlcmxheUljb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3IgewotCS8vIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAxNjsKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gMTY7Ci0JcHJpdmF0ZSBQb2ludCBmU2l6ZSA9IG51bGw7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZkJhc2U7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZk92ZXJsYXlzW11bXTsKLQotCXB1YmxpYyBPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3IgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cykgewotCQlmQmFzZSA9IGJhc2U7Ci0JCWlmIChmQmFzZSA9PSBudWxsKQotCQkJZkJhc2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJZlNpemUgPSBuZXcgUG9pbnQoREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQpOwotCX0KLQotCXB1YmxpYyBPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3IgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cywgUG9pbnQgc2l6ZSkgewotCQlmQmFzZSA9IGJhc2U7Ci0JCWlmIChmQmFzZSA9PSBudWxsKQotCQkJZkJhc2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJZlNpemUgPSBzaXplOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21MZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCWlmIChvdmVybGF5cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueSAtIGlkLmhlaWdodCk7Ci0JCQkJeCArPSBpZC53aWR0aDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21SaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSBnZXRTaXplKCkueDsKLQkJZm9yIChpbnQgaSA9IDI7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJeCAtPSBpZC53aWR0aDsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnID0gZkJhc2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWRyYXdJbWFnZShiZywgMCwgMCk7Ci0KLQkJaWYgKGZPdmVybGF5cyAhPSBudWxsKSB7Ci0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDApCi0JCQkJZHJhd1RvcFJpZ2h0KGZPdmVybGF5c1swXSk7Ci0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMSkKLQkJCQlkcmF3Qm90dG9tUmlnaHQoZk92ZXJsYXlzWzFdKTsKLQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAyKQotCQkJCWRyYXdCb3R0b21MZWZ0KGZPdmVybGF5c1syXSk7Ci0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMykKLQkJCQlkcmF3VG9wTGVmdChmT3ZlcmxheXNbM10pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIDApOwotCQkJCXggKz0gaWQud2lkdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCWZvciAoaW50IGkgPSAyOyBpID49IDA7IGktLSkgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCXggLT0gaWQud2lkdGg7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZlNpemU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9QYWdlR3JvdXBNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1BhZ2VHcm91cE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNzU4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1BhZ2VHcm91cE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkNvbW1vblVJUGx1Z2luQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgUGFnZUdyb3VwTWFuYWdlciB7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gcm9vdE9wZXJhdGlvbjsKLQlwcml2YXRlIElETVBhZ2VHcm91cCByb290UGFnZUdyb3VwOwotCXByaXZhdGUgSGFzaE1hcCBncm91cFRhYmxlOwotCXByaXZhdGUgSGFzaFNldCBvcGVyYXRpb25zUnVuOwotCXByaXZhdGUgU3RhY2sgcGFnZUdyb3VwU3RhY2s7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQlwcml2YXRlIFN0YWNrRW50cnkgc2F2ZWRUb3BFbnRyeTsKLQlwcml2YXRlIGludCBzYXZlZFN0YWNrU2l6ZTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHM7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBR0VfR1JPVVAgPSAid2l6YXJkUGFnZUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgcGF1c2VBZnRlckV4ZWN1dGlvbiA9IG51bGw7Ci0KLQlwdWJsaWMgUGFnZUdyb3VwTWFuYWdlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCwgSURNUGFnZUdyb3VwIHJvb3RQYWdlR3JvdXApIHsKLQotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQkJdGhpcy5ncm91cFRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQkJdGhpcy5wYWdlR3JvdXBTdGFjayA9IG5ldyBTdGFjaygpOwotCQl0aGlzLnJvb3RQYWdlR3JvdXAgPSByb290UGFnZUdyb3VwOwotCi0KLQkJUGFnZUdyb3VwRW50cnkgcm9vdFBhZ2VHcm91cEVudHJ5ID0gbmV3IFBhZ2VHcm91cEVudHJ5KHJvb3RQYWdlR3JvdXApOwotCQllbGVtZW50cyA9IGdldFBhZ2VHcm91cEV4dGVuc2lvbnMoKTsKLQkJZ3JvdXBUYWJsZS5wdXQodGhpcy5yb290UGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCksIHJvb3RQYWdlR3JvdXBFbnRyeSk7Ci0KLQkJaWYgKHRoaXMucm9vdFBhZ2VHcm91cC5nZXRBbGxvd3NFeHRlbmRlZFBhZ2VzKCkpIHsKLQkJCS8vIEZpbmQgYWxsIHRoZSBwYWdlIGdyb3VwcyB0aGF0IGZvbGxvdyB0aGlzIHJvb3QgcGFnZSBncm91cC4KLQkJCWxvYWRFeHRlbmRlZFBhZ2VzKHJvb3RQYWdlR3JvdXApOwotCQl9Ci0JfQotCi0JcHVibGljIFBhZ2VHcm91cE1hbmFnZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIHJvb3RPcGVyYXRpb24sIElETVBhZ2VHcm91cCByb290UGFnZUdyb3VwKSB7Ci0JCXRoaXMocm9vdE9wZXJhdGlvbi5nZXREYXRhTW9kZWwoKSwgcm9vdFBhZ2VHcm91cCk7Ci0JCXRoaXMub3BlcmF0aW9uc1J1biA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcm9vdE9wZXJhdGlvbi5hZGRPcGVyYXRpb25MaXN0ZW5lcihuZXcgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgaW50IG5vdGlmeShJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudCBldmVudCkgewotCQkJCXN3aXRjaCAoZXZlbnQuZ2V0RXhlY3V0aW9uVHlwZSgpKSB7Ci0JCQkJCWNhc2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUk9MTEJBQ0sgOgotCQkJCQkJaWYgKGV2ZW50LmdldE9wZXJhdGlvblR5cGUoKSA9PSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX0ZJTklTSEVEKSB7Ci0JCQkJCQkJb3BlcmF0aW9uc1J1bi5yZW1vdmUoZXZlbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0SUQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFIDoKLQkJCQkJCWlmIChldmVudC5nZXRPcGVyYXRpb25UeXBlKCkgPT0gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9GSU5JU0hFRCkgewotCQkJCQkJCW9wZXJhdGlvbnNSdW4uYWRkKGV2ZW50LmdldE9wZXJhdGlvbigpLmdldElEKCkpOwotCQkJCQkJCWlmIChudWxsICE9IHBhdXNlQWZ0ZXJFeGVjdXRpb24gJiYgZXZlbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0SUQoKS5lcXVhbHMocGF1c2VBZnRlckV4ZWN1dGlvbikpIHsKLQkJCQkJCQkJcmV0dXJuIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXR1cm4gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUU7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEdyb3VwQWZ0ZXIoU3RyaW5nIHBhZ2VHcm91cElELCBJRE1QYWdlR3JvdXAgcGFnZUluc2VydEdyb3VwKSB7Ci0JCVBhZ2VHcm91cEVudHJ5IHBhZ2VHcm91cEVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBncm91cFRhYmxlLmdldChwYWdlR3JvdXBJRCk7Ci0KLQkJaWYgKHBhZ2VHcm91cEVudHJ5LnBhZ2VHcm91cC5nZXRBbGxvd3NFeHRlbmRlZFBhZ2VzKCkpIHsKLQkJCWFkZFBhZ2VHcm91cChwYWdlR3JvdXBFbnRyeS5wYWdlR3JvdXAsIHBhZ2VJbnNlcnRHcm91cCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRm9yd2FyZE9uZVBhZ2UoKSB7Ci0JCWJvb2xlYW4gcGFnZUZvdW5kID0gZmFsc2U7Ci0KLQkJaWYgKHBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCVBhZ2VHcm91cEVudHJ5IHJvb3RFbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgZ3JvdXBUYWJsZS5nZXQocm9vdFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJCXBhZ2VHcm91cFN0YWNrLnB1c2gobmV3IFN0YWNrRW50cnkocm9vdEVudHJ5LCAtMSkpOwotCQl9Ci0KLQkJc2F2ZVN0YWNrSW5mbygpOwotCi0JCXRyeSB7Ci0JCQlwYWdlRm91bmQgPSBmaW5kTmV4dFBhZ2UodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGMpOwotCQkJaWYgKHJvb3RPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJvb3RPcGVyYXRpb24ucm9sbEJhY2sobnVsbCwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJCXBhZ2VGb3VuZCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKHBhZ2VGb3VuZCA9PSBmYWxzZSkgewotCQkJLy8gSWYgd2UgbW92ZWQgZm9yd2FyZCBhbmQgdGhlcmUgd2Fzbid0IGEgcGFnZSB0aGVuIHdlIHdpbGwgcmVzdG9yZSB0aGUgc3RhY2suCi0JCQkvLyBOb3JtYWxseSwgdGhpcyB3b3VsZG4ndCBoYXBwZW4gc2luY2UgYSBjYWxsIHRvIGhhc05leHRQYWdlIHdvdWxkIGhhdmUgaW5kaWNhdGVkCi0JCQkvLyB0aGF0IHRoZXJlIHdhc24ndCBhIHBhZ2UuCi0JCQlyZXN0b3JlU3RhY2tJbmZvKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQmFja09uZVBhZ2UoKSB7Ci0JCWlmIChwYWdlR3JvdXBTdGFjay5lbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCVN0YWNrRW50cnkgdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgcGFnZUdyb3VwU3RhY2sucGVlaygpOwotCi0JCS8vIFBvcCB0aGUgbGFzdCBwYWdlLgotCQlpZiAoIXRvcEVudHJ5LnBhZ2VzUmV0dXJuZWQuZW1wdHkoKSkKLQkJCXRvcEVudHJ5LnBhZ2VzUmV0dXJuZWQucG9wKCk7Ci0KLQkJLy8gTm93IGZpbmQgdGhlIHByZXZpb3VzIHBhZ2UuCi0JCWJvb2xlYW4gZm91bmRQcmV2aW91c1BhZ2UgPSBmaW5kUHJldmlvdXNQYWdlSW5Hcm91cCgpOwotCi0JCXdoaWxlICghZm91bmRQcmV2aW91c1BhZ2UgJiYgIXBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCWlmIChyb290T3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAodG9wRW50cnkucmFuT3BlcmF0aW9ucykgewotCQkJCQl0cnkgewotCQkJCQkJcm9vdE9wZXJhdGlvbi5yb2xsQmFjayhudWxsLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcGFnZUdyb3VwU3RhY2sucG9wKCk7Ci0KLQkJCWlmICghcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJCWZvdW5kUHJldmlvdXNQYWdlID0gZmluZFByZXZpb3VzUGFnZUluR3JvdXAoKTsKLQkJCQl0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJcGFnZUdyb3VwU3RhY2suY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0Q3VycmVudFBhZ2UoKSB7Ci0JCUlXaXphcmRQYWdlIHBhZ2UgPSBudWxsOwotCi0JCWlmICghcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0JCQlpbnQgcGFnZUluZGV4ID0gdG9wRW50cnkuZ2V0VG9wUGFnZUluZGV4KCk7Ci0KLQkJCXBhZ2UgPSBwYWdlSW5kZXggPT0gLTEgPyBudWxsIDogKElXaXphcmRQYWdlKSB0b3BFbnRyeS5wYWdlR3JvdXBFbnRyeS5nZXRQYWdlcygpLmdldChwYWdlSW5kZXgpOwotCQl9Ci0KLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGhhc011bGl0cGxlUGFnZXM7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNdWx0aXBsZVBhZ2VzKCkgewotCQlpZiAobnVsbCA9PSBoYXNNdWxpdHBsZVBhZ2VzKSB7Ci0JCQlpbnQgcGFnZUNvdW50ID0gMDsKLQkJCVBhZ2VHcm91cEVudHJ5IHJvb3RFbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgZ3JvdXBUYWJsZS5nZXQocm9vdFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJCXBhZ2VDb3VudCArPSByb290RW50cnkuZ2V0UGFnZXMoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgcGFnZUNvdW50IDwgMiAmJiBpIDwgcm9vdEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuc2l6ZSgpOyBpKyspIHsKLQkJCQlwYWdlQ291bnQgKz0gKChQYWdlR3JvdXBFbnRyeSkgcm9vdEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuZ2V0KGkpKS5nZXRQYWdlcygpLnNpemUoKTsKLQkJCX0KLQkJCWhhc011bGl0cGxlUGFnZXMgPSBwYWdlQ291bnQgPiAxID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gaGFzTXVsaXRwbGVQYWdlcy5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0UGFnZSgpIHsKLQkJYm9vbGVhbiBwYWdlRm91bmQgPSBmYWxzZTsKLQotCQlzYXZlU3RhY2tJbmZvKCk7Ci0KLQkJaWYgKHBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCVBhZ2VHcm91cEVudHJ5IHJvb3RFbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgZ3JvdXBUYWJsZS5nZXQocm9vdFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJCXBhZ2VHcm91cFN0YWNrLnB1c2gobmV3IFN0YWNrRW50cnkocm9vdEVudHJ5LCAtMSkpOwotCQl9Ci0KLQkJcGFnZUZvdW5kID0gZmluZE5leHRQYWdlKGZhbHNlKTsKLQkJcmVzdG9yZVN0YWNrSW5mbygpOwotCi0JCXJldHVybiBwYWdlRm91bmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kb0FsbEN1cnJlbnRPcGVyYXRpb25zKCkgewotCQl3aGlsZSAoIXBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCW1vdmVCYWNrT25lUGFnZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0UGFnZUdyb3VwRXh0ZW5zaW9ucygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KENvbW1vblVJUGx1Z2luQ29uc3RhbnRzLlBMVUdJTl9JRCwgRUxFTUVOVF9QQUdFX0dST1VQKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYWxsRWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBhbGxFbGVtZW50c1tpXTsKLQkJCWlmIChFTEVNRU5UX1BBR0VfR1JPVVAuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pIHJlc3VsdC50b0FycmF5KG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB7IH0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmaW5kUHJldmlvdXNQYWdlSW5Hcm91cCgpIHsKLQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0JCWJvb2xlYW4gcGFnZUZvdW5kID0gZmFsc2U7Ci0KLQkJaWYgKCF0b3BFbnRyeS5wYWdlc1JldHVybmVkLmVtcHR5KCkpIHsKLQkJCXRvcEVudHJ5LnBhZ2VzQ29tcGxldGUgPSBmYWxzZTsKLQkJCXBhZ2VGb3VuZCA9IHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gcGFnZUZvdW5kOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmaW5kTmV4dFBhZ2UoYm9vbGVhbiBydW5PcGVyYXRpb25zKSB7Ci0JCVN0YWNrRW50cnkgdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgcGFnZUdyb3VwU3RhY2sucGVlaygpOwotCQlpbnQgbmV3UGFnZUluZGV4ID0gdG9wRW50cnkuZmluZE5leHRQYWdlSW5kZXgoKTsKLQkJYm9vbGVhbiBwYWdlRm91bmQgPSBmYWxzZTsKLQotCQlpZiAobmV3UGFnZUluZGV4ID09IC0xKSB7Ci0JCQkvLyBPdXIgcGFnZSBoYW5kbGVyIGRpZG4ndCBmaW5kIGEgcGFnZSBzbyB3ZSB3aWxsIHNlZSBpZiB0aGVyZSBpcyBhIHBhZ2UgZ3JvdXAgdGhhdAotCQkJLy8gZm9sbG93cyB0aGlzIHBhZ2UgZ3JvdXAgdGhhdCBjYW4gZmluZCBhIHBhZ2UuCi0JCQl0b3BFbnRyeS5wYWdlc0NvbXBsZXRlID0gdHJ1ZTsKLQotCQkJU3RhY2tFbnRyeSBuZXh0U3RhY2tFbnRyeSA9IGZpbmROZXh0UGFnZUdyb3VwKHBhZ2VHcm91cFN0YWNrKTsKLQotCQkJaWYgKG5leHRTdGFja0VudHJ5ICE9IG51bGwpIHsKLQkJCQlJRE1QYWdlR3JvdXAgcGFnZUdyb3VwID0gbmV4dFN0YWNrRW50cnkucGFnZUdyb3VwRW50cnkucGFnZUdyb3VwOwotCQkJCVN0cmluZyByZXF1aXJlc09wZXJhdGlvbnNJZCA9IHBhZ2VHcm91cC5nZXRSZXF1aXJlZERhdGFPcGVyYXRpb25Ub1J1bigpOwotCi0JCQkJLy8gSWYgdGhpcyBncm91cCByZXF1aXJlcyBhbiBvcGVyYXRpb24gYW5kIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIHJ1bgotCQkJCS8vIHRoZW4gd2UgbmVlZCB0byBydW4gaXQuCi0JCQkJaWYgKHJvb3RPcGVyYXRpb24gIT0gbnVsbCAmJiBydW5PcGVyYXRpb25zICYmIHJlcXVpcmVzT3BlcmF0aW9uc0lkICE9IG51bGwgJiYgIW9wZXJhdGlvbnNSdW4uY29udGFpbnMocmVxdWlyZXNPcGVyYXRpb25zSWQpKSB7Ci0JCQkJCXBhdXNlQWZ0ZXJFeGVjdXRpb24gPSByZXF1aXJlc09wZXJhdGlvbnNJZDsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJc3RhdHVzID0gcm9vdE9wZXJhdGlvbi5yZXN1bWUobnVsbCwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQkJbmV4dFN0YWNrRW50cnkucmFuT3BlcmF0aW9ucyA9IHRydWU7Ci0KLQkJCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJCS8vIFRPRE8gbmVlZCBhIGJldHRlciBlcnJvciBmZWVkYmFjayBtZWNoYW5pc20gaGVyZS4KLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwYWdlR3JvdXBTdGFjay5wdXNoKG5leHRTdGFja0VudHJ5KTsKLQkJCQlwYWdlRm91bmQgPSBmaW5kTmV4dFBhZ2UocnVuT3BlcmF0aW9ucyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBXZSBmb3VuZCBhIG5ldyBwYWdlIGluIHRoZSBwYWdlIGhhbmRsZXIuCi0JCQlwYWdlRm91bmQgPSB0cnVlOwotCQkJdG9wRW50cnkucGFnZXNSZXR1cm5lZC5wdXNoKG5ldyBJbnRlZ2VyKG5ld1BhZ2VJbmRleCkpOwotCQl9Ci0KLQkJcmV0dXJuIHBhZ2VGb3VuZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZVN0YWNrSW5mbygpIHsKLQkJaWYgKCFwYWdlR3JvdXBTdGFjay5lbXB0eSgpKSB7Ci0JCQlzYXZlZFRvcEVudHJ5ID0gbmV3IFN0YWNrRW50cnkoKFN0YWNrRW50cnkpIHBhZ2VHcm91cFN0YWNrLnBlZWsoKSk7Ci0JCX0KLQkJc2F2ZWRTdGFja1NpemUgPSBwYWdlR3JvdXBTdGFjay5zaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVTdGFja0luZm8oKSB7Ci0JCWlmIChzYXZlZFN0YWNrU2l6ZSA9PSAwKSB7Ci0JCQlwYWdlR3JvdXBTdGFjay5yZW1vdmVBbGxFbGVtZW50cygpOwotCQl9IGVsc2UgewotCQkJcGFnZUdyb3VwU3RhY2suc2V0U2l6ZShzYXZlZFN0YWNrU2l6ZSAtIDEpOwotCQkJcGFnZUdyb3VwU3RhY2sucHVzaChzYXZlZFRvcEVudHJ5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRXh0ZW5kZWRQYWdlcyhJRE1QYWdlR3JvdXAgcGFnZUdyb3VwKSB7Ci0JCVN0cmluZyB3aXphcmRJZCA9IHJvb3RQYWdlR3JvdXAuZ2V0V2l6YXJkSUQoKTsKLQkJU3RyaW5nIHBhZ2VHcm91cElkID0gcGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCk7Ci0JCWludCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewotCQkJRE1QYWdlR3JvdXBFbGVtZW50SW1wbCBwYWdlSW5zZXJ0R3JvdXAgPSBuZXcgRE1QYWdlR3JvdXBFbGVtZW50SW1wbChlbGVtZW50c1tpbmRleF0pOwotCQkJU3RyaW5nIHBhZ2VJbnNlcnRHcm91cElkID0gcGFnZUluc2VydEdyb3VwLmdldFBhZ2VHcm91cEluc2VydGlvbklEKCk7Ci0JCQlpZiAocGFnZUluc2VydEdyb3VwLmdldFdpemFyZElEKCkuZXF1YWxzKHdpemFyZElkKSAmJiAobnVsbCA9PSBwYWdlSW5zZXJ0R3JvdXBJZCB8fCBwYWdlSW5zZXJ0R3JvdXBJZC5lcXVhbHMocGFnZUdyb3VwSWQpKSkgewotCQkJCWFkZFBhZ2VHcm91cChwYWdlR3JvdXAsIHBhZ2VJbnNlcnRHcm91cCk7Ci0KLQkJCQkvLyBJZiB0aGlzIHBhZ2UgZ3JvdXAgaGFzIHBhZ2UgdGhlbiBhZGQgdGhlbQotCQkJCWlmIChwYWdlSW5zZXJ0R3JvdXAuZ2V0QWxsb3dzRXh0ZW5kZWRQYWdlcygpKSB7Ci0JCQkJCWxvYWRFeHRlbmRlZFBhZ2VzKHBhZ2VJbnNlcnRHcm91cCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBhZ2VHcm91cChJRE1QYWdlR3JvdXAgcGFnZUdyb3VwLCBJRE1QYWdlR3JvdXAgaW5zZXJ0ZWRQYWdlR3JvdXApIHsKLQkJUGFnZUdyb3VwRW50cnkgcGFnZUdyb3VwRW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIGdyb3VwVGFibGUuZ2V0KHBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJUGFnZUdyb3VwRW50cnkgbmV4dEdyb3VwRW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIGdyb3VwVGFibGUuZ2V0KGluc2VydGVkUGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCkpOwotCi0JCWlmIChwYWdlR3JvdXBFbnRyeSA9PSBudWxsKSB7Ci0JCQlwYWdlR3JvdXBFbnRyeSA9IG5ldyBQYWdlR3JvdXBFbnRyeShwYWdlR3JvdXApOwotCQkJZ3JvdXBUYWJsZS5wdXQocGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCksIHBhZ2VHcm91cEVudHJ5KTsKLQkJfQotCi0JCWlmIChuZXh0R3JvdXBFbnRyeSA9PSBudWxsKSB7Ci0JCQluZXh0R3JvdXBFbnRyeSA9IG5ldyBQYWdlR3JvdXBFbnRyeShpbnNlcnRlZFBhZ2VHcm91cCk7Ci0JCQlncm91cFRhYmxlLnB1dChpbnNlcnRlZFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpLCBuZXh0R3JvdXBFbnRyeSk7Ci0JCX0KLQotCQlwYWdlR3JvdXBFbnRyeS5ncm91cHNUaGF0Rm9sbG93LmFkZChuZXh0R3JvdXBFbnRyeSk7Ci0JfQotCi0JcHVibGljIFN0YWNrRW50cnkgZmluZE5leHRQYWdlR3JvdXAoU3RhY2sgc3RhY2spIHsKLQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBzdGFjay5wZWVrKCk7Ci0JCVBhZ2VHcm91cEVudHJ5IG5leHRQYWdlR3JvdXAgPSB0b3BFbnRyeS5nZXROZXh0UGFnZUdyb3VwKG51bGwpOwotCQlpbnQgcGFyZW50SW5kZXggPSB0b3BFbnRyeS5wYXJlbnRHcm91cEluZGV4OwotCQlpbnQgcHJldlBhcmVudEluZGV4ID0gc3RhY2suc2l6ZSgpIC0gMTsKLQotCQkvLyBSZWN1cnNlIHVwIHRocm91Z2ggdGhlIHBhcmVudHMgdG8gZmluZCB0aGUgbmV4dCBncm91cCBpZiBuZWVkZWQuCi0JCXdoaWxlIChwYXJlbnRJbmRleCAhPSAtMSAmJiBuZXh0UGFnZUdyb3VwID09IG51bGwpIHsKLQkJCVN0YWNrRW50cnkgcGFyZW50U3RhY2tFbnRyeSA9IChTdGFja0VudHJ5KSBzdGFjay5lbGVtZW50QXQocGFyZW50SW5kZXgpOwotCi0JCQluZXh0UGFnZUdyb3VwID0gcGFyZW50U3RhY2tFbnRyeS5nZXROZXh0UGFnZUdyb3VwKHRvcEVudHJ5LmdldElkKCkpOwotCQkJcHJldlBhcmVudEluZGV4ID0gcGFyZW50SW5kZXg7Ci0JCQlwYXJlbnRJbmRleCA9IHBhcmVudFN0YWNrRW50cnkucGFyZW50R3JvdXBJbmRleDsKLQkJCXRvcEVudHJ5ID0gcGFyZW50U3RhY2tFbnRyeTsKLQkJfQotCi0JCXJldHVybiBuZXh0UGFnZUdyb3VwID09IG51bGwgPyBudWxsIDogbmV3IFN0YWNrRW50cnkobmV4dFBhZ2VHcm91cCwgcHJldlBhcmVudEluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFN0YWNrRW50cnkgewotCQlwdWJsaWMgUGFnZUdyb3VwRW50cnkgcGFnZUdyb3VwRW50cnk7Ci0JCXB1YmxpYyBTdGFjayBwYWdlc1JldHVybmVkOyAvLyBFbGVtZW50ID0gSW50ZXJnZXIgb2YgcGFnZSBpbmRleGVzLgotCQlwdWJsaWMgYm9vbGVhbiBwYWdlc0NvbXBsZXRlOwotCQlwdWJsaWMgaW50IHBhcmVudEdyb3VwSW5kZXg7Ci0JCXB1YmxpYyBib29sZWFuIHJhbk9wZXJhdGlvbnM7Ci0KLQkJcHVibGljIFN0YWNrRW50cnkoUGFnZUdyb3VwRW50cnkgbmV3UGFnZUdyb3VwRW50cnksIGludCBwYXJlbnRJbmRleCkgewotCQkJcGFnZUdyb3VwRW50cnkgPSBuZXdQYWdlR3JvdXBFbnRyeTsKLQkJCXBhZ2VzUmV0dXJuZWQgPSBuZXcgU3RhY2soKTsKLQkJCXBhZ2VzQ29tcGxldGUgPSBmYWxzZTsKLQkJCXBhcmVudEdyb3VwSW5kZXggPSBwYXJlbnRJbmRleDsKLQkJCXJhbk9wZXJhdGlvbnMgPSBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBTdGFja0VudHJ5KFN0YWNrRW50cnkgc3RhY2tFbnRyeSkgewotCQkJcGFnZUdyb3VwRW50cnkgPSBzdGFja0VudHJ5LnBhZ2VHcm91cEVudHJ5OwotCQkJcGFnZXNSZXR1cm5lZCA9IG5ldyBTdGFjaygpOwotCQkJcGFnZXNDb21wbGV0ZSA9IHN0YWNrRW50cnkucGFnZXNDb21wbGV0ZTsKLQkJCXBhcmVudEdyb3VwSW5kZXggPSBzdGFja0VudHJ5LnBhcmVudEdyb3VwSW5kZXg7Ci0JCQlyYW5PcGVyYXRpb25zID0gc3RhY2tFbnRyeS5yYW5PcGVyYXRpb25zOwotCQkJcGFnZXNSZXR1cm5lZC5hZGRBbGwoc3RhY2tFbnRyeS5wYWdlc1JldHVybmVkKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gcGFnZUdyb3VwRW50cnkucGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGZpbmROZXh0UGFnZUluZGV4KCkgewotCQkJaW50IHJlc3VsdCA9IC0xOwotCi0JCQlpZiAoIXBhZ2VzQ29tcGxldGUpIHsKLQkJCQlMaXN0IHBhZ2VzID0gcGFnZUdyb3VwRW50cnkuZ2V0UGFnZXMoKTsKLQotCQkJCWludCBwYWdlSW5kZXggPSBnZXRUb3BQYWdlSW5kZXgoKTsKLQkJCQlTdHJpbmcgcGFnZUlkID0gcGFnZUluZGV4ID09IC0xID8gbnVsbCA6ICgoSVdpemFyZFBhZ2UpIHBhZ2VzLmdldChwYWdlSW5kZXgpKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIGV4cGVjdGVkSWQgPSBwYWdlSW5kZXggKyAxID49IHBhZ2VzLnNpemUoKSA/IG51bGwgOiAoKElXaXphcmRQYWdlKSBwYWdlcy5nZXQocGFnZUluZGV4ICsgMSkpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgbmV3UGFnZUlkID0gbnVsbDsKLQotCQkJCXRyeSB7Ci0JCQkJCW5ld1BhZ2VJZCA9IHBhZ2VHcm91cEVudHJ5LmdldFBhZ2VIYW5kbGVyKCkuZ2V0TmV4dFBhZ2UocGFnZUlkLCBleHBlY3RlZElkKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGMpOwotCQkJCX0KLQotCQkJCWlmIChuZXdQYWdlSWQgIT0gbnVsbCAmJiBuZXdQYWdlSWQuZXF1YWxzKElETVBhZ2VIYW5kbGVyLlNLSVBfUEFHRSkgJiYgcGFnZUluZGV4ID49IDAgJiYgcGFnZUluZGV4IDwgcGFnZXMuc2l6ZSgpIC0gMikgewotCQkJCQlyZXN1bHQgPSBwYWdlSW5kZXggKyAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IHBhZ2VHcm91cEVudHJ5LmNoZWNrRm9yU3BlY2lhbElkcyhuZXdQYWdlSWQpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBQYWdlR3JvdXBFbnRyeSBnZXROZXh0UGFnZUdyb3VwKFN0cmluZyBhZnRlcklkKSB7Ci0JCQlQYWdlR3JvdXBFbnRyeSByZXN1bHQgPSBudWxsOwotCQkJU3RyaW5nIG5leHRHcm91cElEID0gbnVsbDsKLQkJCVN0cmluZ1tdIGdyb3VwSURMaXN0ID0gZ2V0R3JvdXBJRExpc3QoKTsKLQotCQkJdHJ5IHsKLQkJCQluZXh0R3JvdXBJRCA9IHBhZ2VHcm91cEVudHJ5LmdldFBhZ2VHcm91cEhhbmRsZXIoKS5nZXROZXh0UGFnZUdyb3VwKGFmdGVySWQsIGdyb3VwSURMaXN0KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXhjKTsKLQkJCX0KLQotCQkJaWYgKG5leHRHcm91cElEICE9IG51bGwpIHsKLQkJCQkvLyBGaW5kIHRoaXMgc3RyaW5nIGluIHRoZSBsaXN0LgotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBncm91cElETGlzdC5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQkJaWYgKGdyb3VwSURMaXN0W2luZGV4XS5lcXVhbHMobmV4dEdyb3VwSUQpKSB7Ci0JCQkJCQlyZXN1bHQgPSAoUGFnZUdyb3VwRW50cnkpIHBhZ2VHcm91cEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuZWxlbWVudEF0KGluZGV4KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmdbXSBnZXRHcm91cElETGlzdCgpIHsKLQkJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbcGFnZUdyb3VwRW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5zaXplKCldOwotCi0JCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcGFnZUdyb3VwRW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5zaXplKCk7IGluZGV4KyspIHsKLQkJCQlQYWdlR3JvdXBFbnRyeSBlbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgcGFnZUdyb3VwRW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5lbGVtZW50QXQoaW5kZXgpOwotCi0JCQkJcmVzdWx0W2luZGV4XSA9IGVudHJ5LnBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZ2V0VG9wUGFnZUluZGV4KCkgewotCQkJcmV0dXJuIHBhZ2VzUmV0dXJuZWQuZW1wdHkoKSA/IC0xIDogKChJbnRlZ2VyKSBwYWdlc1JldHVybmVkLnBlZWsoKSkuaW50VmFsdWUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUGFnZUdyb3VwRW50cnkgewotCQlwdWJsaWMgSURNUGFnZUdyb3VwIHBhZ2VHcm91cDsKLQkJcHVibGljIFZlY3RvciBncm91cHNUaGF0Rm9sbG93OwotCQlwcml2YXRlIElETVBhZ2VIYW5kbGVyIHBhZ2VIYW5kbGVyOwotCQlwcml2YXRlIElETVBhZ2VHcm91cEhhbmRsZXIgcGFnZUdyb3VwSGFuZGxlcjsKLQkJcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOwotCi0JCXB1YmxpYyBQYWdlR3JvdXBFbnRyeShJRE1QYWdlR3JvdXAgbmV3UGFnZUdyb3VwKSB7Ci0JCQlwYWdlR3JvdXAgPSBuZXdQYWdlR3JvdXA7Ci0JCQlncm91cHNUaGF0Rm9sbG93ID0gbmV3IFZlY3RvcigpOwotCQkJaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBnZXRQYWdlSGFuZGxlcigpIHsKLQkJCWlmICghaW5pdGlhbGl6ZWQpCi0JCQkJaW5pdCgpOwotCi0JCQlyZXR1cm4gcGFnZUhhbmRsZXI7Ci0JCX0KLQotCQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBnZXRQYWdlR3JvdXBIYW5kbGVyKCkgewotCQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCQlpbml0KCk7Ci0KLQkJCXJldHVybiBwYWdlR3JvdXBIYW5kbGVyOwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0UGFnZXMoKSB7Ci0JCQlpZiAoIWluaXRpYWxpemVkKQotCQkJCWluaXQoKTsKLQotCQkJcmV0dXJuIHBhZ2VHcm91cC5nZXRQYWdlcyhkYXRhTW9kZWwpOwotCQl9Ci0KLQkJcHVibGljIFBhZ2VHcm91cEVudHJ5KFBhZ2VHcm91cEVudHJ5IG9yaWdpbmFsRW50cnkpIHsKLQkJCXBhZ2VHcm91cCA9IG9yaWdpbmFsRW50cnkucGFnZUdyb3VwOwotCQkJZ3JvdXBzVGhhdEZvbGxvdyA9IG9yaWdpbmFsRW50cnkuZ3JvdXBzVGhhdEZvbGxvdzsKLQkJCXBhZ2VIYW5kbGVyID0gb3JpZ2luYWxFbnRyeS5wYWdlSGFuZGxlcjsKLQkJCXBhZ2VHcm91cEhhbmRsZXIgPSBvcmlnaW5hbEVudHJ5LnBhZ2VHcm91cEhhbmRsZXI7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJCXRyeSB7Ci0JCQkJcGFnZUhhbmRsZXIgPSBwYWdlR3JvdXAuZ2V0UGFnZUhhbmRsZXIoZGF0YU1vZGVsKTsKLQkJCQlwYWdlR3JvdXBIYW5kbGVyID0gcGFnZUdyb3VwLmdldFBhZ2VHcm91cEhhbmRsZXIoZGF0YU1vZGVsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXhjKTsKLQkJCX0KLQotCQkJaWYgKHBhZ2VIYW5kbGVyID09IG51bGwpCi0JCQkJcGFnZUhhbmRsZXIgPSBuZXcgU2ltcGxlUGFnZUhhbmRsZXIoKTsKLQotCQkJaWYgKHBhZ2VHcm91cEhhbmRsZXIgPT0gbnVsbCkKLQkJCQlwYWdlR3JvdXBIYW5kbGVyID0gbmV3IFNpbXBsZVBhZ2VHcm91cEhhbmRsZXIoKTsKLQotCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgY2hlY2tGb3JTcGVjaWFsSWRzKFN0cmluZyBwYWdlSWQpIHsKLQkJCWludCByZXN1bHQgPSAtMTsKLQotCQkJTGlzdCBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0KLQkJCWlmIChwYWdlcy5pc0VtcHR5KCkgfHwgcGFnZUlkID09IG51bGwpCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlpZiAocGFnZUlkLnN0YXJ0c1dpdGgoSURNUGFnZUhhbmRsZXIuUEFHRV9BRlRFUikpIHsKLQkJCQlTdHJpbmcgYWZ0ZXJJRCA9IHBhZ2VJZC5zdWJzdHJpbmcoSURNUGFnZUhhbmRsZXIuUEFHRV9BRlRFUi5sZW5ndGgoKSwgcGFnZUlkLmxlbmd0aCgpKTsKLQkJCQlyZXN1bHQgPSBnZXRJbmRleE9mKGFmdGVySUQpOwotCQkJCXJlc3VsdCA9IHJlc3VsdCA+PSAwICYmIHJlc3VsdCA8IHBhZ2VzLnNpemUoKSAtIDEgPyByZXN1bHQgKyAxIDogLTE7Ci0JCQl9IGVsc2UgaWYgKHBhZ2VJZC5zdGFydHNXaXRoKElETVBhZ2VIYW5kbGVyLlBBR0VfQkVGT1JFKSkgewotCQkJCVN0cmluZyBiZWZvcmVJRCA9IHBhZ2VJZC5zdWJzdHJpbmcoSURNUGFnZUhhbmRsZXIuUEFHRV9CRUZPUkUubGVuZ3RoKCksIHBhZ2VJZC5sZW5ndGgoKSk7Ci0JCQkJcmVzdWx0ID0gZ2V0SW5kZXhPZihiZWZvcmVJRCk7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0ID49IDEgJiYgcmVzdWx0IDwgcGFnZXMuc2l6ZSgpID8gcmVzdWx0IC0gMSA6IC0xOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBnZXRJbmRleE9mKHBhZ2VJZCk7Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwcml2YXRlIGludCBnZXRJbmRleE9mKFN0cmluZyBwYWdlSWQpIHsKLQkJCWludCByZXN1bHQgPSAtMTsKLQotCQkJTGlzdCBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcGFnZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQkJaWYgKCgoSVdpemFyZFBhZ2UpIHBhZ2VzLmdldChpbmRleCkpLmdldE5hbWUoKS5lcXVhbHMocGFnZUlkKSkgewotCQkJCQlyZXN1bHQgPSBpbmRleDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJCXJldHVybiBpbml0aWFsaXplZDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKERhdGFNb2RlbFdpemFyZCB3aXphcmQpIHsKLQkJSXRlcmF0b3IgcGFnZUdyb3VwcyA9IGdyb3VwVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHBhZ2VHcm91cHMuaGFzTmV4dCgpKSB7Ci0JCQlQYWdlR3JvdXBFbnRyeSBwYWdlR3JvdXAgPSAoUGFnZUdyb3VwRW50cnkpIHBhZ2VHcm91cHMubmV4dCgpOwotCQkJaWYgKHBhZ2VHcm91cC5pc0luaXRpYWxpemVkKCkpIHsKLQkJCQlJdGVyYXRvciBwYWdlcyA9IHBhZ2VHcm91cC5nZXRQYWdlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHBhZ2VzLmhhc05leHQoKSkgewotCQkJCQlJV2l6YXJkUGFnZSBwYWdlID0gKElXaXphcmRQYWdlKSBwYWdlcy5uZXh0KCk7Ci0JCQkJCXdpemFyZC5zdG9yZURlZmF1bHRTZXR0aW5ncyhwYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlT3BlcmF0aW9uV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9SdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyNjAwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlT3BlcmF0aW9uV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLXB1YmxpYyBjbGFzcyBSdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIgaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBJVW5kb2FibGVPcGVyYXRpb24gdW5kb2FibGVPcGVyYXRpb247Ci0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQotCXB1YmxpYyBSdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIoSVVuZG9hYmxlT3BlcmF0aW9uIHVuZG9hYmxlT3BlcmF0aW9uKSB7Ci0JCXRoaXMudW5kb2FibGVPcGVyYXRpb24gPSB1bmRvYWJsZU9wZXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJc3RhdHVzID0gdW5kb2FibGVPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCWlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpewotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGYzOTA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBvdXIgSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgdG8gdGhlIElSdW5uYWJsZVdpdGhQcm9ncmVzcy4gVGhpcyBjbGFzcwotICogbmVlZHMgdG8gYmUgdXNlZCB3aGVuIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBmcm9tIGEgSVJ1bm5hYmxlQ29udGV4dC4KLSAqIAotICogQHNlZSBJUnVubmFibGVDb250ZXh0Ci0gKiBAc2VlIEphdmFVSVBsdWdpbiNnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyBDcmVhdGlvbiBkYXRlOiAoNS84LzIwMDEgMToyODo0NSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCS8vIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGhlYWRsZXNzUnVubmFibGU7Ci0KLQkvKioKLQkgKiBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKSB7Ci0JCXNldEhlYWRsZXNzUnVubmFibGUoYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvOC8yMDAxIDE6Mjk6NTIgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5qMmVlLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0SGVhZGxlc3NSdW5uYWJsZSgpIHsKLQkJcmV0dXJuIGhlYWRsZXNzUnVubmFibGU7Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGlzIG9wZXJhdGlvbi4gUHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yLiBUaGlzIG1ldGhvZAotCSAqIGlzIHVzdWFsbHkgaW52b2tlZCBieSBhbiA8Y29kZT5JUnVubmFibGVDb250ZXh0PC9jb2RlPidzPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QsIHdoaWNoCi0JICogc3VwcGxpZXMgdGhlIHByb2dyZXNzIG1vbml0b3IuIEEgcmVxdWVzdCB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgaG9ub3JlZCBhbmQKLQkgKiBhY2tub3dsZWRnZWQgYnkgdGhyb3dpbmcgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UgdG8gZGlzcGxheSBwcm9ncmVzcyBhbmQgcmVjZWl2ZSByZXF1ZXN0cyBmb3IKLQkgKiAgICAgICAgICAgIGNhbmNlbGF0aW9uCi0JICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIHJ1biBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwgaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlCi0JICogICAgICAgICAgICAgICAgYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT47IHJ1bnRpbWUgZXhjZXB0aW9ucyBhcmUKLQkgKiAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlCi0JICogICAgICAgICAgICAgICAgY2FsbGluZyBjb250ZXh0Ci0JICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvcGVyYXRpb24gZGV0ZWN0cyBhIHJlcXVlc3QgdG8gY2FuY2VsLCB1c2luZwotCSAqICAgICAgICAgICAgICAgIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIElSdW5uYWJsZUNvbnRleHQjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlnZXRIZWFkbGVzc1J1bm5hYmxlKCkucnVuKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvOC8yMDAxIDE6Mjk6NTIgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0hlYWRsZXNzUnVubmFibGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmoyZWUub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEhlYWRsZXNzUnVubmFibGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgbmV3SGVhZGxlc3NSdW5uYWJsZSkgewotCQloZWFkbGVzc1J1bm5hYmxlID0gbmV3SGVhZGxlc3NSdW5uYWJsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NhdmVIYW5kbGVyVUkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2F2ZUhhbmRsZXJVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE2MjE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2F2ZUhhbmRsZXJVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklTYXZlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgU2F2ZUhhbmRsZXJVSSBpbXBsZW1lbnRzIElTYXZlSGFuZGxlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9GQUlMRUQgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIjE2Iik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUdJTk5JTkdfTUVTU0FHRSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiMTciKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBib29sZWFuIGlzWWVzVG9BbGwgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgaW50IHJlZmVyZW5jZUNvdW50ID0gMDsKLQotCS8qKgotCSAqIFNhdmVIYW5kbGVyVUkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2F2ZUhhbmRsZXJVSSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhY2Nlc3MgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzKCkgewotCQlyZWZlcmVuY2VDb3VudCsrOwotCX0KLQotCXByb3RlY3RlZCBTaGVsbCBnZXRQYXJlbnRTaGVsbEZvckRpYWxvZygpIHsKLQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpCi0JCQlyZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQlEaXNwbGF5IHJlc3VsdCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPyBEaXNwbGF5LmdldERlZmF1bHQoKSA6IHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVTYXZlRmFpbGVkKFNhdmVGYWlsZWRFeGNlcHRpb24gZXgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVmZXJlbmNlQ291bnQgPiAxKQotCQkJLy9MZXQgdGhlIG91dGVybW9zdCByZWZlcmVuY2UgaGFuZGxlIGl0Ci0JCQl0aHJvdyBleDsKLQkJU3RyaW5nIGV4TXNnID0gZXguZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCkgPT0gbnVsbCA/IGV4LmdldE1lc3NhZ2UoKSA6IGV4LmdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKLQkJZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSBCRUdJTk5JTkdfTUVTU0FHRSArICI6XG4iICsgZXhNc2c7Ly8kTk9OLU5MUy0xJAotCQlnZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFBhcmVudFNoZWxsRm9yRGlhbG9nKCksIFNBVkVfRkFJTEVELCBtZXNzYWdlKTsKLQkJCX0KLQkJfSk7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQllbHNlCi0JCQl0aHJvdyBleDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9tcHRVc2VyVG9TYXZlUmVhZE9ubHkoSUZpbGUgYUZpbGUpIHsKLQotCQlTdHJpbmdbXSBidXR0b25TdHJpbmdzID0ge1dUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiWWVzX1VJXyIpLCBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIlllc19Ub19BbGxfVUlfIiksIFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiTm9fVUlfIil9OyAvLyROT04tTkxTLTMkID0gIk5vIiAvLyROT04tTkxTLTIkID0gIlllcyBUbyBBbGwiIC8vJE5PTi1OTFMtMSQgPSAiWWVzIgotCQlTdHJpbmcgdGl0bGUgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIlNhdmluZ19SZWFkLU9ubHlfRmlsZV9VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJTYXZpbmcgUmVhZC1Pbmx5IEZpbGUiCi0JCVN0cmluZyBtZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIyY29uY2F0X0lORk9fIiwgKG5ldyBPYmplY3RbXXthRmlsZS5nZXRGdWxsUGF0aCgpfSkpOyAvLyROT04tTkxTLTEkID0gIlRoZSBmaWxlIHswfSBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzYXZlZC4gIFdvdWxkIHlvdSBsaWtlIHRvIG1ha2UgaXQgZWRpdGFibGUgYW5kIHNhdmUgYW55d2F5PyIKLQotCQlmaW5hbCBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFBhcmVudFNoZWxsRm9yRGlhbG9nKCksIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93Ci0JCQkJCS8vIGljb24KLQkJCQkJbWVzc2FnZSwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgYnV0dG9uU3RyaW5ncywgMCk7IC8vIFllcyBpcyB0aGUgZGVmYXVsdAotCi0JCWZpbmFsIGludFtdIHJldCA9IG5ldyBpbnRbMV07Ci0JCWdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCXJldFswXSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXN3aXRjaCAocmV0WzBdKSB7Ci0JCQljYXNlIDAgOiB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQljYXNlIDEgOiB7Ci0JCQkJaXNZZXNUb0FsbCA9IHRydWU7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQljYXNlIDIgOiB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiByZWxlYXNlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXJlZmVyZW5jZUNvdW50LS07Ci0JCWlmIChyZWZlcmVuY2VDb3VudCA9PSAwKQotCQkJaXNZZXNUb0FsbCA9IGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZShJRmlsZSBhRmlsZSkgewotCQlib29sZWFuIHllcyA9IGlzWWVzVG9BbGwgfHwgcHJvbXB0VXNlclRvU2F2ZVJlYWRPbmx5KGFGaWxlKTsKLQkJaWYgKHllcykKLQkJCWFGaWxlLmdldFJlc291cmNlQXR0cmlidXRlcygpLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJcmV0dXJuIHllczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlR3JvdXBIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VHcm91cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4ZWU1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VHcm91cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUGFnZUdyb3VwSGFuZGxlciBpbXBsZW1lbnRzIElETVBhZ2VHcm91cEhhbmRsZXIgewotCXB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2VHcm91cChTdHJpbmcgY3VycmVudFBhZ2VHcm91cElELCBTdHJpbmdbXSBwYWdlR3JvdXBJRHMpIHsKLQkJaWYgKHBhZ2VHcm91cElEcyA9PSBudWxsIHx8IHBhZ2VHcm91cElEcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChjdXJyZW50UGFnZUdyb3VwSUQgPT0gbnVsbCkKLQkJCXJldHVybiBwYWdlR3JvdXBJRHNbMF07Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhZ2VHcm91cElEcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCWlmIChwYWdlR3JvdXBJRHNbaW5kZXhdLmVxdWFscyhjdXJyZW50UGFnZUdyb3VwSUQpKSB7Ci0JCQkJLy8gV2UgZm91bmQgdGhlIGN1cnJlbnRQYWdlR3JvdXBJRCwgc28gd2Ugd2FudCB0byByZXR1cm4gdGhlIG5leHQgb25lIGluIHRoZQotCQkJCS8vIGFycmF5IGlmIHRoZXJlIGlzIG9uZS4KLQkJCQlpZiAoaW5kZXggKyAxIDwgcGFnZUdyb3VwSURzLmxlbmd0aCkgewotCQkJCQlyZXN1bHQgPSBwYWdlR3JvdXBJRHNbaW5kZXggKyAxXTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBudWxsOwotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGIzOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUGFnZUhhbmRsZXIgaW1wbGVtZW50cyBJRE1QYWdlSGFuZGxlcgotewotICBwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZE5leHRQYWdlTmFtZSkgCi0gIHsKLSAgICByZXR1cm4gZXhwZWN0ZWROZXh0UGFnZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZXZpb3VzUGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lKSAKLSAgewotCXJldHVybiBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dFVJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWJiNTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dFVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3M7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0VUkgZXh0ZW5kcyBTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MgaW1wbGVtZW50cyBJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCB7Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVkaXRJbXBsKGZpbmFsIElGaWxlW10gZmlsZXNUb1ZhbGlkYXRlKSB7Ci0JCWZpbmFsIElTdGF0dXMgW10gc3RhdHVzID0gbmV3IElTdGF0dXNbMV07Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzdGF0dXNbMF0gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzVG9WYWxpZGF0ZSwgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gc3RhdHVzWzBdOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZEtleUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkS2V5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzYzdiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkS2V5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvMzAvMjAwMSA0OjAwOjI4IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lZEtleUxpc3RlbmVyIGV4dGVuZHMgVGltZXIgaW1wbGVtZW50cyBLZXlMaXN0ZW5lciwgTW91c2VMaXN0ZW5lciwgTW91c2VUcmFja0xpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgV2lkZ2V0IG1vbml0b3JpbmdUYXJnZXQ7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVElNRV9MSU1JVCA9IDIwMDsKLQotCS8qKgotCSAqIEoyRUVUaW1lZEtleUxpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlbGF5Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIFRpbWVkS2V5TGlzdGVuZXIoaW50IGRlbGF5LCBBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcihkZWxheSwgbGlzdGVuZXIpOwotCQlzZXRSZXBlYXRzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzMwLzIwMDEgNDo0MzozMyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYQotCSAqICAgICAgICAgICAgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgVGltZWRLZXlMaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzKFRJTUVfTElNSVQsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZW50IHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBvbiB0aGUgc3lzdGVtIGtleWJvYXJkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBrZXkgcHJlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIFNlbnQgd2hlbiBhIGtleSBpcyByZWxlYXNlZCBvbiB0aGUgc3lzdGVtIGtleWJvYXJkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBrZXkgcmVsZWFzZQotCSAqLwotCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQgZSkgewotCQkvLyBSZXBsYWNlZCB3aXRoIFNXVC5Nb2RpZnkgLS0gc2VlIG1vZGlmeVRleHQoKSBpbiB0aGlzIGNsYXNzCi0JCS8vICAgICAgICBtb25pdG9yaW5nVGFyZ2V0ID0gKFdpZGdldCkgZS5nZXRTb3VyY2UoKTsKLQkJLy8gICAgICAgIHJlc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZURvd24oTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VVcChNb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCW1vbml0b3JpbmdUYXJnZXQgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQlyZXN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lciNtb3VzZUVudGVyKE1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyI21vdXNlRXhpdChNb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyI21vdXNlSG92ZXIoTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLnV0aWwuVGltZXIjZ2V0U291cmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG1vbml0b3JpbmdUYXJnZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJbW9uaXRvcmluZ1RhcmdldCA9IChXaWRnZXQpIGUuZ2V0U291cmNlKCk7Ci0JCXJlc3RhcnQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZE1vZGlmeUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkTW9kaWZ5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwNDVmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkTW9kaWZ5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGVyZm9ybSB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgSjJFRVRpbWVkS2V5TGlzdGVuZXIgYnV0IHVzaW5nIHRoZSBNb2RpZnkgU1dUIGV2ZW50Ci0gKiBpbnN0ZWFkIG9mIHRoZSBLZXlVcC4gQ3JlYXRpb24gZGF0ZTogKDkvMTAvMjAwMSAxMTo0Njo1MSBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotcHVibGljIGNsYXNzIFRpbWVkTW9kaWZ5TGlzdGVuZXIgZXh0ZW5kcyBUaW1lZEtleUxpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCS8qKgotCSAqIEoyRUVUaW1lZE1vZGVmeUxpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlbGF5Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIFRpbWVkTW9kaWZ5TGlzdGVuZXIoaW50IGRlbGF5LCBBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcihkZWxheSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEoyRUVUaW1lZE1vZGVmeUxpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBUaW1lZE1vZGlmeUxpc3RlbmVyKEFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIFJlL1N0YXJ0IHRoZSB0aW1lcgotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCBlKSB7Ci0JCW1vbml0b3JpbmdUYXJnZXQgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQlyZXN0YXJ0KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiMTFjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLQotcHVibGljIGNsYXNzIFRpbWVyIHsKLQkvKioKLQkgKiBEb1Bvc3RFdmVudCBpcyBhIHJ1bm5hYmxlIGNsYXNzIHRoYXQgZmlyZXMgYWN0aW9uRXZlbnRzIHRvIHRoZSBsaXN0ZW5lcnMgb24gdGhlCi0JICogRXZlbnREaXNwYXRjaFRocmVhZCwgdmlhIGludm9rZUxhdGVyLgotCSAqIAotCSAqIEBzZWUgI3Bvc3QKLQkgKi8KLQljbGFzcyBEb1Bvc3RFdmVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGV2ZW50UXVldWVkKSB7Ci0JCQkJZmlyZUFjdGlvblBlcmZvcm1lZChuZXcgQWN0aW9uRXZlbnQoZ2V0U291cmNlKCksIDAsIG51bGwpKTsKLQkJCQljYW5jZWxFdmVudCgpOwotCQkJfQotCQl9Ci0KLQkJVGltZXIgZ2V0VGltZXIoKSB7Ci0JCQlyZXR1cm4gVGltZXIudGhpczsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCWJvb2xlYW4gZXZlbnRRdWV1ZWQgPSBmYWxzZTsKLQlpbnQgaW5pdGlhbERlbGF5LCBkZWxheTsKLQlib29sZWFuIHJlcGVhdHMgPSB0cnVlLCBjb2FsZXNjZSA9IHRydWU7Ci0JcHJpdmF0ZSBSdW5uYWJsZSBkb1Bvc3RFdmVudDsKLQkvLyBUaGVzZSBmaWVsZHMgYXJlIG1haW50YWluZWQgYnkgVGltZXJRdWV1ZS4KLQkvLyBldmVudFF1ZXVlZCBjYW4gYWxzbyBiZSByZXNldCBieSB0aGUgVGltZXJRdWV1ZSwgYnV0IHdpbGwgb25seSBldmVyCi0JLy8gaGFwcGVuIGluIGFwcGxldCBjYXNlIHdoZW4gVGltZXJRdWV1ZXMgdGhyZWFkIGlzIGRlc3Ryb3llZC4KLQlsb25nIGV4cGlyYXRpb25UaW1lOwotCVRpbWVyIG5leHRUaW1lcjsKLQlib29sZWFuIHJ1bm5pbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgVGltZXIgdGhhdCB3aWxsIG5vdGlmeSBpdHMgbGlzdGVuZXJzIGV2ZXJ5IDxpPmRlbGF5IDwvaT4gbWlsbGlzZWNvbmRzLgotCSAqIAotCSAqIEBwYXJhbSBkZWxheQotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBsaXN0ZW5lciBub3RpZmljYXRpb24KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIEFuIGluaXRpYWwgbGlzdGVuZXIKLQkgKiBAc2VlICNzZXRJbml0aWFsRGVsYXkKLQkgKiBAc2VlICNzZXRSZXBlYXRzCi0JICovCi0JcHVibGljIFRpbWVyKGludCBkZWxheSwgQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZWxheSA9IGRlbGF5OwotCQl0aGlzLmluaXRpYWxEZWxheSA9IGRlbGF5OwotCi0JCWRvUG9zdEV2ZW50ID0gbmV3IERvUG9zdEV2ZW50KCk7Ci0KLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gYWN0aW9uTGlzdGVuZXIgdG8gdGhlIFRpbWVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgY2FuY2VsRXZlbnQoKSB7Ci0JCWV2ZW50UXVldWVkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBsaXN0ZW5lcnMgdGhhdCBoYXZlIHJlZ2lzdGVyZWQgaW50ZXJlc3QgZm9yIG5vdGlmaWNhdGlvbiBvbiB0aGlzIGV2ZW50IHR5cGUuIFRoZQotCSAqIGV2ZW50IGluc3RhbmNlIGlzIGxhemlseSBjcmVhdGVkIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBpbnRvIHRoZSBmaXJlIG1ldGhvZC4KLQkgKiAKLQkgKiBAc2VlIEV2ZW50TGlzdGVuZXJMaXN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCS8vIEd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgbm9uLW51bGwgYXJyYXkKLQkJQWN0aW9uTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0KLQkJLy8gUHJvY2VzcyB0aGUgbGlzdGVuZXJzIGxhc3QgdG8gZmlyc3QsIG5vdGlmeWluZwotCQkvLyB0aG9zZSB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgewotCQkJbGlzdGVuZXJzW2ldLmFjdGlvblBlcmZvcm1lZChlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFRpbWVyJ3MgZGVsYXkuCi0JICogCi0JICogQHNlZSAjc2V0RGVsYXkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlbGF5KCkgewotCQlyZXR1cm4gZGVsYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVGltZXIncyBpbml0aWFsIGRlbGF5LgotCSAqIAotCSAqIEBzZWUgI3NldERlbGF5Ci0JICovCi0JcHVibGljIGludCBnZXRJbml0aWFsRGVsYXkoKSB7Ci0JCXJldHVybiBpbml0aWFsRGVsYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Yj50cnVlIDwvYj4gaWYgdGhlIFRpbWVyIGNvYWxlc2NlcyBtdWx0aXBsZSBwZW5kaW5nIDxiPnBlcmZvcm1Db21tYW5kKCkgPC9iPgotCSAqIG1lc3NhZ2VzLgotCSAqIAotCSAqIEBzZWUgI3NldENvYWxlc2NlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb2FsZXNjZSgpIHsKLQkJcmV0dXJuIGNvYWxlc2NlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGI+dHJ1ZSA8L2I+IGlmIHRoZSBUaW1lciB3aWxsIHNlbmQgYSA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IG1lc3NhZ2UgdG8gaXRzCi0JICogbGlzdGVuZXJzIG11bHRpcGxlIHRpbWVzLgotCSAqIAotCSAqIEBzZWUgI3NldFJlcGVhdHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdHMoKSB7Ci0JCXJldHVybiByZXBlYXRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGI+dHJ1ZSA8L2I+IGlmIHRoZSBUaW1lciBpcyBydW5uaW5nLgotCSAqIAotCSAqIEBzZWUgI3N0YXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgewotCQlyZXR1cm4gdGltZXJRdWV1ZSgpLmNvbnRhaW5zVGltZXIodGhpcyk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgcG9zdCgpIHsKLQkJaWYgKCFldmVudFF1ZXVlZCkgewotCQkJZXZlbnRRdWV1ZWQgPSB0cnVlOwotCQkJb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKGRvUG9zdEV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW4gQWN0aW9uTGlzdGVuZXIgZnJvbSB0aGUgVGltZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVzdGFydHMgYSBUaW1lciwgY2FuY2VsaW5nIGFueSBwZW5kaW5nIGZpcmluZ3MsIGFuZCBjYXVzaW5nIGl0IHRvIGZpcmUgd2l0aCBpdHMgaW5pdGlhbAotCSAqIGRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdGFydCgpIHsKLQkJc3RvcCgpOwotCQlzdGFydCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgVGltZXIgY29hbGVzY2VzIG11bHRpcGxlIHBlbmRpbmcgQWN0aW9uRXZlbnQgZmlyaW5ncy4gQSBidXN5IGFwcGxpY2F0aW9uIG1heQotCSAqIG5vdCBiZSBhYmxlIHRvIGtlZXAgdXAgd2l0aCBhIFRpbWVyJ3MgbWVzc2FnZSBnZW5lcmF0aW9uLCBjYXVzaW5nIG11bHRpcGxlCi0JICogPGI+YWN0aW9uUGVyZm9ybWVkKCkgPC9iPiBtZXNzYWdlIHNlbmRzIHRvIGJlIHF1ZXVlZC4gV2hlbiBwcm9jZXNzZWQsIHRoZSBhcHBsaWNhdGlvbiBzZW5kcwotCSAqIHRoZXNlIG1lc3NhZ2VzIG9uZSBhZnRlciB0aGUgb3RoZXIsIGNhdXNpbmcgdGhlIFRpbWVyJ3MgbGlzdGVuZXJzIHRvIHJlY2VpdmUgYSBzZXF1ZW5jZSBvZgotCSAqIDxiPmFjdGlvblBlcmZvcm1lZCgpIDwvYj4gbWVzc2FnZXMgd2l0aCBubyBkZWxheSBiZXR3ZWVuIHRoZW0uIENvYWxlc2NpbmcgYXZvaWRzIHRoaXMKLQkgKiBzaXR1YXRpb24gYnkgcmVkdWNpbmcgbXVsdGlwbGUgcGVuZGluZyBtZXNzYWdlcyB0byBhIHNpbmdsZSBtZXNzYWdlIHNlbmQuIFRpbWVycyBjb2FsZXNjZQotCSAqIHRoZWlyIG1lc3NhZ2Ugc2VuZHMgYnkgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2FsZXNjZShib29sZWFuIGZsYWcpIHsKLQkJY29hbGVzY2UgPSBmbGFnOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFRpbWVyJ3MgZGVsYXksIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gc3VjY2Vzc2l2ZSA8Yj5hY3Rpb25QZXJmb21lZCgpCi0JICogPC9iPiBtZXNzYWdlcyB0byBpdHMgbGlzdGVuZXJzCi0JICogCi0JICogQHNlZSAjc2V0SW5pdGlhbERlbGF5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsYXkoaW50IGRlbGF5KSB7Ci0JCWlmIChkZWxheSA8IDApIHsKLQkJCVN0cmluZyBtc2cgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuVGltZXJfVUlfMCwgbmV3IE9iamVjdFtde0ludGVnZXIudG9TdHJpbmcoZGVsYXkpfSk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQkJdGhpcy5kZWxheSA9IGRlbGF5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFRpbWVyJ3MgaW5pdGlhbCBkZWxheS4gVGhpcyB3aWxsIGJlIHVzZWQgZm9yIHRoZSBmaXJzdCAicmluZ2luZyIgb2YgdGhlIFRpbWVyIG9ubHkuCi0JICogU3Vic2VxdWVudCByaW5naW5ncyB3aWxsIGJlIHNwYWNlZCB1c2luZyB0aGUgZGVsYXkgcHJvcGVydHkuCi0JICogCi0JICogQHNlZSAjc2V0RGVsYXkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsRGVsYXkoaW50IGluaXRpYWxEZWxheSkgewotCQlpZiAoaW5pdGlhbERlbGF5IDwgMCkgewotCQkJU3RyaW5nIG1zZyA9IFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5UaW1lcl9VSV8xLCBuZXcgT2JqZWN0W117SW50ZWdlci50b1N0cmluZyhpbml0aWFsRGVsYXkpfSk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQkJdGhpcy5pbml0aWFsRGVsYXkgPSBpbml0aWFsRGVsYXk7Ci0JfQotCi0JLyoqCi0JICogSWYgPGI+ZmxhZyA8L2I+IGlzIDxiPmZhbHNlIDwvYj4sIGluc3RydWN0cyB0aGUgVGltZXIgdG8gc2VuZCA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IHRvCi0JICogaXRzIGxpc3RlbmVycyBvbmx5IG9uY2UsIGFuZCB0aGVuIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwZWF0cyhib29sZWFuIGZsYWcpIHsKLQkJcmVwZWF0cyA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIHRoZSBUaW1lciwgY2F1c2luZyBpdCB0byBzZW5kIDxiPmFjdGlvblBlcmZvcm1lZCgpIDwvYj4gbWVzc2FnZXMgdG8gaXRzIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAc2VlICNzdG9wCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCXRpbWVyUXVldWUoKS5hZGRUaW1lcih0aGlzLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIGdldEluaXRpYWxEZWxheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyBhIFRpbWVyLCBjYXVzaW5nIGl0IHRvIHN0b3Agc2VuZGluZyA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IG1lc3NhZ2VzIHRvIGl0cyBUYXJnZXQuCi0JICogCi0JICogQHNlZSAjc3RhcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQl0aW1lclF1ZXVlKCkucmVtb3ZlVGltZXIodGhpcyk7Ci0JCWNhbmNlbEV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGltZXIgcXVldWUuCi0JICovCi0JVGltZXJRdWV1ZSB0aW1lclF1ZXVlKCkgewotCQlyZXR1cm4gVGltZXJRdWV1ZS5zaW5nbGV0b24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSBmb3IgdGhlIEFjdGlvbkV2ZW50IHRoYXQgaXMgZmlyZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVyUXVldWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXJRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjQ0MmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXJRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLQotCi0KLWNsYXNzIFRpbWVyUXVldWUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgVGltZXJRdWV1ZSBzaW5nbGV0b247Ci0JVGltZXIgZmlyc3RUaW1lcjsKLQlib29sZWFuIHJ1bm5pbmc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IGNsYXNzTG9jayA9IG5ldyBPYmplY3QoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUaW1lclF1ZXVlLgotCSAqLwotCXB1YmxpYyBUaW1lclF1ZXVlKCkgewotCQlzdXBlcigpOwotCi0JCS8vIE5vdyBzdGFydCB0aGUgVGltZXJRdWV1ZSB0aHJlYWQuCi0JCXN0YXJ0KCk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgYWRkVGltZXIoVGltZXIgdGltZXIsIGxvbmcgZXhwaXJhdGlvblRpbWUpIHsKLQkJVGltZXIgcHJldmlvdXNUaW1lcjsKLQkJVGltZXIgbmV4dFRpbWVyOwotCi0JCS8vIElmIHRoZSBUaW1lciBpcyBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgdGhlbiBpZ25vcmUgdGhlIGFkZC4KLQkJaWYgKHRpbWVyLnJ1bm5pbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXByZXZpb3VzVGltZXIgPSBudWxsOwotCQluZXh0VGltZXIgPSBmaXJzdFRpbWVyOwotCi0JCS8vIEluc2VydCB0aGUgVGltZXIgaW50byB0aGUgbGlua2VkIGxpc3QgaW4gdGhlIG9yZGVyIHRoZXkgd2lsbAotCQkvLyBleHBpcmUuIElmIHR3byB0aW1lcnMgZXhwaXJlIGF0IHRoZSBzYW1lIHRpbWUsIHB1dCB0aGUgbmV3ZXIgZW50cnkKLQkJLy8gbGF0ZXIgc28gdGhleSBleHBpcmUgaW4gdGhlIG9yZGVyIHRoZXkgY2FtZSBpbi4KLQotCQl3aGlsZSAobmV4dFRpbWVyICE9IG51bGwpIHsKLQkJCWlmIChuZXh0VGltZXIuZXhwaXJhdGlvblRpbWUgPiBleHBpcmF0aW9uVGltZSkKLQkJCQlicmVhazsKLQotCQkJcHJldmlvdXNUaW1lciA9IG5leHRUaW1lcjsKLQkJCW5leHRUaW1lciA9IG5leHRUaW1lci5uZXh0VGltZXI7Ci0JCX0KLQotCQlpZiAocHJldmlvdXNUaW1lciA9PSBudWxsKSB7Ci0JCQlmaXJzdFRpbWVyID0gdGltZXI7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2aW91c1RpbWVyLm5leHRUaW1lciA9IHRpbWVyOwotCQl9Ci0KLQkJdGltZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTsKLQkJdGltZXIubmV4dFRpbWVyID0gbmV4dFRpbWVyOwotCQl0aW1lci5ydW5uaW5nID0gdHJ1ZTsKLQkJbm90aWZ5KCk7Ci0JfQotCi0Jc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnNUaW1lcihUaW1lciB0aW1lcikgewotCQlyZXR1cm4gdGltZXIucnVubmluZzsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgYSB0b24gb2YgdGltZXJzLCB0aGlzIG1ldGhvZCBtYXkgbmV2ZXIgcmV0dXJuLiBJdCBsb29wcyBjaGVja2luZyB0byBzZWUgaWYgdGhlCi0JICogaGVhZCBvZiB0aGUgVGltZXIgbGlzdCBoYXMgZXhwaXJlZC4gSWYgaXQgaGFzLCBpdCBwb3N0cyB0aGUgVGltZXIgYW5kIHJlc2NoZWR1bGVzIGl0IGlmCi0JICogbmVjZXNzYXJ5LgotCSAqLwotCXN5bmNocm9uaXplZCBsb25nIHBvc3RFeHBpcmVkVGltZXJzKCkgewotCQlUaW1lciB0aW1lcjsKLQkJbG9uZyBjdXJyZW50VGltZTsKLQkJbG9uZyB0aW1lVG9XYWl0OwotCi0JCS8vIFRoZSB0aW1lVG9XYWl0IHdlIHJldHVybiBzaG91bGQgbmV2ZXIgYmUgbmVnYXRpdmUgYW5kIG9ubHkgYmUgemVybwotCQkvLyB3aGVuIHdlIGhhdmUgbm8gVGltZXJzIHRvIHdhaXQgZm9yLgotCi0JCWRvIHsKLQkJCXRpbWVyID0gZmlyc3RUaW1lcjsKLQkJCWlmICh0aW1lciA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCi0JCQljdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJdGltZVRvV2FpdCA9IHRpbWVyLmV4cGlyYXRpb25UaW1lIC0gY3VycmVudFRpbWU7Ci0KLQkJCWlmICh0aW1lVG9XYWl0IDw9IDApIHsKLQkJCQl0cnkgewotCQkJCQl0aW1lci5wb3N0KCk7IC8vIGhhdmUgdGltZXIgcG9zdCBhbiBldmVudAotCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHF1ZXVlCi0JCQkJcmVtb3ZlVGltZXIodGltZXIpOwotCi0JCQkJLy8gVGhpcyB0cmllcyB0byBrZWVwIHRoZSBpbnRlcnZhbCB1bmlmb3JtIGF0Ci0JCQkJLy8gdGhlIGNvc3Qgb2YgZHJpZnQuCi0JCQkJaWYgKHRpbWVyLmlzUmVwZWF0cygpKSB7Ci0JCQkJCWFkZFRpbWVyKHRpbWVyLCBjdXJyZW50VGltZSArIHRpbWVyLmdldERlbGF5KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQWxsb3cgb3RoZXIgdGhyZWFkcyB0byBjYWxsIGFkZFRpbWVyKCkgYW5kIHJlbW92ZVRpbWVyKCkKLQkJCS8vIGV2ZW4gd2hlbiB3ZSBhcmUgcG9zdGluZyBUaW1lcnMgbGlrZSBtYWQuIFNpbmNlIHRoZSB3YWl0KCkKLQkJCS8vIHJlbGVhc2VzIHRoZSBsb2NrLCBiZSBzdXJlIG5vdCB0byBtYWludGFpbiBhbnkgc3RhdGUKLQkJCS8vIGJldHdlZW4gaXRlcmF0aW9ucyBvZiB0aGUgbG9vcC4KLQotCQkJdHJ5IHsKLQkJCQl3YWl0KDEpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9IHdoaWxlICh0aW1lVG9XYWl0IDw9IDApOwotCi0JCXJldHVybiB0aW1lVG9XYWl0OwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVRpbWVyKFRpbWVyIHRpbWVyKSB7Ci0JCVRpbWVyIHByZXZpb3VzVGltZXI7Ci0JCVRpbWVyIG5leHRUaW1lcjsKLQkJYm9vbGVhbiBmb3VuZDsKLQotCQlpZiAoIXRpbWVyLnJ1bm5pbmcpCi0JCQlyZXR1cm47Ci0KLQkJcHJldmlvdXNUaW1lciA9IG51bGw7Ci0JCW5leHRUaW1lciA9IGZpcnN0VGltZXI7Ci0JCWZvdW5kID0gZmFsc2U7Ci0KLQkJd2hpbGUgKG5leHRUaW1lciAhPSBudWxsKSB7Ci0JCQlpZiAobmV4dFRpbWVyID09IHRpbWVyKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlwcmV2aW91c1RpbWVyID0gbmV4dFRpbWVyOwotCQkJbmV4dFRpbWVyID0gbmV4dFRpbWVyLm5leHRUaW1lcjsKLQkJfQotCi0JCWlmICghZm91bmQpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHByZXZpb3VzVGltZXIgPT0gbnVsbCkgewotCQkJZmlyc3RUaW1lciA9IHRpbWVyLm5leHRUaW1lcjsKLQkJfSBlbHNlIHsKLQkJCXByZXZpb3VzVGltZXIubmV4dFRpbWVyID0gdGltZXIubmV4dFRpbWVyOwotCQl9Ci0KLQkJdGltZXIuZXhwaXJhdGlvblRpbWUgPSAwOwotCQl0aW1lci5uZXh0VGltZXIgPSBudWxsOwotCQl0aW1lci5ydW5uaW5nID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJ1bigpIHsKLQkJbG9uZyB0aW1lVG9XYWl0OwotCi0JCXRyeSB7Ci0JCQl3aGlsZSAocnVubmluZykgewotCQkJCXRpbWVUb1dhaXQgPSBwb3N0RXhwaXJlZFRpbWVycygpOwotCQkJCXRyeSB7Ci0JCQkJCXdhaXQodGltZVRvV2FpdCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVGhyZWFkRGVhdGggdGQpIHsKLQkJCXJ1bm5pbmcgPSBmYWxzZTsKLQkJCS8vIE1hcmsgYWxsIHRoZSB0aW1lcnMgd2UgY29udGFpbiBhcyBub3QgYmVpbmcgcXVldWVkLgotCQkJVGltZXIgdGltZXIgPSBmaXJzdFRpbWVyOwotCQkJd2hpbGUgKHRpbWVyICE9IG51bGwpIHsKLQkJCQl0aW1lci5ldmVudFF1ZXVlZCA9IGZhbHNlOwotCQkJCXRpbWVyID0gdGltZXIubmV4dFRpbWVyOwotCQkJfQotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKCF0aGlzLnJ1bm5pbmcpCi0JCQkJCXN0YXJ0KCk7Ci0JCQl9Ci0JCQl0aHJvdyB0ZDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGltZXJRdWV1ZSBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXN5bmNocm9uaXplZCAoY2xhc3NMb2NrKSB7Ci0JCQkJc2luZ2xldG9uID0gbmV3IFRpbWVyUXVldWUoKTsKLQkJCX0KLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJaWYgKHJ1bm5pbmcpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLlRpbWVyUXVldWVfRVJST1JfMCk7Ci0JCX0KLQkJVGhyZWFkIHRpbWVyVGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLCAiVGltZXJRdWV1ZSIpOy8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXRpbWVyVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRpbWVyVGhyZWFkLnN0YXJ0KCk7Ci0JCXJ1bm5pbmcgPSB0cnVlOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0JCXJ1bm5pbmcgPSBmYWxzZTsKLQkJbm90aWZ5KCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWY7Ci0JCVRpbWVyIG5leHRUaW1lcjsKLQotCQlidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlRpbWVyUXVldWUgKCIpOy8vJE5PTi1OTFMtMSQKLQotCQluZXh0VGltZXIgPSBmaXJzdFRpbWVyOwotCQl3aGlsZSAobmV4dFRpbWVyICE9IG51bGwpIHsKLQkJCWJ1Zi5hcHBlbmQobmV4dFRpbWVyLnRvU3RyaW5nKCkpOwotCi0JCQluZXh0VGltZXIgPSBuZXh0VGltZXIubmV4dFRpbWVyOwotCQkJaWYgKG5leHRUaW1lciAhPSBudWxsKQotCQkJCWJ1Zi5hcHBlbmQoIiwgIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJYnVmLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlFbmFibGVtZW50SWRlbnRpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjN2U1NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JSWRlbnRpZmllckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSWRlbnRpZmllckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRNYW5hZ2VyOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1jbGFzcyBVSUVuYWJsZW1lbnRJZGVudGlmaWVyIGV4dGVuZHMgRW5hYmxlbWVudElkZW50aWZpZXIgaW1wbGVtZW50cyBJSWRlbnRpZmllckxpc3RlbmVyIHsKLQotCXByaXZhdGUgSUlkZW50aWZpZXIgYWN0aXZpdHlJZGVudGlmaWVyOwotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgVUlFbmFibGVtZW50SWRlbnRpZmllcihTdHJpbmcgaWQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoaWQsIHByb2plY3QpOwotCQlJQWN0aXZpdHlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJYWN0aXZpdHlJZGVudGlmaWVyID0gZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0SWRlbnRpZmllcihpZCk7Ci0JCQlhY3Rpdml0eUlkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyTGlzdGVuZXIjaWRlbnRpZmllckNoYW5nZWQob3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JZGVudGlmaWVyRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaWRlbnRpZmllckNoYW5nZWQoSWRlbnRpZmllckV2ZW50IGlkZW50aWZpZXJFdmVudCkgewotCQlib29sZWFuIGVuYWJsZWRDaGFuZ2VkID0gcmVzZXRFbmFibGVkKCk7Ci0JCUVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgZXZ0ID0gbmV3IEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQodGhpcywgZmFsc2UsIGVuYWJsZWRDaGFuZ2VkKTsKLQkJZmlyZUlkZW50aWZpZXJDaGFuZ2VkKGV2dCk7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpdml0eU1hbmFnZXIgZ2V0QWN0aXZpdHlNYW5hZ2VyKCkgewotCQlyZXR1cm4gKChVSUVuYWJsZW1lbnRNYW5hZ2VyKSBJRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UpLmdldEFjdGl2aXR5TWFuYWdlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlzcGUud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXIjZ2V0TmV3RW5hYmxlZCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0TmV3RW5hYmxlZCgpIHsKLQkJSUlkZW50aWZpZXIgaWRlbnRpZmllciA9IGdldEFjdGl2aXR5SWRlbnRpZmllcigpOwotCQlpZiAoaWRlbnRpZmllciAhPSBudWxsKQotCQkJcmV0dXJuIGlkZW50aWZpZXIuaXNFbmFibGVkKCkgJiYgc3VwZXIuZ2V0TmV3RW5hYmxlZCgpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIElJZGVudGlmaWVyIGdldEFjdGl2aXR5SWRlbnRpZmllcigpIHsKLQkJaWYgKGFjdGl2aXR5SWRlbnRpZmllciA9PSBudWxsKXsKLQkJCUlBY3Rpdml0eU1hbmFnZXIgbWFuYWdlciA9IGdldEFjdGl2aXR5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCWFjdGl2aXR5SWRlbnRpZmllciA9IGdldEFjdGl2aXR5TWFuYWdlcigpLmdldElkZW50aWZpZXIoZ2V0SWQoKSk7Ci0JCQkJYWN0aXZpdHlJZGVudGlmaWVyLmFkZElkZW50aWZpZXJMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlJZGVudGlmaWVyOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlFbmFibGVtZW50TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Mjc0MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklBY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgVUlFbmFibGVtZW50TWFuYWdlciBleHRlbmRzIEVuYWJsZW1lbnRNYW5hZ2VyIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCBhY3Rpdml0eVN1cHBvcnQgPSBudWxsOwotCi0JcHVibGljIFVJRW5hYmxlbWVudE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpdml0eU1hbmFnZXIgZ2V0QWN0aXZpdHlNYW5hZ2VyKCkgewotCQlpZiAoZ2V0QWN0aXZpdHlTdXBwb3J0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhY3Rpdml0eVN1cHBvcnQuCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgZ2V0QWN0aXZpdHlTdXBwb3J0KCkgewotCQlpZiAoYWN0aXZpdHlTdXBwb3J0ID09IG51bGwpCi0JCQlhY3Rpdml0eVN1cHBvcnQgPSBpbml0QWN0aXZpdHlTdXBwb3J0KCk7Ci0JCXJldHVybiBhY3Rpdml0eVN1cHBvcnQ7Ci0JfQotCi0JcHJpdmF0ZSBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IGluaXRBY3Rpdml0eVN1cHBvcnQoKSB7Ci0JCUlXb3JrYmVuY2ggd29yayA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3b3JrID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL05vdCBpbml0aWFsaXplZCB5ZXQKLQkJfQotCQlyZXR1cm4gKHdvcmsgIT0gbnVsbCkgPyB3b3JrLmdldEFjdGl2aXR5U3VwcG9ydCgpIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyI2NyZWF0ZUlkZW50aWZpZXIoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCXByb3RlY3RlZCBFbmFibGVtZW50SWRlbnRpZmllciBjcmVhdGVJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVySWQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBVSUVuYWJsZW1lbnRJZGVudGlmaWVyKGlkZW50aWZpZXJJZCwgcHJvamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSU9wZXJhdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlPcGVyYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2NkNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSU9wZXJhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDUsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgZGZob2x0Ci0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVUlPcGVyYXRpb25IYW5kbGVyIGltcGxlbWVudHMgSU9wZXJhdGlvbkhhbmRsZXIgewotCXByb3RlY3RlZCBTaGVsbCBwYXJlbnRTaGVsbDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0lORk9STUFUSU9OID0gIkluZm9ybWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfRVJST1IgPSAiRXJyb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DT05GSVJNID0gIkNvbmZpcm0iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBpbmZvcm1hdGlvblRpdGxlID0gREVGQVVMVF9JTkZPUk1BVElPTjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpcm1UaXRsZSA9IERFRkFVTFRfQ09ORklSTTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yVGl0bGUgPSBERUZBVUxUX0VSUk9SOwotCi0JLyoqCi0JICogVUlPcGVyYXRpb25IYW5kbGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVJT3BlcmF0aW9uSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBVSU9wZXJhdGlvbkhhbmRsZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVUlPcGVyYXRpb25IYW5kbGVyKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcigpOwotCQlwYXJlbnRTaGVsbCA9IHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBBIGRlY2lzaW9uIG5lZWRzIHRvIG1hZGUgYXMgdG8gd2hldGhlciBhbiBhY3Rpb24vb3BlcmF0aW9uIGNhbiBjb250aW51ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRpbnVlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQSBkZWNpc2lvbiBuZWVkcyB0byBtYWRlIGFzIHRvIHdoZXRoZXIgYW4gYWN0aW9uL29wZXJhdGlvbiBjYW4gY29udGludWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJcmV0dXJuIExpc3RNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbWVzc2FnZSwgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEEgZGVjaXNpb24gbmVlZHMgdG8gbWFkZSBhcyB0byB3aGV0aGVyIGFuIGFjdGlvbi9vcGVyYXRpb24gY2FuIGNvbnRpbnVlLiBUaGUgYm9vbGVhbiBhcnJheQotCSAqIHdpbGwgcmV0dXJuIHR3byBib29sZWFucy4gVGhlIGZpcnN0IGluZGljYXRlcyB0aGVpciByZXNwb25zZSB0byB0aGUgb3JpZ2luYWwgcXVlc3Rpb24gYW5kIHRoZQotCSAqIHNlY29uZCBpbmRpY2F0ZXMgaWYgdGhleSBzZWxlY3RlZCB0aGUgYXBwbHkgdG8gYWxsIGNoZWNrIGJveC4KLQkgKiAKLQkgKiBSZXR1cm4gdGhlIHJldHVybiBjb2RlIGZvciB0aGUgZGlhbG9nLiAwID0gWWVzLCAxID0gWWVzIHRvIGFsbCwgMiA9IE5vCi0JICovCi0JcHVibGljIGludCBjYW5Db250aW51ZVdpdGhBbGxDaGVjayhTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFBhcmVudFNoZWxsKCksIGdldENvbmZpcm1UaXRsZSgpLCBudWxsLCAvLyBhY2NlcHQKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93Ci0JCQkJCS8vIGljb24KLQkJCQkJbWVzc2FnZSwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUx9LCAxKTsgLy8geWVzCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5vcGVyYXRpb25zLklPcGVyYXRpb25IYW5kbGVyI2NhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgaW50IGNhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDEpOyAvLyB5ZXMKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQW4gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0UGFyZW50U2hlbGwoKSwgZ2V0RXJyb3JUaXRsZSgpLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGlhbG9nIHRpdGxlIHRvIGJlIHVzZWQgZm9yIGNvbmZpcm1hdGlvbnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb25maXJtVGl0bGUoKSB7Ci0JCXJldHVybiBjb25maXJtVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRpYWxvZyB0aXRsZSB0byBiZSB1c2VkIGZvciBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFcnJvclRpdGxlKCkgewotCQlyZXR1cm4gZXJyb3JUaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGlhbG9nIHRpdGxlIHRvIGJlIHVzZWQgZm9yIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW5mb3JtYXRpb25UaXRsZSgpIHsKLQkJcmV0dXJuIGluZm9ybWF0aW9uVGl0bGU7Ci0JfQotCi0JcHVibGljIFNoZWxsIGdldFBhcmVudFNoZWxsKCkgewotCQlpZiAocGFyZW50U2hlbGwgPT0gbnVsbCkKLQkJCXBhcmVudFNoZWxsID0gV1RQVUlQbHVnaW4uZ2V0UGx1Z2luV29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQotCQlyZXR1cm4gcGFyZW50U2hlbGw7Ci0JfQotCi0JLyoqCi0JICogQW4gaW5mb3JtYXRpb25hbCBtZXNzYWdlIG5lZWRzIHRvIGJlIHByZXNlbnRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRQYXJlbnRTaGVsbCgpLCBnZXRJbmZvcm1hdGlvblRpdGxlKCksIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvOS8yMDAxIDExOjUxOjM2IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdDb25maXJtVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maXJtVGl0bGUoamF2YS5sYW5nLlN0cmluZyBuZXdDb25maXJtVGl0bGUpIHsKLQkJY29uZmlybVRpdGxlID0gbmV3Q29uZmlybVRpdGxlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvOS8yMDAxIDExOjUxOjM2IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFcnJvclRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JUaXRsZShqYXZhLmxhbmcuU3RyaW5nIG5ld0Vycm9yVGl0bGUpIHsKLQkJZXJyb3JUaXRsZSA9IG5ld0Vycm9yVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC85LzIwMDEgMTE6NTE6MzYgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld0luZm9ybWF0aW9uVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvblRpdGxlKGphdmEubGFuZy5TdHJpbmcgbmV3SW5mb3JtYXRpb25UaXRsZSkgewotCQlpbmZvcm1hdGlvblRpdGxlID0gbmV3SW5mb3JtYXRpb25UaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlciNnZXRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRTaGVsbCgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJVGVzdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSVRlc3RlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3YmE3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJVGVzdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJVGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBVSVRlc3RlckltcGwgaW1wbGVtZW50cyBVSVRlc3RlciB7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFVJVGVzdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5VSVRlc3RlciNpc0N1cnJlbnRDb250ZXh0VUkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3VycmVudENvbnRleHRVSSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpIHx8IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuaXNDbG9zaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZSwgd29ya2JlbmNoIG11c3Qgbm90IGJlIHJ1bm5pbmcKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9WYWxpZGF0aW9uU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1ZhbGlkYXRpb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4ZjZiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1ZhbGlkYXRpb25TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCBlbmNvbXBhcyBhIHNldCBvZiBWYWxpZGF0aW9uIHN0YXR1cyBDcmVhdGlvbiBkYXRlOiAoOS8xMC8yMDAxIDU6MzU6MTIgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25TdGF0dXMgewotCi0JLy8gVE9ETyBtYWtlIGFsbCB0aGVzZSB2YXJzIHByaXZhdGUgYW5kIGNoYW5nZSBlcnJNc2dzICYgZXJyU3RhdHVzIHRvIG1hcHMgc28gdGhlIHNhbWUgbWV0aG9kcwotCS8vIGNhbiBiZSB1c2VkIGFzIHdpdGggd2FybmluZ3MgJiBpbmZvCi0JSGFzaHRhYmxlIGVyck1zZ3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JSGFzaHRhYmxlIGVyclN0YXR1cyA9IG5ldyBIYXNodGFibGUoKTsKLQlIYXNodGFibGUgdENvbnRyb2xzID0gbmV3IEhhc2h0YWJsZSgpOwotCU1hcCB3YXJuTXNnczsKLQlNYXAgd2FyblN0YXR1czsKLQlNYXAgaW5mb01zZ3M7Ci0JTWFwIGluZm9TdGF0dXM7Ci0KLQkvKioKLQkgKiBWYWxpZGF0aW9uU3RhdHVzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25TdGF0dXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBMb29rIGZvciBhbnkgZXJyb3IuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIHJldHVybiBlcnJvcnMgYWNjb3JkaW5nIHRvIHRoZWlyIGtleS4gaS5lLiwKLQkgKiBsb3dlciBrZXkgZXJyb3JzIHdpbGwgYmUgcmV0dXJuZWQgZmlyc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXN0RXJyTXNnKCkgewotCQkvL1RPRE8gb25jZSBpdmFycyBhcmUgY2hhbmdlZCB0byBtYXBzLCBwYXNzIHRoaXMgdG8gZ2V0TGFzdE1zZygpCi0JCUVudW1lcmF0aW9uIGUgPSBlcnJTdGF0dXMua2V5cygpOwotCQlTdHJpbmdbXSBlcnJzID0gbmV3IFN0cmluZ1tlcnJTdGF0dXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJzLmxlbmd0aDsgaSsrKQotCQkJZXJyc1tpXSA9IG51bGw7Ci0JCWJvb2xlYW4gZm91bmRPbmUgPSBmYWxzZTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUludGVnZXIga2V5ID0gKEludGVnZXIpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghKChCb29sZWFuKSBlcnJTdGF0dXMuZ2V0KGtleSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJZXJyc1trZXkuaW50VmFsdWUoKSAlIGVycnMubGVuZ3RoXSA9IChTdHJpbmcpIGVyck1zZ3MuZ2V0KGtleSk7Ci0JCQkJZm91bmRPbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChmb3VuZE9uZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXJycy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoZXJyc1tpXSAhPSBudWxsKQotCQkJCQlyZXR1cm4gZXJyc1tpXTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0V2FybmluZ01zZ3MoKSB7Ci0JCWlmICh3YXJuTXNncyA9PSBudWxsKQotCQkJd2Fybk1zZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gd2Fybk1zZ3M7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0V2FybmluZ1N0YXR1c01hcCgpIHsKLQkJaWYgKHdhcm5TdGF0dXMgPT0gbnVsbCkKLQkJCXdhcm5TdGF0dXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gd2FyblN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRJbmZvTXNncygpIHsKLQkJaWYgKGluZm9Nc2dzID09IG51bGwpCi0JCQlpbmZvTXNncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBpbmZvTXNnczsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRJbmZvU3RhdHVzTWFwKCkgewotCQlpZiAoaW5mb1N0YXR1cyA9PSBudWxsKQotCQkJaW5mb1N0YXR1cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBpbmZvU3RhdHVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdFdhcm5pbmdNc2coKSB7Ci0JCXJldHVybiBnZXRMYXN0TXNnKHdhcm5TdGF0dXMsIHdhcm5Nc2dzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhc3RJbmZvTXNnKCkgewotCQlyZXR1cm4gZ2V0TGFzdE1zZyhpbmZvU3RhdHVzLCBpbmZvTXNncyk7Ci0JfQotCi0JLyoKLQkgKiBMb29rIGZvciBhbnkgc3RhdHVzLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLCByZXR1cm4gc3RhdHVzIGFjY29yZGluZyB0byB0aGVpciBrZXkuIGkuZS4sCi0JICogbG93ZXIga2V5IHN0YXR1cyB3aWxsIGJlIHJldHVybmVkIGZpcnN0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExhc3RNc2coTWFwIHN0YXR1c01hcCwgTWFwIG1zZ01hcCkgewotCQlpZiAoc3RhdHVzTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHN0YXR1c01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBpbmZvcyA9IG5ldyBTdHJpbmdbc3RhdHVzTWFwLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspCi0JCQlpbmZvc1tpXSA9IG51bGw7Ci0JCWJvb2xlYW4gZm91bmRPbmUgPSBmYWxzZTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJbnRlZ2VyIGtleSA9IChJbnRlZ2VyKSBlLm5leHQoKTsKLQkJCWlmICghKChCb29sZWFuKSBzdGF0dXNNYXAuZ2V0KGtleSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaW5mb3Nba2V5LmludFZhbHVlKCkgJSBpbmZvcy5sZW5ndGhdID0gKFN0cmluZykgbXNnTWFwLmdldChrZXkpOwotCQkJCWZvdW5kT25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoZm91bmRPbmUpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKQotCQkJCWlmIChpbmZvc1tpXSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW5mb3NbaV07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdEVyck1zZ0FuZEZvY3VzKCkgewotCi0JCUVudW1lcmF0aW9uIGUgPSBlcnJTdGF0dXMua2V5cygpOwotCi0JCUludGVnZXIgdGhlT25lID0gbnVsbDsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUludGVnZXIga2V5ID0gKEludGVnZXIpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghKChCb29sZWFuKSBlcnJTdGF0dXMuZ2V0KGtleSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKHRoZU9uZSA9PSBudWxsIHx8IGtleS5pbnRWYWx1ZSgpIDwgdGhlT25lLmludFZhbHVlKCkpIHsKLQkJCQkJdGhlT25lID0ga2V5OwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodGhlT25lICE9IG51bGwpIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSB0Q29udHJvbHMuZ2V0KHRoZU9uZSk7Ci0JCQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJY29udHJvbC5zZXRGb2N1cygpOwotCQkJfQotCQkJcmV0dXJuICgoU3RyaW5nKSBlcnJNc2dzLmdldCh0aGVPbmUpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcihJbnRlZ2VyIGtleSkgewotCQlCb29sZWFuIHN0YXQgPSAoQm9vbGVhbikgZXJyU3RhdHVzLmdldChrZXkpOwotCQlpZiAoc3RhdCAhPSBudWxsKQotCQkJcmV0dXJuIHN0YXQuYm9vbGVhblZhbHVlKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRyb2woSW50ZWdlciBrZXksIENvbnRyb2wgY29udHJvbCkgewotCQl0Q29udHJvbHMucHV0KGtleSwgY29udHJvbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdGF0dXMoSW50ZWdlciBrZXksIEJvb2xlYW4gc3RhdHVzLCBTdHJpbmcgbXNnKSB7Ci0JCWVyck1zZ3MucHV0KGtleSwgbXNnKTsKLQkJZXJyU3RhdHVzLnB1dChrZXksIHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBtc2cpIHsKLQkJZXJyTXNncy5wdXQoa2V5LCBtc2cpOwotCQllcnJTdGF0dXMucHV0KGtleSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXYXJuaW5nU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgbXNnKSB7Ci0JCWdldFdhcm5pbmdNc2dzKCkucHV0KGtleSwgbXNnKTsKLQkJZ2V0V2FybmluZ1N0YXR1c01hcCgpLnB1dChrZXksIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5mb1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIG1zZykgewotCQlnZXRJbmZvTXNncygpLnB1dChrZXksIG1zZyk7Ci0JCWdldEluZm9TdGF0dXNNYXAoKS5wdXQoa2V5LCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9LU3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCWVyck1zZ3MucHV0KGtleSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVyclN0YXR1cy5wdXQoa2V5LCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCWlmICh3YXJuTXNncyAhPSBudWxsKQotCQkJd2Fybk1zZ3MucHV0KGtleSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh3YXJuU3RhdHVzICE9IG51bGwpCi0JCQl3YXJuU3RhdHVzLnB1dChrZXksIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJaWYgKGluZm9Nc2dzICE9IG51bGwpCi0JCQlpbmZvTXNncy5wdXQoa2V5LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZm9TdGF0dXMgIT0gbnVsbCkKLQkJCWluZm9TdGF0dXMucHV0KGtleSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhJbnRlZ2VyIGtleSwgYm9vbGVhbiBvaywgU3RyaW5nIG1zZykgewotCQllcnJNc2dzLnB1dChrZXksIG1zZyk7Ci0JCWVyclN0YXR1cy5wdXQoa2V5LCBuZXcgQm9vbGVhbihvaykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ0MGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBsdWdpbkNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLldvcmtiZW5jaEFjdGl2aXR5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5hY3Rpdml0aWVzLldUUEFjdGl2aXR5QnJpZGdlSGVscGVyOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbCBpbXBsZW1lbnRzIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgPSBudWxsOwotCXByaXZhdGUgSUFjdGl2aXR5TWFuYWdlciBhY3Rpdml0eU1hbmFnZXIgPSBudWxsOwotCi0JcHVibGljIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbCgpIHsKLQkJd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKTsKLQkJYWN0aXZpdHlNYW5hZ2VyID0gd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0LmdldEFjdGl2aXR5TWFuYWdlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuYWJsZUFjdGl2aXR5KFN0cmluZyBhY3Rpdml0eUlELCBib29sZWFuIGVuYWJsZWQpIHsKLQkJU2V0IGVuYWJsZWRBY3Rpdml0aWVzID0gYWN0aXZpdHlNYW5hZ2VyLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpOwotCQlTZXQgbmV3RW5hYmxlZEFjdGl2aXRpZXMgPSBudWxsOwotCQlpZiAoZW5hYmxlZCAmJiAhZW5hYmxlZEFjdGl2aXRpZXMuY29udGFpbnMoYWN0aXZpdHlJRCkpIHsKLQkJCW5ld0VuYWJsZWRBY3Rpdml0aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCW5ld0VuYWJsZWRBY3Rpdml0aWVzLmFkZEFsbChlbmFibGVkQWN0aXZpdGllcyk7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcy5hZGQoYWN0aXZpdHlJRCk7Ci0JCX0KLQkJaWYgKCFlbmFibGVkICYmIGVuYWJsZWRBY3Rpdml0aWVzLmNvbnRhaW5zKGFjdGl2aXR5SUQpKSB7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcy5hZGRBbGwoZW5hYmxlZEFjdGl2aXRpZXMpOwotCQkJbmV3RW5hYmxlZEFjdGl2aXRpZXMucmVtb3ZlKGFjdGl2aXR5SUQpOwotCQl9Ci0JCWlmIChudWxsICE9IG5ld0VuYWJsZWRBY3Rpdml0aWVzKSB7Ci0JCQl3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQuc2V0RW5hYmxlZEFjdGl2aXR5SWRzKG5ld0VuYWJsZWRBY3Rpdml0aWVzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTZXQgZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCkgewotCQlyZXR1cm4gYWN0aXZpdHlNYW5hZ2VyLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRBY3Rpdml0eUlkcyhTZXQgYWN0aXZpdHlJRHMpIHsKLQkJd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0LnNldEVuYWJsZWRBY3Rpdml0eUlkcyhhY3Rpdml0eUlEcyk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRBY3Rpdml0eUlEc0Zyb21Db250cmlidXRpb24oZmluYWwgU3RyaW5nIGxvY2FsSUQsIGZpbmFsIFN0cmluZyBwbHVnaW5JRCkgewotCQlJSWRlbnRpZmllciBpZGVudGlmaWVyID0gYWN0aXZpdHlNYW5hZ2VyLmdldElkZW50aWZpZXIoV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuY3JlYXRlVW5pZmllZElkKG5ldyBJUGx1Z2luQ29udHJpYnV0aW9uKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRMb2NhbElkKCkgewotCQkJCXJldHVybiBsb2NhbElEOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQkJCXJldHVybiBwbHVnaW5JRDsKLQkJCX0KLQkJfSkpOwotCQlyZXR1cm4gaWRlbnRpZmllci5nZXRBY3Rpdml0eUlkcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTAyMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBBY3Rpdml0eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBsdWdpbkNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0OwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdUUEFjdGl2aXR5SGVscGVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgVUkgaXMgc2V0IHVwIHRvIGZpbHRlciBjb250cmlidXRpb25zIChoYXMgZGVmaW5lZCBhY3Rpdml0eSBjYXRlZ29yaWVzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNGaWx0ZXJpbmcoKSB7Ci0JCXJldHVybiAhUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKS5nZXREZWZpbmVkQWN0aXZpdHlJZHMoKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbG93VXNlT2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIWlzRmlsdGVyaW5nKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQbHVnaW5Db250cmlidXRpb24pIHsKLQkJCUlQbHVnaW5Db250cmlidXRpb24gY29udHJpYnV0aW9uID0gKElQbHVnaW5Db250cmlidXRpb24pIG9iamVjdDsKLQkJCWlmIChjb250cmlidXRpb24uZ2V0UGx1Z2luSWQoKSAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpOwotCQkJCUlJZGVudGlmaWVyIGlkZW50aWZpZXIgPSB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQuZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0SWRlbnRpZmllcihjcmVhdGVVbmlmaWVkSWQoY29udHJpYnV0aW9uKSk7Ci0JCQkJcmV0dXJuIGlkZW50aWZpZXIuaXNFbmFibGVkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjcmVhdGVVbmlmaWVkSWQoSVBsdWdpbkNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24pIHsKLQkJaWYgKGNvbnRyaWJ1dGlvbi5nZXRQbHVnaW5JZCgpICE9IG51bGwpCi0JCQlyZXR1cm4gY29udHJpYnV0aW9uLmdldFBsdWdpbklkKCkgKyAnLycgKyBjb250cmlidXRpb24uZ2V0TG9jYWxJZCgpOwotCQlyZXR1cm4gY29udHJpYnV0aW9uLmdldExvY2FsSWQoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDU3MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAyMywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gInd0cGNvbW1vbnVpIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0X2xvY2F0aW9uXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBPcGVyYXRpb25BY3Rpb25fVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXN0ZXJEZXNjcmlwdG9yX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQT3B0aW9uYWxPcGVyYXRpb25EYXRhTW9kZWxfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBPcGVyYXRpb25BY3Rpb25fVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBPcHRpb25hbE9wZXJhdGlvbkRhdGFNb2RlbF9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1VTFRJUExFX01PRFVMRV9QUkVGX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUFjdGlvbldUUE9wZXJhdGlvbl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hc3RlckRlc2NyaXB0b3JfRVJST1JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBXaXphcmRfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBXaXphcmRfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBXaXphcmRfVUlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcm93c2VfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVuZGFibGVXaXphcmRfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlbmRlZFdpemFyZFBhZ2VfRVJST1JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlbmRlZFdpemFyZFBhZ2VfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBBY3Rpb25EaWFsb2dfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaW1lclF1ZXVlX0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGltZXJfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaW1lcl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVfVUlfMDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEdlbmVyaWNBY3Rpb25JZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQR2VuZXJpY0FjdGlvbklkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWFhNDUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQR2VuZXJpY0FjdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdUUEdlbmVyaWNBY3Rpb25JZHMgewotCi0JU3RyaW5nIENVVCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuQ3V0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT1BZID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZ2VuZXJpYy5Db3B5IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQQVNURSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuUGFzdGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuUmVuYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5nZW5lcmljLkRlbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUFVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjdjYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgV1RQVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfVklFV0VSX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCA9ICJleHRlbmRlZFZpZXdlciI7IC8vJE5PTi1OTFMtMSQKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdUUFVJUGx1Z2luIHBsdWdpbjsKLQkvLyBSZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1RQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVFcnJvclN0YXR1cyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIC0xLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdUUFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcihQTFVHSU5fSUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgd29ya2JlbmNoCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWwgdG8gdGhlIGoyZWUgcGx1Z2luIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2ggZ2V0UGx1Z2luV29ya2JlbmNoKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBSdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIgZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoZmluYWwgSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlT3BlcmF0aW9uV3JhcHBlcihvcGVyYXRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBXVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgVGhyb3dhYmxlIGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICsgIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgZSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgSVN0YXR1cyBzdGF0dXMgKQotICAgIHsKLSAgICAgICAgZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyggc3RhdHVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCApICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGM4NDE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBBbiBvcGVyYXRpb24gd2hpY2ggZGVsZWdhdGVzIGl0cyB3b3JrIHRvIGEgcnVubmFibGUgdGhhdCBtb2RpZmllcyB0aGUgd29ya3NwYWNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiB7Ci0JcHJpdmF0ZSBMaXN0IGZSdW5uYWJsZXM7Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJc3VwZXIocnVsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gd2hpY2ggd2lsbCBkZWxlZ2F0ZSBpdHMgd29yayB0byB0aGUgZ2l2ZW4gcnVubmFibGUuCi0JICovCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJU2NoZWR1bGluZ1J1bGUgcnVsZSwgTGlzdCBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIocnVsZSk7Ci0JCWdldFJ1bm5hYmxlcygpLmFkZEFsbChuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihMaXN0IG5lc3RlZFJ1bm5hYmxlc1dpdGhQcm9ncmVzcykgewotCQlzdXBlcigpOwotCQlnZXRSdW5uYWJsZXMoKS5hZGRBbGwobmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG9wZXJhdGlvbiB3aGljaCB3aWxsIGRlbGVnYXRlIGl0cyB3b3JrIHRvIHRoZSBnaXZlbiBydW5uYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqICAgICAgICAgICAgdGhlIHJ1bm5hYmxlIHRvIGRlbGVnYXRlIHRvIHdoZW4gdGhpcyBvcGVyYXRpb24gaXMgZXhlY3V0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG5lc3RlZE9wKSB7Ci0JCXN1cGVyKCk7Ci0JCWdldFJ1bm5hYmxlcygpLmFkZChuZXN0ZWRPcCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkUnVubmFibGUoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG5lc3RlZE9wKSB7Ci0JCXJldHVybiBnZXRSdW5uYWJsZXMoKS5hZGQobmVzdGVkT3ApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0cnl7Ci0JCQlMaXN0IHJ1bm5hYmxlcyA9IGdldFJ1bm5hYmxlcygpOwotCQkJaWYocnVubmFibGVzLnNpemUoKSA9PSAwKXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgcnVubmFibGVzLnNpemUoKSk7Ly8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW5uYWJsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSAoSVJ1bm5hYmxlV2l0aFByb2dyZXNzKSBydW5uYWJsZXMuZ2V0KGkpOwotCQkJCW9wLnJ1bihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSykpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSdW5uYWJsZXMoKSB7Ci0JCWlmIChmUnVubmFibGVzID09IG51bGwpCi0JCQlmUnVubmFibGVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJcmV0dXJuIGZSdW5uYWJsZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOGZlMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+d3RwIG9wZXJhdGlvbiBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD4KLQkJCVRoZSBXVFAgV2l6YXJkIEFQSSBhbGxvd3MgY2xpZW50cyB0byBidWlsZCB3aXphcmRzIGluIGNvbmp1bmN0aW9uIHdpdGgKLQkJCXRoZSBXVFAgT3BlcmF0aW9uIEZyYW1ld29yayBxdWlja2x5IGFuZCB3aXRoIG1pbmltYWwgZWZmb3J0LgotCQk8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5VbmRlciBDb25zdHJ1Y3Rpb24uPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEwIj4KLTx0cj4KLTx0ZD4KLTxwPgotPGltZyBzcmM9ImVzY2FwZV9vdXRfdG9fc291cmNlX2ZvbGRlciBsZXZlbC9vdmVydmlldy95b3VyX2ltYWdlLmpwZyI+PC9wPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpPkZpZ3VyZSAxOiBJbWFnZSBkZXNjcmlwdGlvbjwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjE3YTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0JPGhlYWQ+Ci0JCTxtZXRhCi0JCQluYW1lPSJyb290IgotCQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCQk8dGl0bGU+d3RwIG9wZXJhdGlvbiBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotCTwvaGVhZD4KLQotCTxib2R5PgotCQk8YWJzdHJhY3Q+Ci0JCQlUaGUgV1RQIFdpemFyZCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gYnVpbGQgd2l6YXJkcyBpbiBjb25qdW5jdGlvbiB3aXRoCi0JCQl0aGUgV1RQIE9wZXJhdGlvbiBGcmFtZXdvcmsgcXVpY2tseSBhbmQgd2l0aCBtaW5pbWFsIGVmZm9ydC4KLQkJPC9hYnN0cmFjdD4KLQkJPHA+VW5kZXIgQ29uc3RydWN0aW9uLjwvcD4KLQkJPGltZyBzcmM9ImVzY2FwZV9vdXRfdG9fc291cmNlX2ZvbGRlciBsZXZlbC9vdmVydmlldy95b3VyX2ltYWdlLmpwZyIgY2FwdGlvbj0iSW1hZ2UgZGVzY3JpcHRpb24iIC8+Ci0JPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTkxNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1ub25fd29ya2JlbmNoLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Mjg1ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotY29tbW9uX2NvcmUuamFyCi1jb21tb24uamFyCi1jb21tb25fY29yZXNyYy56aXAKLWNvbW1vbnNyYy56aXAKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYWFiOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW9yZy5lY2xpcHNlLnd0cC5jb21tb24vZGVidWcvbG9ndHJhY2U9ZmFsc2UKLW9yZy5lY2xpcHNlLnd0cC5jb21tb24vZGVidWcvbG9ndHJhY2VmaWxlPWZhbHNlCi1vcmcuZWNsaXBzZS53dHAuY29tbW9uL2RlYnVnL2xvZ2xldmVsPVdBUk5JTkcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY0NThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5MGI1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jU2F0IE1hciAyNCAwMjowNzoxOCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDk0YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmFjdGl2aXRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbjt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMTAwLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDAsMi4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwMTExNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbAotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHNyYy1ub25fd29ya2JlbmNoLyxcCi0gICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE1MjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIj4KLSAgPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiIGZyYWdtZW50PSJmYWxzZSIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiBmcmFnbWVudD0iZmFsc2UiLz4KLQotICA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij4KLSAgICA8dHlwZSBuYW1lPSJDaG9pY2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IkVudmlyb25tZW50RXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJFbnZpcm9ubWVudFNlcnZpY2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklFbnZpcm9ubWVudCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJTG9nIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklTdGF0dXNIYW5kbGVyIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9Ik51bGxTdGF0dXNIYW5kbGVyIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJTdGF0dXNFeGNlcHRpb24iIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICA8L3BhY2thZ2U+Ci0gCi0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj4KLSAgICA8dHlwZSBuYW1lPSJJVVJJIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklVUklGYWN0b3J5IiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklVUklGaWx0ZXIiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iSVVSSVNjaGVtZSIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJVVJJVmlzaXRvciIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJTaW1wbGVVUklGYWN0b3J5IiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJVUklFeGNlcHRpb24iIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICA8L3BhY2thZ2U+Ci0KLSAgPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbCI+PC9wYWNrYWdlPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZkMjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlcj1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1Db21tb24gRnJhbWV3b3JrcwotT3BlcmF0aW9uRXh0ZW5zaW9uPU9wZXJhdGlvbkV4dGVuc2lvbgotRnVuY3Rpb25fRXh0ZW5zaW9uX0dyb3VwPUZ1bmN0aW9uIEV4dGVuc2lvbiBHcm91cAotV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXI9V1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIKLURhdGFNb2RlbFByb3ZpZGVyPURhdGFNb2RlbFByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjMjA1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Ik9wZXJhdGlvbkV4dGVuc2lvbiIgbmFtZT0iJU9wZXJhdGlvbkV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvT3BlcmF0aW9uRXh0ZW5zaW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImZ1bmN0aW9uR3JvdXAiIG5hbWU9IiVGdW5jdGlvbl9FeHRlbnNpb25fR3JvdXAiIHNjaGVtYT0ic2NoZW1hL2Z1bmN0aW9uR3JvdXAuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiIG5hbWU9IiVXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciIgc2NoZW1hPSJzY2hlbWEvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iIG5hbWU9IiVEYXRhTW9kZWxQcm92aWRlciIgc2NoZW1hPSJzY2hlbWEvRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24uZXhzZCIvPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29udGV4dC5TZW5zaXRpdmUuQ2xhc3Muc2F2ZUhhbmRsZXIiCi0gICAgICAgICBuYW1lPSJTYXZlIEhhbmRsZXIgLSBIZWFkbGVzcyBDb250ZXh0IENsYXNzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAga2V5PSJzYXZlSGFuZGxlciIKLSAgICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUhhbmRsZXJIZWFkbGVzcyI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBrZXk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5FbmFibGVtZW50RGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50TWFuYWdlciI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAga2V5PSJJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCIKLSAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MiCi0gICAgICAgICAgY29udGV4dD0iSGVhZGxlc3MiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4YzdkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmNvbW1vbiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3NyYyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3NyYyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLQotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL0RhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxOTg0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIgaWQ9IkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIiBuYW1lPSJEYXRhIE1vZGVsIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIGFuIGV4aXN0aW5nIGRhdGEgbW9kZWwgcHJvdmlkZXIgd2l0aCBhIGN1c3RvbSBkYXRhIG1vZGVsIHByb3ZpZGVyLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJEYXRhTW9kZWxQcm92aWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iUHJvdmlkZXJEZWZpbmVzVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iUHJvdmlkZXJJbXBsZW1lbnRzVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IkRhdGFNb2RlbFByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgbW9kZWwgcHJvdmlkZXIgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCBwcm92aWRlciB0byBleHRlbmQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iUHJvdmlkZXJEZWZpbmVzVHlwZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3ZpZGVyVHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdHlwZSB0aGUgZGF0YSBtb2RlbCBwcm92aWRlciBkZWZpbmVzCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvdmlkZXJJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICByZXF1aXJlZCBpZGVudGlmaWVyIGZvciB0aGUgZGVmaW5lZCB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IlByb3ZpZGVySW1wbGVtZW50c1R5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm92aWRlclR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIHR5cGUgdGhlIGRhdGEgbW9kZWwgcHJvdmlkZXIgaW1wbGVtZW50cwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3ZpZGVySUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgaWRlbnRpZmllciBmb3IgdGhlIGltcGxlbWVudGVkIHR5cGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL09wZXJhdGlvbkV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL09wZXJhdGlvbkV4dGVuc2lvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmYxZWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9PcGVyYXRpb25FeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiBpZD0iT3BlcmF0aW9uRXh0ZW5zaW9uIiBuYW1lPSJPcGVyYXRpb24gRXh0ZW5zaW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgaXMgdGhlIG1ldGhvZG9sb2d5IGZvciBleHRlbmRpbmcgYW4gZXhpc3Rpbmcgb3BlcmF0aW9uIGJ5IGFkZGluZyBlaXRoZXIgYSBwcmUgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIHByaW9yLCBvciBhIHBvc3Qgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBvcmlnaW5hbCBvcGVyYXRpb24uDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvcGVyYXRpb25FeHRlbnNpb24iLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im9wZXJhdGlvbkV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlT3BlcmF0aW9uQ2xhc3MiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHByZS1vcGVyYXRpb24gY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9zdE9wZXJhdGlvbkNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3N0LW9wZXJhdGlvbiBjbGFzcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICByZXF1aXJlZCBpZCBvZiB0aGUgb3BlcmF0aW9uIHRvIGV4dGVuZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2Q1MGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiIGlkPSJXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciIgbmFtZT0iV1RQIEFjdGl2aXR5IEJyaWRnZSBIZWxwZXIiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYWN0aXZpdHkgYnJpZGdlIGhlbHBlciB3aGljaCBpcyB1c2VmdWwgd2hlbiBlbmFibGluZyBjYXBhYmlsaXRpZXMuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIgY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL2Z1bmN0aW9uR3JvdXAuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9mdW5jdGlvbkdyb3VwLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDk1OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL2Z1bmN0aW9uR3JvdXAuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiBpZD0iZnVuY3Rpb25Hcm91cCIgbmFtZT0iRnVuY3Rpb24gRXh0ZW5zaW9uIEdyb3VwIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIEEgZnVuY3Rpb25Hcm91cCBwcm92aWRlcyBhIGdyb3VwaW5nIG9mIHJlbGF0ZWQgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY29udHJpYnV0ZWQgdG8gdGhlIHRvb2xzLiAgRm9yIGV4YW1wbGUsIGEgdGhpcmQgcGFydHkgY29tcG9uZW50IG1heSB3YW50IHRvIGNvbnRyaWJ1dGUgYWN0aW9ucywgZWRpdG9yIHBhZ2VzLCBlZGl0IG1vZGVsIHJlc291cmNlcywgYW5kIG1hbnkgb3RoZXIgZnVuY3Rpb25zIHNwZWNpZmljIHRvIGEgZ2l2ZW4gcHJvZHVjdC4gIEJ5IGFzc29jaWF0aW5nIGFsbCB0aGVzZSBmdW5jdGlvbnMgd2l0aCBhIGdyb3VwIGlkLCBhIG1lY2hhbmlzbSBpcyBleHBvc2VkIGZvciB1c2VycyB0byBzZWxlY3RpdmVseSBlbmFibGUgYW5kIGRpc2FibGUgYmFza2V0cyBvZiBmdW5jdGlvbi4gIEV4dGVuc2lvbiBwb2ludHMgdGhhdCBhbGxvdyBmb3IgYSAmcXVvdDtncm91cElEJnF1b3Q7IGF0dHJpYnV0ZSBnZW5lcmFsbHkgd2lsbCBoaWRlIHRob3NlIGZ1bmN0aW9ucyB3aGVuIHRoZSBncm91cCBpZCBpcyBkaXNhYmxlZC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmdW5jdGlvbkdyb3VwIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L2Nob2ljZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmdW5jdGlvbkdyb3VwIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFeHRlbnNpb24gcG9pbnQgZGVmaW5pdGlvbiBmb3IgYSBncm91cC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uR3JvdXBJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhlIGdyb3VwLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgaHVtYW4gcmVhZGFibGUgbmFtZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgZ3JvdXAuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgcGF0aCB0byBhbiBpY29uIGltYWdlLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgdXJsIGZvciB0aGUgZnVuY3Rpb24gZ3JvdXAuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE9yZGVyaW5nIG1hZ25pdHVkZSBvZiBwbHVnaW5zDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImluaXRpYWxpemVyQ2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIENsYXNzIHVzZWQgdG8gZGV0ZXJtaW5lIHBsdWdpbiBlbmFibGVtZW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmciPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBhbGxvd3Mgb25lIHRvIGJpbmQgZnVuY3Rpb24gZ3JvdXBzIHRvIHBhdHRlcm5zLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZnVuY3Rpb25Hcm91cElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZnVuY3Rpb24gZ3JvdXAgdG8gYmluZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGF0dGVybiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgcGF0dGVybiB0byBiZSBib3VuZC4gUGF0dGVybnMgYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hpY2ggbWF0Y2ggdW5pcXVlIGlkZW50aWZpZXJzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmZ1bmN0aW9uR3JvdXAmcXVvdDsmZ3Q7DQotICAgICAgJmx0O2Z1bmN0aW9uR3JvdXANCi0gICAgICAgICAgICBuYW1lPSZxdW90O0FjbWUgQ28uIEZ1bmN0aW9uIEV4dGVuc2lvbiZxdW90Ow0KLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0mcXVvdDtjb20uYWNtZS5hY21lcHJvJnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7VGhlIEFjbWVQcm8gRXh0ZW5zaW9ucyBhZGQgaW50ZWdyYXRpb24gdG8gdGhlIEFjbWUgV2ViIFNlcnZlci4mcXVvdDsNCi0gICAgICAgICAgICBlbmFibGVkQnlEZWZhdWx0PSZxdW90O3RydWUmcXVvdDsNCi0gICAgICAgICAgICBpY29uPSZxdW90Oy4uLiZxdW90Ow0KLSAgICAgICAgICAgIHVybD0mcXVvdDtodHRwOi8vd3d3LmFjbWUuY29tLyZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9JV0ZUV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvSVdGVFdyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyYmFmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9JV0ZUV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpOwotCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIEFyY2hpdmVSdW50aW1lIGFuZCBBcmNoaXZlV3JhcHBlZCBleGNlcHRpb25zLCB3aGljaCBjYW4gY29udGFpbiBuZXN0ZWQKLSAqIGV4Y2VwdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJV0ZUV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0bwotCSAqIGlubmVybW9zdCwgY29uY2F0ZW5hdGVkIGFzIG9uZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKTsKLQotCXB1YmxpYyBFeGNlcHRpb24gZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLQotCXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldE5lc3RlZEV4Y2VwdGlvbigpOwotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCk7Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKTsKLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dGVFdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dGVFdyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1OWM5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9XRlRXcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWk7Ci0KLS8vaW1wb3J0IGNvbS5pYm0uZXRvb2xzLndmdC5ubHMuV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXI7Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNC8wMy8wMSAxMToxMjo1MSBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgV0ZUV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY4ODUwNDQyNzczNzc3ODQ0MjlMOwotCi0JLyoqCi0JICogV0ZUV3JhcHBlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBXRlRXcmFwcGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICovCi0JcHVibGljIFdGVFdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCkgewotCQlzdXBlcih0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgV0ZUV3JhcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgdGFyZ2V0LCBTdHJpbmcgcykgewotCQlzdXBlcih0YXJnZXQsIHMpOwotCX0KLQotCS8qKgotCSAqIFByaW50IG91dCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBzeXN0ZW0gZXJyLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQkJcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcykgewotCQlpZiAoZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJLy9UT0RPIGFkZCB0aGlzIGJhY2sgaW4KLQkJCS8vIHMucHJpbnRsbihXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VSUk9SXyIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQgPSAiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiCi0JCQlnZXRUYXJnZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpIHsKLQkJaWYgKGdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCS8vVE9ETyBhZGQgdGhpcyBiYWNrIGluCi0JCQkvLyBzLnByaW50bG4oV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FUlJPUl8iKSk7Ci0JCQkvLyAvLyROT04tTkxTLTEkID0gIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246IgotCQkJZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dvcmtiZW5jaFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dvcmtiZW5jaFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjYWM3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9Xb3JrYmVuY2hVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpOwotCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoVXRpbCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gV29ya2JlbmNoUnVubmluZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBXb3JrYmVuY2hVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIHdvcmtiZW5jaElzUnVubmluZygpIC0gdGVzdCB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgcnVubmluZyBpbiB0aGUgd29ya2JlbmNoIGVudmlyb25tZW50LgotCSAqIAotCSAqIEBzZWUgSmF2YVBsdWdpbi5zdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd29ya2JlbmNoSXNSdW5uaW5nKCkgewotCQlyZXR1cm4gV29ya2JlbmNoUnVubmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdG8gdHJ1ZSBpZiB5b3UgYXJlIHJ1bm5pbmcgaW4gYSBXb3JrYmVuY2ggZW52aXJvbm1lbnQuCi0JICogCi0JICogQHNlZSBKYXZhUGx1Z2luLnN0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrYmVuY2hJc1J1bm5pbmcoYm9vbGVhbiBhQm9vbGVhbikgewotCQlXb3JrYmVuY2hSdW5uaW5nID0gYUJvb2xlYW47Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNWIyMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotCi0vKioKLSAqIDxwPgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gZm9yIGFuIElEYXRhTW9kZWxPcGVyYXRpb24uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gaW1wbGVtZW50cyBJRGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIElTdGF0dXMuT0suCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPSBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgSURhdGFNb2RlbCB1c2VkIGJ5IHRoaXMgSURhdGFNb2RlbE9wZXJhdGlvbgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBtb2RlbDsKLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbigpIHsKLQkJc3VwZXIoIiIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuaWQgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdHJ1Y3RvciB0YWtpbmcgYW4gSURhdGFNb2RlbAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBJRGF0YU1vZGVsIHVzZWQgdG8gZHJpdmUgdGhpcyBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcigiIik7IC8vJE5PTi1OTFMtMSQgLy8gVE9ETyBhZGQgYSBsYWJlbCBwcm9wZXJ0eSB0byBJRGF0YU1vZGVsPz8/Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5pZCA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc2V0SUQoKS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jc2V0SUQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBnZXRJRCgpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHNldERhdGFNb2RlbCgpCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbE9wZXJhdGlvbiNzZXREYXRhTW9kZWwoSURhdGFNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBnZXREYXRhTW9kZWwoKQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0RGF0YU1vZGVsKCkKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGdldFNjaGVkdWxpbmdSdWxlKCkgcmV0dXJucwotCSAqIDxjb2RlPlJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0U2NoZWR1bGluZ1J1bGUoKQotCSAqLwotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKSByZXR1cm5zCi0JICogPGNvZGU+SVdvcmtzcGFjZS5BVk9JRF9VUERBVEU8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKSB7Ci0JCXJldHVybiBJV29ya3NwYWNlLkFWT0lEX1VQREFURTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZnJhbWV3b3JrIHdpbGwgc2V0IHRoZSBlbnZpcm9ubWVudCBvbiB0aGlzIG9wZXJhdGlvbiBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuIFRoZSBvcGVyYXRpb24KLQkgKiBjYW4gdGhlbiB1c2UgdGhlIGVudmlyb25tZW50IHRvIHJlcG9ydCBzdGF0dXMsIGxvZyBpbmZvcm1hdGlvbiwgYW5kIGFjY2VzcyByZXNvdXJjZXMgaW4gYW4KLQkgKiBlbnZpcm9ubWVudCBuZXV0cmFsIHdheS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVudgotCSAqICAgICAgICAgICAgdGhlIGVudmlyb25tZW50LgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldEVudmlyb25tZW50KElFbnZpcm9ubWVudCBlbnYpIHsKLQkJZW52aXJvbm1lbnQgPSBlbnY7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQW4gb3BlcmF0aW9uIGNhbiBjYWxsIHRoaXMgbWV0aG9kIHRvIGdldCB0aGUgZW52aXJvbm1lbnQgdGhhdCBoYXMgYmVlbiBzZXQgYnkgdGhlIG9wZXJhdGlvbnMKLQkgKiBmcmFtZXdvcmsuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyBhbiBlbnZpcm9ubWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSUVudmlyb25tZW50IGdldEVudmlyb25tZW50KCkgewotCQlyZXR1cm4gZW52aXJvbm1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiByZWRvLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiB1bmRvLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2YzMzAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogPHA+Ci0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SURhdGFNb2RlbFByb3ZpZGVyPC9jb2RlPi4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElEYXRhTW9kZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgSURhdGFNb2RlbCBmb3IgdGhpcyBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgbW9kZWwgPSBudWxsOwotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEhhc2hTZXQoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGluaXQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNpbml0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCX0KLQotCS8qKgotCSAqIDwvcD4KLQkgKiBBbiBpbXBsZW1lbmF0aW9uIG9mIHNldERhdGFNb2RlbCgpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNzZXREYXRhTW9kZWwoSURhdGFNb2RlbCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IGRhdGFNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBbiBpbXBsZW1lbmF0aW9uIG9mIGdldERhdGFNb2RlbCgpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREYXRhTW9kZWwoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCi0JLyoqCi0JICogPC9wPgotCSAqIEEgZGVmYXVsdCBpbXBsZW5lYXRpb24gb2YgcHJvcGVydHlTZXQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBoYXMgYmVlbiBzZXQKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNwcm9wZXJ0eVNldChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXREZWZhdWx0UHJvcGVydHkoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmKEFMTE9XX0VYVEVOU0lPTlMuZXF1YWxzKHByb3BlcnR5TmFtZSkpewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmKFJFU1RSSUNUX0VYVEVOU0lPTlMuZXF1YWxzKHByb3BlcnR5TmFtZSkpewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgaXNQcm9wZXJ0eUVuYWJsZWQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgdmFsaWRhdGUoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIG5lc3RlZCBJRGF0YU1vZGVsIGJlaW5nIHZhbGlkYXRlZC4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcpCi0JICovCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMKLQkgKiBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXRFeHRlbmRlZENvbnRleHQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRFeHRlbmRlZENvbnRleHQoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkQ29udGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0RGVmYXVsdE9wZXJhdGlvbigpLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRPcGVyYXRpb24oKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGdldE5hbWUoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZGlzcG9zZSgpLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGEgcHJvcGVydHkgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgcHJvcGVydHkgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCW1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGEgYm9vbGVhbiBwcm9wZXJ0eSBmcm9tIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgYm9vbGVhbiBwcm9wZXJ0eSBvbiB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHByb3BlcnR5VmFsdWUpIHsKLQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGFuIGludCBwcm9wZXJ0eSBmcm9tIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgaW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRJbnRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBnZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBtb2RlbC5nZXRJbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBhbiBpbnQgcHJvcGVydHkgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIGludCBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNzZXRJbnRQcm9wZXJ0eShTdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgcHJvcGVydHlWYWx1ZSkgewotCQltb2RlbC5zZXRJbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhIFN0cmluZyBwcm9wZXJ0eSBmcm9tIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgaWYgYSBwcm9wZXJ0eSBpcyBzZXQgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIHNldCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG1vZGVsLmlzUHJvcGVydHlTZXQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDJiMGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgZXZlbnQgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20gSURhdGFNb2RlbHMgdG8gdGhlaXIgSURhdGFNb2RlbExpc3RlbmVycy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwjYWRkTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyKQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhTW9kZWxFdmVudCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGZsYWcgdXNlZCB0byBzcGVjaWZ5IHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgI2dldEZsYWcoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0NIRyA9IDE7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbC4gQ2xpZW50cyBzaG91bGQgbm90IHVzZS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0hHID0gMjsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZmxhZyB1c2VkIHRvIHNwZWNpZnkgdGhlIHByb3BlcnR5J3MgZW5hYmxtZW50IGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqIEBzZWUgI2dldEZsYWcoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQUJMRV9DSEcgPSAzOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBmbGFnIHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJvcGVydHkncyB2YWxpZCB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLQkgKiBAc2VlICNnZXRGbGFnKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRF9WQUxVRVNfQ0hHID0gNDsKLQotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0JcHJpdmF0ZSBpbnQgZmxhZzsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0cnVjdG9yIGZvciBEYXRhTW9kZWxFdmVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqICAgICAgICAgICAgdGhlIElEYXRhTW9kZWwgd2hvc2UgcHJvcGVydHkgaGFzIGNoYW5nZWQKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eQotCSAqIEBwYXJhbSBmbGFnCi0JICogICAgICAgICAgICBjb250YWlucyBhIGZsYWcgc3BlY2lmaXlpbmcgdGhlIGV2ZW50IHR5cGUKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsRXZlbnQoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJdGhpcy5mbGFnID0gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBJRGF0YU1vZGVsIHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJRGF0YU1vZGVsIHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gcHJvcGVydHlOYW1lOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgZXZlbnQgdHlwZS4gVmFsaWQgdHlwZXMgYXJlOgotCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+UFJPUEVSVFlfQ0hHPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPlZBTElEX1ZBTFVFU19DSEc8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+RU5BQkxFX0NIRzwvY29kZT48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgZXZlbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEZsYWcoKSB7Ci0JCXJldHVybiBmbGFnOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gdGhlIElEYXRhTW9kZWwncyBwcm9wZXJ0eS4gVGhpcyBpcyBlcXVhdmFsZW50IHRvOgotCSAqIDxjb2RlPmdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KGdldFByb3BlcnR5TmFtZSgpKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRhdGFNb2RlbCdzIHByb3BlcnR5LgotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gdGhlIElEYXRhTW9kZWwgcHJvcGVydHkncyBlbmFibGVtZW50IHN0YXRlLiBUaGlzIGlzIGVxdWF2YWxlbnQKLQkgKiB0bzogPGNvZGU+Z2V0RGF0YU1vZGVsKCkuaXNQcm9wZXJ0eUVuYWJsZWQoZ2V0UHJvcGVydHlOYW1lKCkpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgZGF0YU1vZGVsIHByb3BlcnR5J3MgZW5hYmxlbWVudCBzdGF0ZS4KLQkgKiBAc2VlIElEYXRhTW9kZWwjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJldHVybiB0aGUgSURhdGFNb2RlbCBwcm9wZXJ0eSdzIHZhbGlkIHByb3BlcnR5IGRlc2NyaXB0b3JzLiBUaGlzIGlzCi0JICogZXF1YXZhbGVudCB0bzogPGNvZGU+Z2V0RGF0YU1vZGVsKCkuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKGdldFByb3BlcnR5TmFtZSgpKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRhdGFNb2RlbCBwcm9wZXJ0eSdzIHZhbGlkIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2IwNzMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLkRhdGFNb2RlbEV4dGVuc2lvblJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLkRhdGFNb2RlbEltcGw7Ci0KLS8qKgotICogPHA+Ci0gKiBEYXRhTW9kZWxGYWN0b3J5IGlzIHVzZWQgdG8gY3JlYXRlIElEYXRhTW9kZWwgaW5zdGFuY2VzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIERhdGFNb2RlbEV4dGVuc2lvblJlYWRlciByZWFkZXI7Ci0KLQlwcml2YXRlIERhdGFNb2RlbEZhY3RvcnkoKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogTG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIElEYXRhTW9kZWxQcm92aWRlciBieSB0aGUgc3BlY2lmaWVkIGlkIGFuZCBjb25zdHJ1Y3RzIGEgbmV3Ci0JICogSURhdGFNb2RlbC4gSWYgdGhlIElEYXRhTW9kZWxQcm92aWRlciBpcyBub3QgZm91bmQgdGhlbiBhIFJ1bnRpbWVFeGNlcHRpb24gaXMgbG9nZ2VkIGFuZCBudWxsCi0JICogaXMgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWxQcm92aWRlcklECi0JICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIElEYXRhTW9kZWxQcm92aWRlcgotCSAqIEByZXR1cm4gYSBuZXcgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoU3RyaW5nIGRhdGFNb2RlbFByb3ZpZGVySUQpIHsKLQkJSURhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gbG9hZFByb3ZpZGVyKGRhdGFNb2RlbFByb3ZpZGVySUQpOwotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY3JlYXRlRGF0YU1vZGVsKHByb3ZpZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJRGF0YU1vZGVsUHJvdmlkZXIgbG9hZFByb3ZpZGVyKFN0cmluZyBpZCkgewotCQlpZiAobnVsbCA9PSByZWFkZXIpIHsKLQkJCXJlYWRlciA9IG5ldyBEYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVhZGVyLmdldFByb3ZpZGVyKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBMb29rcyB1cCB0aGUgYXBwcm9wcmlhdGUgZGF0YU1vZGVsUHJvdmlkZXJJRHMgYnkgdGhlIHNwZWNpZmllZCBkYXRhTW9kZWxQcm92aWRlcktpbmRJRC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbFByb3ZpZGVyS2luZElECi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIGlkIG9mIHRoZSBkYXRhTW9kZWxQcm92aWRlcktpbmRJRAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHZhbGlkIGRhdGFNb2RlbFByb3ZpZGVySURzIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZSBub25lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RGF0YU1vZGVsUHJvdmlkZXJJRHNGb3JLaW5kKFN0cmluZyBkYXRhTW9kZWxQcm92aWRlcktpbmRJRCkgewotCQlTdHJpbmdbXSB2YWxpZFByb3ZpZGVySURzID0gbG9hZFByb3ZpZGVyRm9yUHJvdmlkZXJLaW5kKGRhdGFNb2RlbFByb3ZpZGVyS2luZElEKTsKLQkJcmV0dXJuIG51bGwgIT0gdmFsaWRQcm92aWRlcklEcyA/IHZhbGlkUHJvdmlkZXJJRHMgOiBuZXcgU3RyaW5nWzBdOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbG9hZFByb3ZpZGVyRm9yUHJvdmlkZXJLaW5kKFN0cmluZyBwcm92aWRlcktpbmQpIHsKLQkJaWYgKG51bGwgPT0gcmVhZGVyKSB7Ci0JCQlyZWFkZXIgPSBuZXcgRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlci5nZXRQcm92aWRlckRlc2NyaXB0b3JzRm9yUHJvdmlkZXJLaW5kKHByb3ZpZGVyS2luZCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQnVpbGRzIGFuIHtAbGluayBJRGF0YU1vZGVsfSB1c2luZyB0aGUgc3BlY2lmaWVkIENsYXNzLiBUaGlzIENsYXNzIHdpbGwKLQkgKiBub3JtYWxseSBiZSBhIHN1YiBpbnRlcmZhY2Ugb2Yge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfS4gSWYgdGhlCi0JICogQ2xhc3MgaXQgaXMgYW4ge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfS5jbGFzcyB0aGVuIHRoaXMgbWV0aG9kIHdpbGwKLQkgKiBhdHRlbXB0IHRvIHVzZSB0aGUge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzI19wcm92aWRlcl9jbGFzc30gZmllbGQgdG8KLQkgKiBsb2FkIHRoZSB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSB3aXRoIHdoaWNoIHRvIGJhY2sgdGhlCi0JICoge0BsaW5rIElEYXRhTW9kZWx9LiBJZiB0aGlzIGZhaWxzLCBvciBpZiB0aGUgQ2xhc3MgaXMgbm90IGFuIGludGVyZmFjZSwKLQkgKiB0aGVuIHRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQgdG8KLQkgKiA8Y29kZT5jcmVhdGVEYXRhTW9kZWwoYUNsYXNzLmdldE5hbWUoKSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYUNsYXNzCi0JICogICAgICAgICAgICBhbiB7QGxpbmsgSURhdGFNb2RlbFByb3BlcnRpZXN9LmNsYXNzIG9yIHRoZSBjbGFzcyB3aG9zZSBuYW1lCi0JICogICAgICAgICAgICBpcyB0aGUgaWQgb2YgdGhlIElEYXRhTW9kZWxQcm92aWRlcgotCSAqIEByZXR1cm4gYSBuZXcgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoQ2xhc3MgYUNsYXNzKSB7Ci0JCWlmKGFDbGFzcy5pc0ludGVyZmFjZSgpKXsKLQkJCQl0cnl7Ci0JCQkJCUNsYXNzIGNsYXp6ID0gKENsYXNzKWFDbGFzcy5nZXRGaWVsZCgiX3Byb3ZpZGVyX2NsYXNzIikuZ2V0KG51bGwpOwotCQkJCQlpZihjbGF6eiAhPSBudWxsKXsKLQkJCQkJCUlEYXRhTW9kZWxQcm92aWRlciBwcm92aWRlciA9IChJRGF0YU1vZGVsUHJvdmlkZXIpY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJCQkJCXJldHVybiBjcmVhdGVEYXRhTW9kZWwocHJvdmlkZXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQkJCQkvL2lnbm9yZTsgdGhlIGludGVyZmFjZSBtYXkgbm90IGhhdmUgZGVmaW5lZCB0aGUgZmllbGQgYW5kIGlzIHJlbHlpbmcgb24gZXh0ZW5zaW9ucy4KLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gIAotCQl9Ci0JCXJldHVybiBjcmVhdGVEYXRhTW9kZWwoYUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIG5ldyBJRGF0YU1vZGVsIHVzaW5nIHRoZSB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIG9mIGFuIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyCi0JICogQHJldHVybiBhIG5ldyBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJaWYgKG51bGwgPT0gcHJvdmlkZXIpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gbmV3IERhdGFNb2RlbEltcGwocHJvdmlkZXIpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1NGVjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIEEgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHByb3ZpZGVzIGEgaHVtYW4gcmVhZGlibGUgZGVzY3JpcHRpb24gZm9yIGFuIElEYXRhTW9kZWwKLSAqIHByb3BlcnR5VmFsdWUuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2dldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgewotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhbiBhcnJheSBvZiBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzLiBJZgotCSAqIDxjb2RlPnZhbHVlczwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhIDAgbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLiBPdGhlcndpc2UgZm9yCi0JICogZWFjaCA8Y29kZT52YWx1ZXNbaV08L2NvZGU+IGluIHRoZSBhcnJheSwgYSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycyBpcyBjcmVhdGVkCi0JICogdXNpbmcgPGNvZGU+bmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcnModmFsdWVzW2ldKTs8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzCi0JICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycyBhcnJheQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gY3JlYXRlRGVzY3JpcHRvcnMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCWlmIChudWxsID09IHZhbHVlcykgewotCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF07Ci0JCX0KLQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW3ZhbHVlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZXNjcmlwdG9yc1tpXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IodmFsdWVzW2ldKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhbiBhcnJheSBvZiBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzLiBJZgotCSAqIDxjb2RlPnZhbHVlczwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhIDAgbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLiBPdGhlcndpc2UgZm9yCi0JICogZWFjaCA8Y29kZT52YWx1ZXNbaV08L2NvZGU+IGFuZCA8Y29kZT5kZXNjcmlwdGlvbnNbaV08L2NvZGU+IGluIHRoZSBhcnJheXMsIGEgbmV3Ci0JICogRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgdXNpbmcKLQkgKiA8Y29kZT5uZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlc1tpXSwgZGVzY3JpcHRpb25zW2ldKTs8L2NvZGU+LiBCb3RoIGFycmF5cwotCSAqIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9ucwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHByb3BlcnR5IGRlc2NyaXB0aW9ucyBjb29yZXNwb25kaW5nIHRoZSB2YWx1ZXMgYXJyYXkKLQkgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBjcmVhdGVEZXNjcmlwdG9ycyhPYmplY3RbXSB2YWx1ZXMsIFN0cmluZ1tdIGRlc2NyaXB0aW9ucykgewotCQlpZiAobnVsbCA9PSB2YWx1ZXMpIHsKLQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCQl9Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclt2YWx1ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlc1tpXSwgZGVzY3JpcHRpb25zW2ldKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBwcm9wZXJ0eVZhbHVlOwotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5RGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGVxdWF2YWxlbnQgdG8gY2FsbGluZyA8Y29kZT5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlWYWx1ZSwgbnVsbCk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXRoaXMucHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5VmFsdWUgYW5kCi0JICogcHJvcGVydHlEZXNjcmlwdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqIEBwYXJhbSBwcm9wZXJ0eURlc2NyaXB0aW9uCi0JICogICAgICAgICAgICB0aGUgaHVtYW4gcmVhZGlibGUgcHJvZXBydHkgZGVzY3JpcHRpb25GCi0JICovCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgcHJvcGVydHlWYWx1ZSwgU3RyaW5nIHByb3BlcnR5RGVzY3JpcHRpb24pIHsKLQkJdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKLQkJdGhpcy5wcm9wZXJ0eURlc2NyaXB0aW9uID0gcHJvcGVydHlEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBodW1hbiByZWFkaWJsZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbi4gSWYgYSBub24gbnVsbCBkZXNjcmlwdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQsCi0JICogdGhlbiBpdCB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBwcm9wZXJ0eSB2YWx1ZSdzIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IHdpbGwgYmUKLQkgKiByZXR1cm5lZCBpZiBpdCBpcyBub3QgbnVsbC4gT3RoZXJ3aXNlIHRoZSBlbXB0eSBTdHJpbmcgKDxjb2RlPiIiPC9jb2RlPikgd2lsbCBiZQotCSAqIHJldHVybmVkLiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIG5ldmVyIGJlIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBodW1hbiByZWFkaWJsZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbiwgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5RGVzY3JpcHRpb24oKSB7Ci0JCWlmIChudWxsICE9IHByb3BlcnR5RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0aW9uOwotCQl9Ci0JCVN0cmluZyBzdHIgPSAobnVsbCAhPSBwcm9wZXJ0eVZhbHVlKSA/IHByb3BlcnR5VmFsdWUudG9TdHJpbmcoKSA6IG51bGw7Ci0JCXJldHVybiAobnVsbCAhPSBzdHIpID8gc3RyIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlyZXR1cm4gZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzFjNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIDxwPgotICogSURhdGFNb2RlbHMgYXJlIHRoZSBjb3JlIHBpZWNlIG9mIGEgZnJhbWV3b3JrIHVzZWQgdG8gc2ltcGxpZnkgZGF0YSBjb2xsZWN0aW9uLCBvcGVyYXRpb24KLSAqIGV4ZWN1dGlvbiwgYW5kIFdpemFyZCBnZW5lcmF0aW9uLgotICogPC9wPgotICogPHA+Ci0gKiBJRGF0YU1vZGVscyBhcmUgcHJpbWFyaWx5IGFuIGludGVsbGlnZW50IG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgZGF0YS4gRWFjaCBJRGF0YU1vZGVsIHRyYWNrcwotICogc3BlY2lmaWMgT2JqZWN0cyBrbm93biBhcyAicHJvcGVydGllcyIuIEVhY2ggcHJvcGVydHkgbWF5IGJlIHNldCBvciBnZXQgdXNpbmcgaXRzIHByb3BlcnR5IG5hbWUuCi0gKiBBIENvbGxlY3Rpb24gb2YgcHJvcGVydHkgbmFtZXMgZm9yIGFuIElEYXRhTW9kZWwgaW5zdGFuY2UgbWF5IGJlIHJldHJlaXZlZCB1c2luZwotICogPGNvZGU+Z2V0QWxsUHJvcGVydGllcygpPC9jb2RlPi4gSW4gYWRkaXRpb24gdG8gZ2V0dGluZy9zZXR0aW5nIHByb3BlcnRpZXMsIElEYXRhTW9kZWxzIG1heQotICogYWxzbyBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIGZvciB1bnNldCBwcm9wZXJ0aWVzLCBodW1hbiByZWFkYWJsZSBkZXNjcmlwdG9ycyBmb3IgcHJvcGVydGllcywKLSAqIGVudW1lcmF0aW9ucyBvZiB2YWxpZCBwcm9wZXJ0eSB2YWx1ZXMsIHZhbGlkYXRpb24gZm9yIHByb3BlcnRpZXMsIGFuZCBlbmFibGVtZW50IGZvciBwcm9wZXJ0aWVzLgotICogPC9wPgotICogPHA+Ci0gKiBJRGF0YU1vZGVscyBtYXkgYWxzbyBiZSBuZXN0ZWQgKGFuZCB1bm5lc3RlZCkgcmVjdXJzaXZlbHkgd2l0aGluIGFub3RoZXIuIFdoZW4gb25lIElEYXRhTW9kZWwgaXMKLSAqIG5lc3RlZCB3aXRoaW4gYW5vdGhlciwgdGhlbiBjbGllbnQgY29kZSBtYXkgYWNjZXNzIGFsbCBwcm9wZXJ0aWVzIG9uIHRoZSBmb3JtZXIgdGhyb3VnaCB0aGUKLSAqIGxhdHRlci4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHRoZSBzYW1lIElEYXRhTW9kZWwgKHRyYWNraW5nIHRoZSBzYW1lIHByb3BlcnRpZXMpIG1heSBiZQotICogdXNlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2Ygc2V2ZXJhbCBkaWZmZXJlbnQgYnJvYWRlciBzY2VuYXJpb3MuIE5lc3RpbmcgbWF5IGFwcGx5IHRvIGFueQotICogSURhdGFNb2RlbCwgYW5kIG1heSBiZSBhYml0cmFyeWx5IGRlZXAgKGV2ZW4gY3lsaWNhbCBpZiB5b3UgZGFyZSkuIE5lc3Rpbmcgb2ZmZXJzIGZsZXhpYmlsaXR5LAotICogZXNwZWNpYWxseSBmb3IgZXh0ZW5zaW9uIGJ5IDNyZCBwYXJ0eSBjbGllbnRzLgotICogPC9wPgotICogPHA+Ci0gKiBFYWNoIElEYXRhTW9kZWwgbWF5IGFsc28gc3VwcGx5IGFuIElEYXRhTW9kZWxPcGVyYXRpb24gKGEgc3ViY2xhc3Mgb2YKLSAqIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24pIGZvciBleGVjdXRpb24uIFdoZW4gZXhlY3V0ZWQgd2l0aGluIHRoZQotICogSURhdGFNb2RlbCBmcmFtZXdvcmsgYWxsIHRoZXNlIG9wZXJhdGlvbnMgYXJlIGluaGVyZW50bHkgYW5kIGFiaXRyYXJpbHkgZXh0ZW5kYWJsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogRWFjaCBJRGF0YU1vZGVsIG1heSBhbHNvIGluZGlyZWN0bHkgc3VwcGx5IGEgRGF0YU1vZGVsV2l6YXJkLiBUaGlzIGluZGlyZWN0aW9uIGlzIG5lY2Vzc2FyeSB0bwotICogc3BpbHQgVUkgZGVwZW5kZW5jaWVzIGZyb20gdGhlIGNvcmUgSURhdGFNb2RlbCBmcmFtZXdvcmsuIERhdGFNb2RlbFdpemFyZHMgYXJlIGFsc28gaW5oZXJlbnRseQotICogZXh0ZW5kYWJsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogSURhdGFNb2RlbHMgYXJlIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHksIHJhdGhlciB0aGV5IGFyZSBidWlsdCBmcm9tIGFuCi0gKiBJRGF0YU1vZGVsUHJvdmlkZXIuIENsaWVudHMgd2lzaGluZyB0byBkZWZpbmUgdGhlaXIgb3duIElEYXRhTW9kZWwgbXVzdCBkbyBzbyBieSBpbXBsZW1lbnRpbmcgYW4KLSAqIElEYXRhTW9kZWxQcm92aWRlci4gQ2xpZW50cyB3aXNoaW5nIHRvIHV0aWxpemUgYW4gSURhdGFNb2RlbCBtdXN0IGNyZWF0ZSBpdCB1c2luZyB0aGUKLSAqIERhdGFNb2RlbEZhY3Rvcnkgd2l0aCB0aGUgYXNzb2NpYXRlZCBJRGF0YU1vZGVsUHJvdmlkZXIuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHVuaXF1ZSBJRCB3aGljaCBpZGVudGlmaWVzIHRoaXMgSURhdGFNb2RlbCBpbnN0YW5jZS4gVGhlIHNhbWUgSUQgc2hvdWxkIGJlIHVzZWQKLQkgKiBieSB0aGUgZGVmYXVsdCBvcGVyYXRpb24gKGlmIGFueSkgZm9yIGNsaWVudHMgdG8gZXh0ZW5kIG9yIGluc3RhbnRpYXRlIGRpcmVjdGx5LCB0aGUKLQkgKiBEYXRhTW9kZWxXaXphcmQgKGlmIGFueSkgZm9yIGNsaWVudHMgdG8gZXh0ZW5kIG9yIGluc3RhbnRpYXRlIGRpcmVjdGx5LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlLCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBhIGhhc2hjb2RlLiBNdWx0aXBsZSBJRGF0YU1vZGVsIGluc3RhbmNlcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUKLQkgKiBJRGF0YU1vZGVsUHJvdmlkZXIgdHlwZSB3aWxsIGFsbCBoYXZlIHRoZSBzYW1lIElELgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldElEKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1bmlxdWUgSUQgZm9yIHRoaXMgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIHRvIGV4ZWN1dGUgYWdhaW5zdCB0aGlzIElEYXRhTW9kZWwuIFRoZSByZXR1cm5lZCBvcGVyYXRpb24gaXMKLQkgKiBkZXJpdmVkIGZyb20gdGhlIG9wZXJhdGlvbiBzdXBwbGllZCBieSB0aGUgYmFja2luZyBJRGF0YU1vZGVsUHJvdmlkZXIuIFRoZSByZXR1cm5lZCB0eXBlIGlzCi0JICogSURhdGFNb2RlbE1hbmFnZXJPcGVyYXRpb24gd2hpY2ggYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHJldHVybmVkCi0JICogSURhdGFNb2RlbE9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0T3BlcmF0aW9uKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG9ubHkgcGVydGFpbnMgdG8gSURhdGFNb2RlbHMgZm9yIGV4dGVkZW5kZWQgb3BlcmF0aW9ucy4gVGhlIHJldHVybmVkIGV4dGVuZGVkCi0JICogY29udGV4dCBpcyB1c2VkIGJ5IHRoZSBJRGF0YU1vZGVsT3BlcmF0aW9uIGZyYW1ld29yayB0byBkZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIKLQkgKiBleHRlbmRlZCBvcGVyYXRpb24gc2hvdWxkIGV4ZWN1dGUuIFRoZSByZXR1cm5lZCBsaXN0IGlzIHNob3VsZCBjb250YWluIE9iamVjdHMgYWRhcHRhYmxlIHRvCi0JICogSVByb2plY3QuIFRoaXMgSURhdGFNb2RlbCdzIGZ1bmN0aW9uIGdyb3VwcyBhcmUgbG9va2VkIHVwIHRocm91Z2ggdGhlIGV4dGVuc2lvbiBtZWNoYW5pc20uIElmCi0JICogYSBmdW5jdGlvbiBncm91cCBpcyBkZWZpbmVkLCBpdCBpcyBmaXJzdCBjaGVja2VkIGZvciBlbmFibGVtZW50LiBUaGVuIGVhY2ggYWRhcHRlZCBJUHJvamVjdAotCSAqIGlzIGluc3BlY3RlZCB0byB2ZXJpZnkgaXQgaGFuZGxlcyB0aGUgZnVuY3Rpb24gZ3JvdXAuIElmIGFsbCB0aGVzZSBjb25kaXRpb25zIGFyZSBtZXQsIHRoZW4KLQkgKiB0aGUgZXh0ZW5kZWQgb3BlcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElEYXRhTW9kZWwgaXMgZXhlY3V0ZWQ7IG90aGVyd2lzZSBpdCBpcyBza2lwcGVkLgotCSAqIElmIG5vIGZ1bmN0aW9uIGdyb3VwIGlzIGRlZmluZWQsIG9yIG5vIGV4dGVuZGVkIGNvbnRleHQgaXMgZGVmaW5lZCAoaS5lLiB0aGlzIG1ldGhvZCByZXR1cm5zCi0JICogYW4gZW1wdHkgbGlzdCwgb3IgdGhlIG9iamVjdHMgaW4gdGhlIHJldHVybmVkIGxpc3QgYXJlIG5vdCBhZGFwdGFibGUgdG8gSVByb2plY3QpIHRoZW4gdGhlCi0JICogZXh0ZW5kZWQgb3BlcmF0aW9uIHdpbGwgZXhlY3V0ZSAoaXQgd2lsbCBuZXZlciBiZSBza2lwcGVkKS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgTGlzdCBvZiBPYmplY3RzIGFkYXB0YWJsZSB0byBJUHJvamVjdAotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldEV4dGVuZGVkQ29udGV4dCgpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIG5vdCBhIHByb3BlcnR5IHRoZW4gYSBSdW50aW1lRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBCZWZvcmUgdGhlIHByb3BlcnR5IGlzIHJldHVybmVkLCBmaXJzdCB0aGUgb3duaW5nIElEYXRhTW9kZWwgbXVzdCBiZSBsb2NhdGVkLiBJZiB0aGUKLQkgKiBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIGEgYmFzZSBwcm9wZXJ0eSB7QGxpbmsgI2lzQmFzZVByb3BlcnR5KFN0cmluZyl9LCB0aGVuIHRoaXMKLQkgKiBJRGF0YU1vZGVsIGlzIHRoZSBvd25lci4gT3RoZXJ3aXNlLCBhIHJlY3Vyc2l2ZSBzZWFyY2ggdGhyb3VnaCB0aGUgbmVzdGVkIElEYXRhTW9kZWxzIGlzCi0JICogY29uZHVjdGVkIHRvIGxvY2F0ZSB0aGUgb3duaW5nIElEYXRhTW9kZWwuIElmIG1vcmUgdGhhbiBvbmUgbmVzdGVkIElEYXRhTW9kZWwgZGVmaW5lcyB0aGUKLQkgKiBwcm9wZXJ0eSwgdGhlbiB0aGUgZmlyc3Qgb25lIGxvY2F0ZWQgaXMgY29uc2lkZXJlZCB0aGUgb3duaW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE9uY2UgdGhlIG93bmluZyBJRGF0YU1vZGVsIGlzIGZvdW5kIHRoZSBwcm9wZXJ0eSBpcyBjaGVja2VkIHRvIHNlZSBpZiBpdCBpcyBzZXQKLQkgKiB7QGxpbmsgI2lzUHJvcGVydHlTZXQoU3RyaW5nKX0uIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIHRoZSBzZXQgdmFsdWUgaXMgcmV0dXJuZWQuIElmIHRoZQotCSAqIHByb3BlcnR5IGlzIG5vdCBzZXQsIGl0cyBkZWZhdWx0IGlzIHJldHVybmVkIHtAbGluayAjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyl9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGVyZSBhcmUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZ2V0dGluZyBwcmltaXRpdmUgPGNvZGU+aW50PC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5ib29sZWFuPC9jb2RlPiB0eXBlcyBhcyB3ZWxsIGFzIFN0cmluZ3MuCi0JICogPHVsPgotCSAqIDxsaT57QGxpbmsgI2dldEludFByb3BlcnR5KFN0cmluZyl9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nKX08L2xpPgotCSAqIDxsaT57QGxpbmsgI2dldFN0cmluZ1Byb3BlcnR5KFN0cmluZyl9PC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5Ci0JICogCi0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlICNnZXRJbnRQcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSAjZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgaW50cy4gSWYgdGhlIHByb3BlcnR5IGlzIHNldCB0aGVuIHRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQKLQkgKiB0bzoKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+KChJbnRlZ2VyKWdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpLmludFZhbHVlKCk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQgaWYgYSBjYWxsIHRvIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNzZXRJbnRQcm9wZXJ0eShTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYm9vbGVhbnMuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdGhlbiB0aGlzIG1ldGhvZCBpcwotCSAqIGVxdWF2YWxlbnQgdG86Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPigoQm9vbGVhbilnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKS5ib29sZWFuVmFsdWUoKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCBpZiBhIGNhbGwgdG8gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSByZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIFN0cmluZ3MuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdGhlbiB0aGlzIG1ldGhvZCBpcwotCSAqIGVxdWF2YWxlbnQgdG86Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPihTdHJpbmcpZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTwvY29kZT4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+IiI8L2NvZGU+IGlzIHJldHVybmVkIGlmIGEgY2FsbCB0byBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHJldHVybnMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBzZWUgI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIHRvIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlWYWx1ZS4gU3Vic2VxdWVudCBjYWxscyB0bwotCSAqIHtAbGluayAjZ2V0UHJvcGVydHkoU3RyaW5nKX0gd2lsbCByZXR1cm4gdGhlIHNhbWUgcHJvcGVydHlWYWx1ZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogV2hlbiBhIHByb3BlcnR5VmFsdWUgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiBpcyBzZXQsIHRoZW4gdGhlIHByb3BlcnR5IGlzIGNvbnNpZGVyZWQKLQkgKiAic2V0IiAoc2VlIHtAbGluayAjaXNQcm9wZXJ0eVNldChTdHJpbmcpfSksIGNvbnZlcnNseSwgYSBwcm9wZXJ0eVZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaXMgY29uc2lkZXJlZCAidW5zZXQiLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZSBpcyBub3QgYSBwcm9wZXJ0eSAoc2VlIHtAbGluayAjaXNQcm9wZXJ0eShTdHJpbmcpfSkgdGhlbiBhCi0JICogUnVudGltZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlcmUgYXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHNldHRpbmcgcHJpbWl0aXZlIDxjb2RlPmludDwvY29kZT4gYW5kCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdHlwZXMgYXMgd2VsbCBhcyBTdHJpbmdzLgotCSAqIDx1bD4KLQkgKiA8bGk+e0BsaW5rICNzZXRJbnRQcm9wZXJ0eShTdHJpbmcsIGludCl9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nLCBib29sZWFuKX08L2xpPgotCSAqIDxsaT57QGxpbmsgI3NldFN0cmluZ1Byb3BlcnR5KFN0cmluZywgU3RyaW5nKX08L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgbWF5IGRlZmluZSBhZGRpdGlvbmFsIHBvc3Qgc2V0IGxvZ2ljIGluCi0JICoge0BsaW5rIElEYXRhTW9kZWxQcm92aWRlciNwcm9wZXJ0eVNldChTdHJpbmcsIE9iamVjdCl9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5Ci0JICogCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgI2lzUHJvcGVydHlTZXQoU3RyaW5nKQotCSAqIEBzZWUgI2lzUHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI3Byb3BlcnR5U2V0KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGludHMuIFRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQgdG86Ci0JICogPHA+Ci0JICogPGNvZGU+c2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBuZXcgSW50ZWdlcihwcm9wZXJ0eVZhbHVlKSk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjZ2V0SW50UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBwcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGJvb2xlYW5zLiBUaGlzIG1ldGhvZCBpcyBlcXVhdmFsZW50IHRvOgotCSAqIDxwPgotCSAqIDxjb2RlPnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgKHZhbHVlKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHByb3BlcnR5VmFsdWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHNldHRpbmcgU3RyaW5ncy4gVGhpcyBtZXRob2QgaXMgZXF1YXZhbGVudCB0bzoKLQkgKiA8cD4KLQkgKiA8Y29kZT5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBuZXN0IHRoZSBzcGVjaWZpZWQgSURhdGFNb2RlbCB3aXRoaW4gdGhpcyBJRGF0YU1vZGVsLiBUaGUKLQkgKiA8Y29kZT5uZXN0ZWRNb2RlbE5hbWU8L2NvZGU+IGFyZ3VtZW50IHNob3VsZCBiZSBhIHVuaXF1ZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyCi0JICogbmVzdGVkIElEYXRhTW9kZWwuIFRoZSBzYW1lIFN0cmluZyBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdXNpbmcKLQkgKiBlaXRoZXIge0BsaW5rICNnZXROZXN0ZWRNb2RlbChTdHJpbmcpfSBvciB7QGxpbmsgI3JlbW92ZU5lc3RlZE1vZGVsKFN0cmluZyl9LiBJZiB0aGUKLQkgKiBzcGVjaWZpZWQgbmVzdGVkIElEYXRhTW9kZWwgaGFzIGFscmVhZHkgYmVlbiBuZXN0ZWQgdW5kZXIgdGhpcyBJRGF0YU1vZGVsIG9yIGl0IGlzIHRoZSBzYW1lCi0JICogaW5zdGFuY2UgYXMgdGhpcyBJRGF0YU1vZGVsLCB0aGVuIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5lc3RlZE1vZGVsTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIElEYXRhTW9kZWwgdG8gYmUgbmVzdGVkCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqICAgICAgICAgICAgdGhlIElEYXRhTW9kZWwgdG8gYmUgbmVzdGVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbmVzdGluZyB3YXMgc3VjY2Vzc2Z1bCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlICNnZXROZXN0ZWRNb2RlbChTdHJpbmcpCi0JICogQHNlZSAjcmVtb3ZlTmVzdGVkTW9kZWwoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZE5lc3RlZE1vZGVsKFN0cmluZyBuZXN0ZWRNb2RlbE5hbWUsIElEYXRhTW9kZWwgZGF0YU1vZGVsKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG5lc3RlZE1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmVzdGVkTW9kZWxOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdG8gcmVtb3ZlLgotCSAqIEByZXR1cm4gdGhlIElEYXRhTW9kZWwgcmVtb3ZlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG5lc3RlZCBtb2RlbCBkb2VzIG5vdCBleGlzdCBvcgotCSAqICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBuYW1lIGlzIG51bGwuCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgcmVtb3ZlTmVzdGVkTW9kZWwoU3RyaW5nIG5lc3RlZE1vZGVsTmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbmVzdGVkIG1vZGVsIGV4aXN0cyAoYXQgdGhlIHRvcCBsZXZlbCBvbmx5KSB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmVzdGVkTW9kZWxOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdG8gY2hlY2suCi0JICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbmVzdGVkIG1vZGVsIGV4aXN0cyAoYXQgdGhlIHRvcCBsZXZlbCBvbmx5KSB3aXRoIHRoZQotCSAqICAgICAgICAgc3BlY2lmaWVkIG5hbWUgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRNb2RlbChTdHJpbmcgbmVzdGVkTW9kZWxOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIG5lc3RlZCBJRGF0YU1vZGVsIGlkZW50aWZpZWQgdGhlIGJ5IHRoZSBzcGVjaWZpZWQgbmFtZS4gQSBSdW50aW1lRXhjZXB0aW9uIGlzCi0JICogdGhyb3duIGlmIHRoZXJlIGlzIG5vIHN1Y2ggbmVzdGVkIElEYXRhTW9kZWwgKGkuZS4gaXNOZXN0ZWRNb2RlbCgpIHdvdWxkIHJldHVybgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPikuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXN0ZWRNb2RlbE5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBuZXN0ZWQgSURhdGFNb2RlbCB0byBnZXQuCi0JICogQHJldHVybiB0aGUgbmVzdGVkIElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXROZXN0ZWRNb2RlbChTdHJpbmcgbmVzdGVkTW9kZWxOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIGFsbCBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RlZCBJRGF0YU1vZGVscywgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RlZE1vZGVscygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RlZCBJRGF0YU1vZGVscyBuYW1lcywgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgbmVzdGVkIElEYXRhTW9kZWxzIG5hbWVzLCBvciBhbiBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGVkTW9kZWxOYW1lcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RpbmcgKHRoZSBpbnZlcnNlIG9mIG5lc3RlZCkgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgbmVzdGluZyAodGhlIGludmVyc2Ugb2YgbmVzdGVkKSBJRGF0YU1vZGVscywgb3IgYW4gZW1wdHkKLQkgKiAgICAgICAgIENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0aW5nTW9kZWxzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiBhbGwgYmFzZSBwcm9wZXJ0aWVzIChub3QgaW5jbHVkaW5nIG5lc3RlZCBwcm9wZXJ0aWVzKSwgb3IgYW4gZW1wdHkKLQkgKiBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIGFsbCBiYXNlIHByb3BlcnRpZXMgKG5vdCBpbmNsdWRpbmcgbmVzdGVkIHByb3BlcnRpZXMpLCBvciBhbiBlbXB0eQotCSAqICAgICAgICAgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEJhc2VQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiBhbGwgcHJvcGVydGllcyBvZiByZWN1cnNpdmVseSBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgcHJvcGVydGllcyBvZiByZWN1cnNpdmVseSBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogICAgICAgICBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGVkUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIHByb3BlcnRpZXMgKHRoZSB1bmlvbiBvZiBnZXRCYXNlUHJvcGVydGllcygpIGFuZAotCSAqIGdldE5lc3RlZFByb3BlcnRpZXMoKSksIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIHByb3BlcnRpZXMgKHRoZSB1bmlvbiBvZiBnZXRCYXNlUHJvcGVydGllcygpIGFuZAotCSAqICAgICAgICAgZ2V0TmVzdGVkUHJvcGVydGllcygpKSwgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFsbFByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eU5hbWUgZm9yIHRoaXMKLQkgKiByb290IElEYXRhTW9kZWwgb25seS4gTmVzdGVkIElEYXRhTW9kZWxzIGFyZSBub3QgY2hlY2tlZCwgdGhvdWdoIGl0IGlzIHBvc3NpYmxlIGZvciBhIG5lc3RlZAotCSAqIElEYXRhTW9kZWwgdG8gY29udGFpbiB0aGUgc2FtZSBwcm9wZXJ0eS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcHJvcGVydHkgaXMgYSBiYXNlIHByb3BlcnR5LCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlICNpc1Byb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlICNpc05lc3RlZFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Jhc2VQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eU5hbWUgZm9yIHRoaXMKLQkgKiBEYXRhTW9kZWwgb3IgYW55IG9mIGl0cyAocmVjdXJzaXZlbHkpIG5lc3RlZCBJRGF0YU1vZGVscy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBwcm9wZXJ0eSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlICNpc0Jhc2VQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eU5hbWUgZm9yIGFueSBvZgotCSAqIGl0cyAocmVjdXJzaXZlbHkpIG5lc3RlZCBJRGF0YU1vZGVscy4gVGhlIHJvb3QgSURhdGFNb2RlbCBpcyBub3QgY2hlY2tlZCwgdGhvdWdoIGl0IGlzCi0JICogcG9zc2libGUgZm9yIHRoZSByb290IElEYXRhTW9kZWwgdG8gY29udGFpbiB0aGUgc2FtZSBwcm9wZXJ0eS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBuZXN0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogQHNlZSAjaXNCYXNlUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGJlZW4gc2V0IG9uIHRoZSBJRGF0YU1vZGVsLiBJZiBpdAotCSAqIGhhcyBub3QgYmVlbiBzZXQsIHRoZW4gYSBjYWxsIHRvIGdldCB0aGUgc2FtZSBwcm9wZXJ0eSB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpcyBlbmFibGVkIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgZGVmaW5lcyB0aGlzIGluIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIGVuYWJsZWQgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHRoZSBJU3RhdHVzIHJldHVybmVkIGJ5IHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nKSBpcyBFUlJPUgotCSAqIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHRoZSBJU3RhdHVzIHJldHVybmVkIGJ5IHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nKSBpcyBFUlJPUgotCSAqICAgICAgICAgYW5kIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5VmFsaWQoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIElTdGF0dXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIFJldHVucyBhbiBJU3RhdHVzLk9LIGlmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcwotCSAqIHZhbGlkIHdpdGggcmVzcGVjdCBpdHNlbGYsIG90aGVyIHByb3Blcml0ZXMsIGFuZCBicm9hZGVyIGNvbnRleHQgb2YgdGhlIElEYXRhTW9kZWwuCi0JICogSVN0YXR1cy5FUlJPUiBpcyByZXR1cm5lZCBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgaW52YWxpZC4gSVN0YXR1cy5XQVJOSU5HIG1heSBhbHNvIGJlCi0JICogcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIG5vdCBvcHRpbWFsLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIElTdGF0dXMgcmV0dXJuZWQgYnkgdmFsaWRhdGUodHJ1ZSkgaXMgRVJST1IgYW5kCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgSVN0YXR1cyByZXR1cm5lZCBieSB2YWxpZGF0ZSh0cnVlKSBpcyBFUlJPUiBhbmQKLQkgKiAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFcXVhdmFsZW50IHRvIGNhbGxpbmcgPGNvZGU+dmFsaWRhdGUodHJ1ZSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogSXRlcmF0ZXMgb3ZlciBhbGwgYmFzZSBwcm9wZXJ0aWVzIGFuZCBuZXN0ZWQgbW9kZWxzIElEcyBhbmQgY2FsbHMgdmFsaWRhdGUoU3RyaW5nKS4gVGhpcwotCSAqIG1ldGhvZCByZXR1cm5zIHdoZW4gYW55IGNhbGwgdG8gdmFsaWRhdGUoU3RyaW5nKSByZXR1cm5zIGFuIElTdGF0dXMgZXJyb3IgYW5kCi0JICogc3RvcEF0Rmlyc3RGYWlsdXJlIGlzIHNldCB0byB0cnVlLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBzdG9wQXRGaXJzdEZhaWx1cmUKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgc3RvcCBhdCB0aGUgZmlyc3QgZmFpbHVyZQotCSAqIEByZXR1cm4gYW4gSVN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGJvb2xlYW4gc3RvcEF0Rmlyc3RGYWlsdXJlKTsKLQotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiBUaGUKLQkgKiA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlKCk8L2NvZGU+IG1ldGhvZCBvbiB0aGUgcmV0dXJuZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHdpbGwgYmUKLQkgKiB0aGUgc2FtZSB2YWx1ZSBhcyByZXR1cm5lZCBieSA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBGb2xsb3dpbmcgdGhlIGV4YW1wbGUgaW50cm9kdWNlZCBpbiB7QGxpbmsgI2dldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcpfSwgc3VwcG9zZQotCSAqIHRoZSA8Y29kZT5TSElSVF9TSVpFPC9jb2RlPiBwcm9wZXJ0eSBpcyBjdXJyZW50bHkgc2V0IHRvIDEuIEEgY2FsbCB0byB0aGlzIG1ldGhvZCB3b3VsZAotCSAqIHJldHVybiBhIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciB3aG9zZSA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlKCk8L2NvZGU+IHJldHVybnMKLQkgKiA8Y29kZT4xPC9jb2RlPiBhbmQgd2hvc2UgPGNvZGU+Z2V0UHJvcGVydHlEZXNjcmlwdGlvbigpPC9jb2RlPiByZXR1cm5zIDxjb2RlPnNtYWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQWxzbywgbm90ZSB0aGF0IGV2ZW4gaWYgYSBwYXJ0aWN1bGFyIHByb3BlcnR5IGlzIG5vdCBjb25maW5lZCB0byBhIGZpbml0ZSBzZXQgb2YgdmFsdWVzIGFzCi0JICogZGVmaW5lZCBieSB7QGxpbmsgI2dldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcpfXRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBhCi0JICogdmFsaWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIHRoZSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKiBAc2VlICNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBhcnJheSBjb25zaXN0aW5nIG9mIGFsbCB2YWxpZAotCSAqIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcnMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIEVhY2gKLQkgKiB7QGxpbmsgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yfSBjb250YWlucyBhIHZhbHVlIGFuZCBhIGh1bWFuIHJlYWRpYmxlIGRlc2NyaXB0aW9uIGZvciB0aGUKLQkgKiB2YWx1ZS4gVGhlIHNldCBvZiBhbGwgdmFsdWVzIGluIHRoZSByZXR1cm5lZCBhcnJheSBhcmUgdGhvc2UgdmFsdWVzIHdoaWNoIGFyZSB2YWxpZCBmb3IgdGhlCi0JICogSURhdGFNb2RlbC4gVGhpcyB2YWx1ZSBzZXQgb25seSBtYWtlcyBzZW5zZSB3aGVuIHZhbGlkIHByb3BlcnR5IHZhbHVlcyBjb25mb3JtIHRvIGEgd2VsbAotCSAqIGRlZmluZWQgZmluaXRlIHNldC4gSWYgbm8gc3VjaCB2YWx1ZSBzZXQgZXhpc3RzIGZvciB0aGUgcHJvcGVydHksIHRoZW4gYSAwIGxlbmd0aCBhcnJheSBpcwotCSAqIHJldHVybmVkLiA8Y29kZT5udWxsPC9jb2RlPiBpcyBuZXZlciByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQXMgYW4gZXhhbXBsZSwgc3VwcG9zZSB0aGVyZSBpcyBhIHByb3BlcnR5IGNhbGxlZCA8Y29kZT5TSElSVF9TSVpFPC9jb2RlPiB3aGljaCBpcyBhbgotCSAqIDxjb2RlPkludGVnZXI8L2NvZGU+IHR5cGUuIEFsc28gc3VwcHNlIHRoYXQgdmFsaWQgc2hpcnQgc2l6ZXMgYXJlIG9ubHkgc21hbGwsIG1lZGl1bSwgb3IKLQkgKiBsYXJnZS4gSG93ZXZlciwgdGhlIGFjdHVhbCB2YWx1ZXMgcmVwcmVzZW50aW5nIHNtYWxsLCBtZWRpdW0sIGFuZCBsYXJnZSBhcmUgMSwgMiwgYW5kIDMKLQkgKiByZXNwZWN0aXZlbHkuIEEgY2FsbCB0byA8Y29kZT5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU0hJUlRfU0laRSk8L2NvZGU+IHdvdWxkIHJldHVybiBhCi0JICogRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGFycmF5IHdoZXJlIHRoZSB2YWx1ZSwgZGVzY3JpcHRpb24gcGFpcnMgd291bGQgYmUgeygxLCBzbWFsbCksCi0JICogKDIsIG1lZGl1bSksICgzLCBsYXJnZSl9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZW4gbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB2YWxpZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzCi0JICogQHNlZSAjZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyB0aGUgc3BlY2lmaWVkIElEYXRhTW9kZWxMaXN0ZW5lciB0byBsaXN0ZW4gZm9yIERhdGFNb2RlbEV2ZW50cy4gSWYgdGhlIHNwZWNpZmllZAotCSAqIGxpc3RlbmVyIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbExpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbmV3IGxpc3RlbmVyIHRvIGFkZC4KLQkgKiAKLQkgKiBAc2VlICNyZW1vdmVMaXN0ZW5lcihJRGF0YU1vZGVsTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyIGRhdGFNb2RlbExpc3RlbmVyKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIElEYXRhTW9kZWxMaXN0ZW5lci4gSWYgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBpcyBub3QgYSByZWdpc3RlcmVkCi0JICogbGlzdGVuciBvbiB0aGlzIElEYXRhTW9kZWwsIHRoZW4gY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gZWZmZWN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsTGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byByZW1vdmUuCi0JICogQHNlZSAjYWRkTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lciBkYXRhTW9kZWxMaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnN0YW50IHVzZWQgZm9yIG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBEYXRhTW9kZWxFdmVudCNWQUxVRV9DSEcKLQkgKiBAc2VlICNub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9DSEcgPSBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEc7Ci0JLyoqCi0JICogPHA+Ci0JICogQSBjb25zdGFudCB1c2VkIGZvciBub3RpZmljYXRpb24uIFRoaXMgY29udGFudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXJzIGJlY2F1c2UgaXQgZG9lcwotCSAqIG5vdCBtYXAgdG8gYW4gZXZlbnQgdHlwZSBvbiBEYXRhTW9kZWxFdmVudC4gV2hlbiBub3RpZnlpbmcgd2l0aCB0aGlzIHR5cGUsIGEgY2hlY2sgaXMgZmlyc3QKLQkgKiBkb25lIHRvIHNlZSB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBzZXQuIElmIHRoZSBwcm9wZXJ0eSBpcyA8ZW1wZj5OT1Q8L2VtcGg+IHNldCwgdGhlbiBhCi0JICogPGNvZGU+VkFMVUVfQ0hHPC9jb2RlPiBpcyBmaXJlZCwgb3RoZXJ3aXNlIG5vdGhpbmcgaGFwcGVucy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DSEcgPSBEYXRhTW9kZWxFdmVudC5ERUZBVUxUX0NIRzsKLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnN0YW50IHVzZWQgZm9yIG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBEYXRhTW9kZWxFdmVudCNFTkFCTEVfQ0hHCi0JICogQHNlZSAjbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0NIRyA9IERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEc7Ci0JLyoqCi0JICogPHA+Ci0JICogQSBjb25zdGFudCB1c2VkIGZvciBub3RpZmljYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgRGF0YU1vZGVsRXZlbnQjVkFMSURfVkFMVUVTX0NIRwotCSAqIEBzZWUgI25vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElEX1ZBTFVFU19DSEcgPSBEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHOwotCi0JLyoqCi0JICogPHA+Ci0JICogTm90aWZ5IGFsbCBsaXN0ZW5lcnMgb2YgYSBwcm9wZXJ0eSBjaGFuZ2UuIDxjb2RlPmV2ZW50VHlwZTwvY29kZT4gc3BlY2lmaWVzIHRoZSB0eXBlIG9mCi0JICogY2hhbmdlLiBBY2NlcHRpYmxlIHZhbHVlcyBmb3IgZXZlbnRUeXBlIGFyZSA8Y29kZT5WQUxVRV9DSEc8L2NvZGU+LAotCSAqIDxjb2RlPkRFRkFVTFRfQ0hHPC9jb2RlPiwgPGNvZGU+RU5BQkxFX0NIRzwvY29kZT4sIDxjb2RlPlZBTElEX1ZBTFVFU19DSEc8L2NvZGU+LiBJZgotCSAqIHRoZSBldmVudFR5cGUgaXMgPGNvZGU+REVGQVVMVF9DSEc8L2NvZGU+IGFuZCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIHNldCwgdGhlbiB0aGlzCi0JICogbWV0aG9kIHdpbGwgZG8gbm90aGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVHlwaWNhbGx5IHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGludm9rZWQgYnkgYW4gSURhdGFNb2RlbFByb3ZpZGVyIGZyb20gaXRzIHByb3BlcnR5U2V0Ci0JICogaW1wbGVtZW50YXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBjaGFuZ2luZwotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV2ZW50IHRvIGZpcmUKLQkgKiAKLQkgKiBAc2VlICNWQUxVRV9DSEcKLQkgKiBAc2VlICNERUZBVUxUX0NIRwotCSAqIEBzZWUgI0VOQUJMRV9DSEcKLQkgKiBAc2VlICNWQUxJRF9WQUxVRVNfQ0hHCi0JICogQHNlZSBEYXRhTW9kZWxFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBldmVudFR5cGUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSB0eXBpY2FsIGRpc3Bvc2UgbWV0aG9kIHVzZWQgdG8gY2xlYW4gdXAgYW55IHJlc291cmNlcyBub3QgaGFuZGxlZCBieSBnZW5lcmFsIGdhcmJhZ2UKLQkgKiBjb2xsZWN0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGFhNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBpbnRlcmZhY2UgcmVxdWlyZWQgd2hlbiBsaXN0ZW5pbmcgZm9yIERhdGFNb2RlbEV2ZW50cyBmcm9tIGFuIElEYXRhTW9kZWwuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2FkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lcikKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudAotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbExpc3RlbmVyIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFNlbnQgd2hlbiBEYXRhTW9kZWxFdmVudHMgb2NjdXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIERhdGFNb2RlbEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1MzJhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotCi0vKioKLSAqIDxwPgotICogSURhdGFNb2RlbE9wZXJhdGlvbiBkZWZpbmVzIGFuIElEYXRhTW9kZWwgZHJpdmVuIHVuZG9hYmxlIG9wZXJhdGlvbi4gRXZlcnkgSURhdGFNb2RlbE9wZXJhdGlvbgotICogbWF5IGJlIGV4dGVuZGVkIGJ5IHRoaXJkIHBhcnR5IGNsaWVudHMgdXNpbmcgdGhlIGV4dGVuZGVkIG9wZXJhdGlvbiBmcmFtZXdvcmsuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIENsaWVudHMgc2hvdWxkIHN1YmNsYXNzCi0gKiB7QGxpbmsgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb259LgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbAotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbE9wZXJhdGlvbiBleHRlbmRzIElVbmRvYWJsZU9wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXRzIHRoZSB1bmlxdWUgb3BlcmF0aW9uIGlkLiBUeXBpY2FsbHksIGNsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBvcGVyYXRpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgdW5pcXVlIG9wZXJhdGlvbiBpZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgdW5pcXVlIG9wZXJhdGlvbiBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFNldHMgdGhlIElEYXRhTW9kZWwgZm9yIHRoaXMgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBJRGF0YU1vZGVsIHVzZWQgdG8gcnVuIHRoaXMgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGlzIG9wZXJhdGlvbidzIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyBvcGVyYXRpb24ncyBJRGF0YU1vZGVsLgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgSVNjaGVkdWxpbmdSdWxlIHVzZWQgZm9yIGV4ZWN1dGluZyB0aGlzIGpvYiB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUsIElTY2hlZHVsaW5nUnVsZSwgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcil9LgotCSAqIElmIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLCB0aGVuIElXb3Jrc3BhY2UuZ2V0Um9vdCgpIGlzIHVzZWQgYXMgdGhlIElTY2hlZHVsaW5nUnVsZQotCSAqIGR1cmluZyBleGVjdXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElTY2hlZHVsaW5nUnVsZQotCSAqIAotCSAqIEBzZWUgI2dldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2UjcnVuKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZSwgSVNjaGVkdWxpbmdSdWxlLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBPcGVyYXRpb25FeGVjdXRpb25GbGFncyB1c2VkIGZvciBleGVjdXRpbmcgdGhpcyBPcGVyYXRpb24gYXMgYSB3b3Jrc3BhY2Ugam9iLgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUsIElTY2hlZHVsaW5nUnVsZSwgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcil9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBPcGVyYXRpb25FeGVjdXRpb25GbGFncwotCSAqIAotCSAqIEBzZWUgI2dldFNjaGVkdWxpbmdSdWxlKCkKLQkgKiBAc2Vlb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlLCBJU2NoZWR1bGluZ1J1bGUsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBmcmFtZXdvcmsgd2lsbCBzZXQgdGhlIGVudmlyb25tZW50IG9uIHRoaXMgb3BlcmF0aW9uIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4gVGhlIG9wZXJhdGlvbgotCSAqIGNhbiB0aGVuIHVzZSB0aGUgZW52aXJvbm1lbnQgdG8gcmVwb3J0IHN0YXR1cywgbG9nIGluZm9ybWF0aW9uLCBhbmQgYWNjZXNzIHJlc291cmNlcyBpbiBhbgotCSAqIGVudmlyb25tZW50IG5ldXRyYWwgd2F5LgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBlbnZpcm9ubWVudAotCSAqICAgICAgICAgICAgdGhlIElFbnZpcm9ubWVudCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnQoSUVudmlyb25tZW50IGVudmlyb25tZW50KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElFdmlyb25tZW50IHNldCBpbiB7QGxpbmsgI3NldEVudmlyb25tZW50KElFbnZpcm9ubWVudCl9fQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBJRW52aXJvbm1lbnQKLQkgKiAKLQkgKiBAc2VlICNzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQpCi0JICovCi0JcHVibGljIElFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliZTA4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIERhdGEgTW9kZWwKLSAqIFByb3BlcnRpZXMgaW50ZXJmYWNlcy4gU3ViIGludGVyZmFjZSBjbGFzc2VzIChlLmcuCi0gKiA8Y29kZT5zb21lLmNvbXBhbnkuSUZvb0RhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3M8L2NvZGU+KSBzaG91bGQgYmUgdXNlZCB0bwotICogY3JlYXRlIGluc3RhbmNlcyBvZiBJRGF0YU1vZGVscyB1c2luZyB0aGUKLSAqIHtAbGluayBEYXRhTW9kZWxGYWN0b3J5I2NyZWF0ZURhdGFNb2RlbChDbGFzcyl9IG1ldGhvZC4gSW4gb3JkZXIgZm9yIHRoaXMKLSAqIG1lY2hhbmlzbSB0byB3b3JrLCB0aGUgYmFja2luZyB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSBjbGFzcyBtdXN0IGJlCi0gKiByZWdpc3RlcmQgdG8gc3VwcG9ydCB0aGUgc3ViIElEYXRhTW9kZWxQcm9wZXJ0aWVzIGludGVyZmFjZSBpbiBvbmUgb2YgdHdvCi0gKiB3YXlzLiBUaGlzIHJlZ2lzdHJhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIGJ5IHRoZSBtb2RlbCBkZXZlbG9wZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBmaXJzdCB3YXkgdG8gcmVnaXN0ZXIgdGhlIGNvcnJlY3Qge0BsaW5rIElEYXRhTW9kZWxQcm92aWRlcn0gY2xhc3MgaXMgZm9yCi0gKiB0aGUgaW50ZXJmYWNlIHRvIGRlZmluZSBhIHB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzIGZpZWxkCi0gKiB3aGljaCBpcyBzZXQgdG8gdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzLCBlLmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxjb2RlPnB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gc29tZS5jb21wYW55LkZvb0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzPC9jb2RlPgotICogPC9wPgotICogVGhlIGFib3ZlIG1lY2hhbmlzbSBpcyByZWNvbW1lbmRlZCB3aGVuZXZlciB0aGUge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfSBhbmQKLSAqIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzZXMgYXJlIGJvdGggZGVmaW5lZCBpbiB0aGUgc2FtZSBwbHVnaW4gc2NvcGUuCi0gKiBBIHNlY29uZCBtZWNoYW5pc20gdXNpbmcgdGhlIERhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiBwb2ludCBpcwotICogYXZhaWxhYmxlIHdoZW4gdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzIGlzIGRlZmluZW5kIG91dHNpZGUgdGhlCi0gKiB7QGxpbmsgSURhdGFNb2RlbFByb3BlcnRpZXN9IHBsdWdpbiBzY29wZS4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqIEEgYm9vbGVhbiBwcm9wZXJ0eSBkZWZhdWx0cyB0byBCb29sZWFuLlRSVUUuIElmIHRoaXMgaXMgc2V0IHRvIEJvb2xlYW4uRkFMU0Ugbm8gZXh0ZW5kZWQKLQkgKiBvcGVyYXRpb25zIHdpbGwgYmUgZXhlY3V0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfRVhURU5TSU9OUyA9ICJJRGF0YU1vZGVsUHJvcGVydGllcy5BTExPV19FWFRFTlNJT05TIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEEgTGlzdCBjb250YWluaW5nIFN0cmluZyBvYmplY3RzLCBkZWZhdXRscyB0byBhbiBlbXB0eSBMaXN0LiBJZiB0aGlzIGxpc3QgY29udGFpbnMgZWxlbWVudHMKLQkgKiBhbmQgQUxMT1dfRVhURU5TSU9OUyBpcyBzZXQgdG8gQm9vbGVhbi5UUlVFLCB0aGVuIG9ubHkgZXh0ZW5kZWQgb3BlcmF0aW9ucyBub3QgaWRlbnRpZmllZCBpbgotCSAqIHRoaXMgbGlzdCB3aWxsIGJlIGV4ZWN1dGVkLiBUaGVzZSBzdHJpbmdzIHNob3VsZCBlaXRoZXIgYmUgdGhlIG9wZXJhdGlvbiBpZCBvciB0aGUgZnVsbHkKLQkgKiBxdWFsaWZpZWQgb3BlcmF0aW9uIGNsYXNzIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVFJJQ1RfRVhURU5TSU9OUyA9ICJJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYmZkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogSURhdGFNb2RlbFByb3ZpZGVycyBhcmUgdXNlZCBieSB0aGUgRGF0YU1kb2VsRmFjdG9yeSB0byBjb25zdHJ1Y3QgSURhdGFNb2RlbHMuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIENsaWVudHMgc2hvdWxkIHN1YmNsYXNzCi0gKiB7QGxpbmsgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcn0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsIiwgMCwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGJhY2tpbmcgSURhdGFNb2RlbCBmb3IgdGhpcyBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYmFja2luZyBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyBmb3Igd2hpY2ggdGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZS4gVGhpcyBtZXRob2QgaXMKLQkgKiBjYWxsZWQgb25seSBvbmNlIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgdmFsaWQgcHJvcGVydHkgbmFtZXMuCi0JICovCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBQcm92aWRlcnMgc2hvdWxkIHBlcmZvcm0gYWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiBoZXJlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHdoZXJlIHRoZSBwcm92aWRlciBzaG91bGQgZGVmaW5lIGhvdyBkZWZhdWx0IHByb3BlcnRpZXMgc2hvdWxkIGJlIGNvbXB1dGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgZGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHdoZXJlIHRoZSBwcm92aWRlciBzaG91bGQgZGVmaW5lIGhvdyBwcm9wZXJ0eSBlbmFibGVtZW50cyBhcmUgY29tcHV0ZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBlbmFibGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogSURhdGFNb2RlbFByb3ZpZGVycyBzaG91bGQgcGVyZm9ybSBwcm9wZXJ0eSB2YWxpZGF0aW9uIGhlcmUuIEFsbCBjYWxscyB0bwotCSAqIElEYXRhTW9kZWwudmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcpIGFyZSByb3V0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIElEYXRNb2RlbFByb3ZpZGVyLiBXaGVuCi0JICogSURhdGFNb2RlbC52YWxpZGF0ZSgpIG9yIElEYXRhTW9kZWwudmFsaWRhdGUoYm9vbGVhbikgYXJlIGNhbGxlZCB0byB2YWxpZGF0ZSB0aGUgZW50aXJlCi0JICogSURhdGFNb2RlbCwgYW55IG5lc3RlZCBtb2RlbCBuYW1lcyBhcmUgYWxzbyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgSURhdGFNb2RlbFByb3ZpZGVyIGZvciBhCi0JICogY2hhbmNlIHRvIHZhbGlkYXRlIHRoZSBuZXN0ZWQgSURhdGFNb2RlbCBpbiBhbiBhcHByb3ByaWF0ZSBtYW5uZXIuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIGFuIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYWxsYmFjayBob29rIGZvciB0aGUgSURhdGFNb2RlbCBwcm92aWRlciB0byBiZSBub3RpZmllZCBvZiBhIHNldFByb3BlcnR5KCkKLQkgKiBjYWxsIGludm9rZWQgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBhY3R1YWwgdmFsdWUgaGFzIGJlZW4KLQkgKiBzdG9yZWQgYnkgdGhlIElEYXRhTW9kZWwgYnV0IGJlZm9yZSBhbnkgZ2VuZXJhbCBub3RpZmljYXRpb25zIGFyZSBmaXJlZCB0byBpdHMgbGlzdGVuZXJzLgotCSAqIFRodXMgdGhpcyBJRGF0YU1vZGVsUHJvdmlkZXIgbWF5IHJlYWN0IHRvIHVwZGF0ZXMgYXByb3ByaWF0ZWx5IGJ5IHNldHRpbmcgb3RoZXIgcHJvcGVydGllcywKLQkgKiBub3RpZnlpbmcgZGVmYXVsdCBjaGFuZ2VzLCBub3RpZnlpbmcgdmFsaWQgdmFsdWUgY2hhbmdlcywgZXRjLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIGZpcmUgYSBWQUxVRV9DSEcgRGF0YU1vZGVsRXZlbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpOwotCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRDb250ZXh0KCk7Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCk7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWU3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+Q29tcG9uZW50IGNyZWF0aW9uIGFuZCBSZWZlcmVuY2VkIENvbXBvbmVudCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIEFQSSAgZm9yIERhdGEgTW9kZWwgUHJvdmlkZXIgZnJhbWV3b3JrIGZvciBidWlsaW5nIGV4ZWN1dGFibGUKLSAgICAgICAgYW5kIHVuZG9hYmxlIG9wZXJhdGlvbnMgdXNpbmcgZGF0YSBtb2RlbHMsIHRoZWlyIHByb3ZpZGVycyBhbmQgcHJvdmlkZXIgaW50ZXJmYWNlcyB0aGF0Ci0gICAgICAgIGNvbnRhaW4gdGhlIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgcHJvdmlkZXJzIHRvIHNldCBhbmQgcmV0cmlldmUgdGhlc2UgcHJvcGVydGllc2UuIAotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWY3NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5Db21wb25lbnQgY3JlYXRpb24gYW5kIFJlZmVyZW5jZWQgQ29tcG9uZW50IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgQVBJIHRoYXQgZGVmaW5lcyB0aGUgcHJvcGV0aWVzIHRoYXQgY2FuIGJlIHNldCBvbiBhIGZsZXhpYmxlCi0gICAgICAgIHByb2plY3QgZGF0YW1vZGVsIHRvIGRyaXZlIHRoZSB0aGUgd2l6YXJkIGFuZCBvcGVyYXRpb25zLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDA2OWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTIsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5GdW5jdGlvbkdyb3VwUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIENvbW1vbiBzdXBlcmNsYXNzIGZvciBlbmFibGVtZW50LWF3YXJlIChlLmcuLCB1c2luZyBmdW5jdGlvbiBncm91cHMgb3IgYWN0aXZpaXRpZXMpIGV4dGVuc2lvbgotICogcG9pbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IgZXh0ZW5kcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgaW1wbGVtZW50cyBJZGVudGlmaWFibGUgewotCi0JcHJvdGVjdGVkIEludGVnZXIgcHJpb3JpdHk7Ci0KLQlwdWJsaWMgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFuRWxlbWVudCkgewotCQlzdXBlcihhbkVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBJRW5hYmxlbWVudElkZW50aWZpZXIgZ2V0RW5hYmxlbWVudElkZW50aWZpZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZ2V0SUQoKSwgcHJvamVjdCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJRCgpOwotCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJaWYgKHByaW9yaXR5ID09IG51bGwpCi0JCQlwcmlvcml0eSA9IG5ldyBJbnRlZ2VyKEZ1bmN0aW9uR3JvdXBSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEZ1bmN0aW9uUHJpb3JpdHkoZ2V0SUQoKSkpOwotCQlyZXR1cm4gcHJpb3JpdHkuaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSVByb2plY3QgcCkgewotCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWQgPSBnZXRFbmFibGVtZW50SWRlbnRpZmllcihwKTsKLQkJcmV0dXJuIGlkLmlzRW5hYmxlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWRhcHRhYmlsaXR5VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BZGFwdGFiaWxpdHlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOGExOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BZGFwdGFiaWxpdHlVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRhYmlsaXR5VXRpbGl0eSB7Ci0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGVsZW1lbnQsIENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCXJldHVybiAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCWVsc2UKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoZWxlbWVudCwgYWRhcHRlcik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Db25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzU3MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Db25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgewotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gaWQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlTdHJpbmcgcGx1Z2luSWQgPSBudWxsOwotCi0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQotCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJLy8gVE9ETyBqc2hvbGwgaXMgdGhpcyBjb3JyZWN0Pz8/Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzMzMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotLyoqCi0gKiBPdGhlciB0aGluZ3MgdG8gZGVsZXRlOgotICogCi0gKiBUaGUgd3RwdWlBY3Rpb24gZXh0ZW5zaW9uIHBvaW50IGFuZCBzY2hlbWEgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpCi0gKi8KLQotCi0vKioKLSAqIFRoaXMgaGFzIGJlZW4gc2xhdGVkIGZvciByZW1vdmFsIHBvc3QgV1RQIDEuNS4gRG8gbm90IHVzZSB0aGlzIGNsYXNzL2ludGVyZmFjZS9tZXRob2QvZmllbGQKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqIAotICovCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgYmVpbmcgdXNlZCB0byB0cmFjayBjb2RlIHNsYXRlZCBmb3IgcmVtb3ZhbC4gQW55IGNsYXNzIG9yIGludGVyZmFjZQotICogaW1wbGVtZW50aW5nIG9yIGV4dGVuZGluZyB0aGlzIGludGVyZmFjZSByZXNwZWN0aXZlbHkgc2hvdWxkIG5vdCBiZSB1c2VkLiBBbGwgc3VjaCBjbGFzc2VzIGFuZAotICogaW50ZXJmYWNlcyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhbmQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgZGVsZXRlZCBwb3N0IFdUUCAxLjUuCi0gKiAKLSAqIEFueSBtZXRob2Qgb3IgZmllbGQgd2l0aCBqYXZhZG9jIHJlZmVyZW5jaW5nIHRoaXMgaW50ZXJmYWNlIHNob3VsZCBub3QgYmUgdXNlZCBhbmQgd2lsbCBiZQotICogZGVsZXRlZCBwb3N0IFdUUCAxLjUKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9FeGNlcHRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxN2Q2NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9FeGNlcHRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGZhY3RvciBjb21tb24gY29kZSBmb3IgaW1wbGVtZW50ZXJzIG9mIElBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGVscGVyIHsKLQkvKioKLQkgKiBVdGlsaXR5IGNsYXNzOyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCi0JICovCi0JcHJpdmF0ZSBFeGNlcHRpb25IZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tCi0JICogCi0JICogQGV4Y2VwdGlvbiBhbmQKLQkgKiAgICAgICAgICAgICAgICBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKElXcmFwcGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCg0KTsKLQkJbWVzc2FnZXMuYWRkKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQlFeGNlcHRpb24gbmVzdGVkID0gZXhjZXB0aW9uLmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQl3aGlsZSAobmVzdGVkICE9IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZChuZXN0ZWQuZ2V0TWVzc2FnZSgpKTsKLQkJCWlmIChuZXN0ZWQgaW5zdGFuY2VvZiBJV3JhcHBlZEV4Y2VwdGlvbikKLQkJCQluZXN0ZWQgPSAoKElXcmFwcGVkRXhjZXB0aW9uKSBuZXN0ZWQpLmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQkJZWxzZQotCQkJCW5lc3RlZCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgbWVzc2FnZXMudG9BcnJheShuZXcgU3RyaW5nW21lc3NhZ2VzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbQotCSAqIAotCSAqIEBleGNlcHRpb24gYW5kCi0JICogICAgICAgICAgICAgICAgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QsIGNvbmNhdGVuYXRlZCBhcwotCSAqICAgICAgICAgICAgICAgIG9uZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKElXcmFwcGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlTdHJpbmdbXSBtZXNzYWdlcyA9IGdldEFsbE1lc3NhZ2VzKGV4Y2VwdGlvbik7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjU2KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJc2IuYXBwZW5kKG1lc3NhZ2VzW2ldKTsKLQkJCWlmIChpIDwgbWVzc2FnZXMubGVuZ3RoIC0gMSkKLQkJCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSGFzaFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSGFzaFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkYTI3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0hhc2hVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1wdWJsaWMgY2xhc3MgSGFzaFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBpbnQgU0VFRCA9IDExOwotCXByaXZhdGUgc3RhdGljIGludCBNVUxUSSA9IDMxOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2goaW50IHNlZWQsIGludCBpKXsKLQkJcmV0dXJuIHNlZWQgKiBNVUxUSSArIGk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2goaW50IHNlZWQsIE9iamVjdCBvYmopewotCQlyZXR1cm4gaGFzaChzZWVkLCBudWxsICE9IG9iaiA/IG9iai5oYXNoQ29kZSgpIDogU0VFRCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2goaW50IHNlZWQsIGJvb2xlYW4gYil7Ci0JCXJldHVybiBoYXNoKHNlZWQsIGIgPyAxIDogU0VFRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2F2ZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVNhdmVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2N2NlMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2F2ZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgQVBJIGZvciBjb3Bpbmcgd2l0aCBhdHRlbXB0cyB0byBvdmVyd3JpdGUgcmVhZC1vbmx5IGZpbGVzIG9yIHNhdmUgZmFpbHVyZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2F2ZUhhbmRsZXIgewotCXB1YmxpYyB2b2lkIGFjY2VzcygpOwotCi0JcHVibGljIHZvaWQgaGFuZGxlU2F2ZUZhaWxlZChTYXZlRmFpbGVkRXhjZXB0aW9uIGV4LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKElGaWxlIGFGaWxlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjFkOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0tFWSA9ICJJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoSUZpbGUgW10gZmlsZXMpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lXcmFwcGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lXcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2YzYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgQXJjaGl2ZVJ1bnRpbWUgYW5kIEFyY2hpdmVXcmFwcGVkIGV4Y2VwdGlvbnMsIHdoaWNoIGNhbiBjb250YWluIG5lc3RlZAotICogZXhjZXB0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvCi0JICogaW5uZXJtb3N0LCBjb25jYXRlbmF0ZWQgYXMgb25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpOwotCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpOwotCi0JcHVibGljIGphdmEubGFuZy5FeGNlcHRpb24gZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKTsKLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpOwotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc1NmE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDIxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lc3NhZ2VzIHsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE1lc3NhZ2VzKCkgewotCQlpbml0aWFsaXplQnVuZGxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUJ1bmRsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZG9HZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKHJlc291cmNlQnVuZGxlICE9IG51bGwgPyByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZG9HZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCVN0cmluZyBwYXR0ZXJuID0gZG9HZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCQlpZiAocGF0dGVybiAhPSBudWxsKQotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIGFyZ3MpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVGYWlsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2MzUwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVGYWlsZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi0vKioKLSAqIFJ1bnRpbWUgZXhjZXB0aW9uIHRoYXQgY291bGQgZ2V0IHRocm93biBkdXJpbmcgc2F2ZSBvZiBhbiBlZGl0IG1vZGVsOyBjbGllbnRzIHNob3VsZCB1c2UKLSAqIHtAbGluayAjZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXN9dG8gZ2V0IGFsbCB0aGUgbWVzc2FnZXMgb2YgdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zIHRvCi0gKiByZXBvcnQgdGhlIGZhaWx1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2NDAwMTg5MDE5MTA3MzEyNDBMOwotCi0JLyoqCi0JICogU2F2ZUZhaWxlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNhdmVGYWlsZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVySGVhZGxlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJIZWFkbGVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWMwN2NlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJIZWFkbGVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWkuSVdGVFdyYXBwZWRFeGNlcHRpb247Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzE5LzIwMDEgMTE6NDA6NTkgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFNhdmVIYW5kbGVySGVhZGxlc3MgaW1wbGVtZW50cyBJU2F2ZUhhbmRsZXIgewotCS8qKgotCSAqIEhlYWRsZXNzU2F2ZUhhbmRsZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2F2ZUhhbmRsZXJIZWFkbGVzcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhY2Nlc3MgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzKCkgewotCX0KLQotCS8qKgotCSAqIGhhbmRsZVNhdmVGYWlsZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlU2F2ZUZhaWxlZChTYXZlRmFpbGVkRXhjZXB0aW9uIGV4LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRocm93IGV4OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoSVdGVFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJRXhjZXB0aW9uIG5lc3RlZCA9IGV4LmdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpOwotCQlpZiAobmVzdGVkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShuZXN0ZWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoRXhjZXB0aW9uIGV4KSB7Ci0JCWlmIChleCBpbnN0YW5jZW9mIElXRlRXcmFwcGVkRXhjZXB0aW9uKQotCQkJcmV0dXJuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZSgoSVdGVFdyYXBwZWRFeGNlcHRpb24pIGV4KTsKLQkJZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJcmV0dXJuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZSgoQ29yZUV4Y2VwdGlvbikgZXgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIHN0YXR1cyA9IGV4LmdldFN0YXR1cygpOwotCQlpZiAoc3RhdHVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVRocm93YWJsZSBuZXN0ZWQgPSBzdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0JCWlmIChuZXN0ZWQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJcmV0dXJuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZSgoQ29yZUV4Y2VwdGlvbikgbmVzdGVkKTsKLQkJcmV0dXJuIHN0YXR1cy5nZXRDb2RlKCkgPT0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzLkZBSUxFRF9XUklURV9MT0NBTDsKLQl9Ci0KLQkvKioKLQkgKiByZWxlYXNlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGVycm9yID0gV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVW5hYmxlX3RvX3NhdmVfcmVhZC1vbmx5X2ZfRVJST1JfIiwgbmV3IE9iamVjdFtde2FGaWxlLmdldEZ1bGxQYXRoKCl9KTsgLy8kTk9OLU5MUy0xJCA9ICJVbmFibGUgdG8gc2F2ZSByZWFkLW9ubHkgZmlsZTogIgotCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXJyb3IpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJSZWdpc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlSGFuZGxlclJlZ2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZWUyNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlSGFuZGxlclJlZ2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotCi0KLS8qKgotICogQSByZWdpc3RyeSBmb3IgdGhlIGRlZmF1bHQgSVNhdmVIYW5kbGVyIHRvIHVzZSB3aGVuIHNhdmluZyBlZGl0IG1vZGVscwotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUhhbmRsZXJSZWdpc3RlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSVNhdmVIYW5kbGVyIHNhdmVIYW5kbGVyOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgYW5kIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNhdmVIYW5kbGVyUmVnaXN0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2F2ZUhhbmRsZXIgZ2V0U2F2ZUhhbmRsZXIoKSB7Ci0JCWlmIChzYXZlSGFuZGxlciA9PSBudWxsKQotCQkJc2F2ZUhhbmRsZXIgPSAoSVNhdmVIYW5kbGVyKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKCJzYXZlSGFuZGxlciIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzYXZlSGFuZGxlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TaW1wbGVWYWxpZGF0ZUVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4NDQ2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRlRWRpdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZXMgbXVzdCBjb250YWluIG9ubHkge0BsaW5rIElGaWxlfXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlRWRpdChMaXN0IGZpbGVzKXsKLQkJaWYoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5zaXplKCkgPT0gMCl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdGVFZGl0KCAoSUZpbGUgW10pZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFZGl0KElGaWxlW10gZmlsZXMpIHsKLQkJaWYoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCB2YWxpZGF0b3IgPSAoSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQuQ0xBU1NfS0VZKTsKLQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZUVkaXQoZmlsZXMpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsKQotCQkJCXJldHVybiBzdGF0dXMuaXNPSygpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOGZlNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzIGltcGxlbWVudHMgSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQgewotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVFZGl0KElGaWxlW10gZmlsZXMpIHsKLQkJZmluYWwgTGlzdCBmaWxlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaT0wO2k8ZmlsZXMubGVuZ3RoOyBpKyspewotCQkJaWYoZmlsZXNbaV0uZXhpc3RzKCkgJiYgZmlsZXNbaV0uaXNSZWFkT25seSgpKXsKLQkJCQlmaWxlc0xpc3QuYWRkKGZpbGVzW2ldKTsKLQkJCX0KLQkJfQotCQlpZihmaWxlc0xpc3Quc2l6ZSgpID4gMCl7Ci0JCQlJRmlsZSBbXSBmaWxlc1RvVmFsaWRhdGUgPSAoSUZpbGUgW10pZmlsZXNMaXN0LnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzTGlzdC5zaXplKCldKTsKLQkJCXJldHVybiB2YWxpZGF0ZUVkaXRJbXBsKGZpbGVzVG9WYWxpZGF0ZSk7Ci0JCX0KLQkJcmV0dXJuIElEYXRhTW9kZWxQcm92aWRlci5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFZGl0SW1wbChJRmlsZVtdIGZpbGVzVG9WYWxpZGF0ZSkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlc1RvVmFsaWRhdGUsIG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzM2ZkZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDEwLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLklNc2dMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWkuV29ya2JlbmNoVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdUUFBsdWdpbiBleHRlbmRzIFBsdWdpbiBpbXBsZW1lbnRzIElNc2dMb2dnZXIgewotCXByb3RlY3RlZCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0JcHJvdGVjdGVkIHN0YXRpYyBXVFBQbHVnaW4gaW5zdGFuY2UgPSBudWxsOyAKLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBXVFBQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKSB7Ci0JCQlsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldFBsdWdpbklEKCkpOwotCQkJc2V0UmVuZGVyZXIobG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhTG9nZ2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVuZGVyZXIoTG9nZ2VyIGFMb2dnZXIpIHsKLQkJbmV3IERlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyKGFMb2dnZXIpOwotCX0KLQotCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlyZXR1cm4gZ2V0TXNnTG9nZ2VyKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXRmb3JtQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLk9TX01BQ09TWC5lcXVhbHMoUGxhdGZvcm0uZ2V0T1MoKSkgPyBmYWxzZSA6IG5ldwotCQkJCWphdmEuaW8uRmlsZSgiYSIpLmNvbXBhcmVUbyhuZXcgamF2YS5pby5GaWxlKCJBIikpICE9IDA7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UGx1Z2luSUQoKTsKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uICB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlXb3JrYmVuY2hVdGlsLnNldFdvcmtiZW5jaElzUnVubmluZyh0cnVlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFByb2plY3RVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUHJvamVjdFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjc0ZWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgNCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdUUFByb2plY3RVdGlsaXRpZXMgewotCi0JLyoqCi0JICogQWRkcyBhIG9sZCBuYXV0dXJlIHRvIGEgcHJvamVjdCwgRklSU1QsIHRoaXMgaXMgdXNlZCB0byBtYWtlIHByb2plY3QgYmFja3dhcmQgY29tcGF0aWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPbGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0KLQkJLy9jaGVjayBpZiB0aGUgb2xkIG5hdHVyZSBkb2VzIG5vdCBleGlzdAotCQlib29sZWFuIGFkZE5hdHVyZSA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJldk5hdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYXR1cmUgPSBwcmV2TmF0dXJlc1tpXTsKLQkJCWlmIChuYXR1cmUuZXF1YWxzKG5hdHVyZUlkKSkgewotCQkJCWFkZE5hdHVyZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChhZGROYXR1cmUpIHsKLQkJCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMSwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJCW5ld05hdHVyZXNbMF0gPSBuYXR1cmVJZDsKLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIElSZXNvdXJjZS5BVk9JRF9OQVRVUkVfQ09ORklHLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuYXR1cmUgaW4gdGhlIHByb2plY3QgaW4gdGhlIGluZGV4IHNwZWNpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPbGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkLCBpbnQgaW5kZXgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQotCQkvL2NoZWNrIGlmIHRoZSBvbGQgbmF0dXJlIGRvZXMgbm90IGV4aXN0Ci0JCWJvb2xlYW4gYWRkTmF0dXJlID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmV2TmF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hdHVyZSA9IHByZXZOYXR1cmVzW2ldOwotCQkJaWYgKG5hdHVyZS5lcXVhbHMobmF0dXJlSWQpKSB7Ci0JCQkJYWRkTmF0dXJlID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkZE5hdHVyZSkgewotCQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBpbmRleCk7Ci0KLQkJCW5ld05hdHVyZXNbaW5kZXhdID0gbmF0dXJlSWQ7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCBpbmRleCwgbmV3TmF0dXJlcywgaW5kZXggKyAxLCBwcmV2TmF0dXJlcy5sZW5ndGggLSBpbmRleCk7Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUmVzb3VyY2UuQVZPSURfTkFUVVJFX0NPTkZJRywgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmF1dHVyZSB0byBhIHByb2plY3QsIEZJUlNUCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDEsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbMF0gPSBuYXR1cmVJZDsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmF0dXJlIHRvIGEgcHJvamVjdCwgTEFTVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3RMYXN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIGEgbmF0dXJlIGZyb20gdGhlIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTmF0dXJlRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCWludCBzaXplID0gcHJldk5hdHVyZXMubGVuZ3RoOwotCQlpbnQgbmV3c2l6ZSA9IDA7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlib29sZWFuIG1hdGNoZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChwcmV2TmF0dXJlc1tpXS5lcXVhbHMobmF0dXJlSWQpKSB7Ci0JCQkJbWF0Y2hmb3VuZCA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQluZXdOYXR1cmVzW25ld3NpemUrK10gPSBwcmV2TmF0dXJlc1tpXTsKLQkJfQotCQlpZiAoIW1hdGNoZm91bmQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsICJUaGUgbmF0dXJlIGlkICIgKyBuYXR1cmVJZCArICIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmdbXSB0ZW1wID0gbmV3TmF0dXJlczsKLQkJbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbbmV3c2l6ZV07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgbmV3TmF0dXJlcywgMCwgbmV3c2l6ZSk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXROYXR1cmVEZXNjcmlwdG9yKG5hdHVyZUlkKSA9PSBudWxsKSB7Ci0JCQkvLyBUaGUgbmF0dXJlIGRvZXMgbm90IGV4aXN0LCBzbyBkbyBub3QgYXR0ZW1wdCB0byBkZS1jb25maWd1cmUgaXQgd2hpbGUgcmVtb3ZpbmcgaXQuCi0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUmVzb3VyY2UuQVZPSURfTkFUVVJFX0NPTkZJRyB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIG51bGwpOwotCQl9IGVsc2UgewotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IG9iamVjdCkgewotCQlJUHJvamVjdCByZXN1bHQgPSBudWxsOwotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJlc3VsdCA9IChJUHJvamVjdCkgb2JqZWN0OwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQlyZXN1bHQgPSAoKElSZXNvdXJjZSkgb2JqZWN0KS5nZXRQcm9qZWN0KCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXN1bHQgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgb2JqZWN0KS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4MmQ2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJ3dHBfY29tbW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncywgaW50IHgpIHsKLQotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XcmFwcGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyYWJhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1wdWJsaWMgY2xhc3MgV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkyMjE5MjU1ODE2MDM2NDg1MzhMOwotCi0JLyoqCi0JICogV0ZUV3JhcHBlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBXcmFwcGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICovCi0JcHVibGljIFdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCkgewotCQlzdXBlcih0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgV3JhcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgdGFyZ2V0LCBTdHJpbmcgcykgewotCQlzdXBlcih0YXJnZXQsIHMpOwotCX0KLQotCS8qKgotCSAqIFByaW50IG91dCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBzeXN0ZW0gZXJyLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQkJcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcykgewotCQlpZiAoZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJcy5wcmludGxuKCJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkCi0JCQlnZXRUYXJnZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpIHsKLQkJaWYgKGdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCXMucHJpbnRsbigiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxZGU4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLXB1YmxpYyBjbGFzcyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBJV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNjg0NjM3NzQ2Mjc1NjIwMTAxTDsKLQkvKiogVGhlIGV4Y2VwdGlvbiB3aGljaCBuZWNlc3NpdGF0ZWQgdGhpcyBydW50aW1lIGV4Y2VwdGlvbiwgaWYgb25lIGV4aXN0cyAqLwotCXByb3RlY3RlZCBFeGNlcHRpb24gbmVzdGVkRXhjZXB0aW9uOwotCi0JcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcigpOwotCQlzZXROZXN0ZWRFeGNlcHRpb24oZSk7Ci0JfQotCi0JcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCXB1YmxpYyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocyk7Ci0JCXNldE5lc3RlZEV4Y2VwdGlvbihlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKCkgewotCQlyZXR1cm4gRXhjZXB0aW9uSGVscGVyLmdldEFsbE1lc3NhZ2VzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvCi0JICogaW5uZXJtb3N0LCBjb25jYXRlbmF0ZWQgYXMgb25lCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKSB7Ci0JCXJldHVybiBFeGNlcHRpb25IZWxwZXIuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXModGhpcyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpIHsKLQkJRXhjZXB0aW9uIG4gPSBnZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJaWYgKG4gPT0gbnVsbCkKLQkJCXJldHVybiB0aGlzOwotCQllbHNlIGlmIChuIGluc3RhbmNlb2YgSVdyYXBwZWRFeGNlcHRpb24pCi0JCQlyZXR1cm4gKChJV3JhcHBlZEV4Y2VwdGlvbikgbikuZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldE5lc3RlZEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIG5lc3RlZEV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGRlZCB0byBwcm92aWRlIGNvbXBhdGliaWxpdHkgZm9yIHRoZSBKYXZhIDEuNC4yIGFkZGl0aW9uIG9mCi0JICogPGNvZGU+VGhyb3dhYmxlLmdldENhdXNlKCk8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIG5lc3RlZCBleGNlcHRpb24gaGVsZCBieSB0aGUgcmVjZWl2ZXIuCi0JICovCi0JcHVibGljIGphdmEubGFuZy5UaHJvd2FibGUgZ2V0Q2F1c2UoKSB7Ci0JCXJldHVybiBnZXROZXN0ZWRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgb3V0IGEgc3RhY2sgdHJhY2UgdG8gdGhlIHN5c3RlbSBlcnIuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotCQlwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4gSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKSB7Ci0JCWlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJcy5wcmludGxuKCJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkCi0JCQluZXN0ZWRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4gSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKSB7Ci0JCWlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJcy5wcmludGxuKCJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkCi0JCQluZXN0ZWRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld05lc3RlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5lc3RlZEV4Y2VwdGlvbihqYXZhLmxhbmcuRXhjZXB0aW9uIG5ld05lc3RlZEV4Y2VwdGlvbikgewotCQluZXN0ZWRFeGNlcHRpb24gPSBuZXdOZXN0ZWRFeGNlcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9hY3Rpdml0aWVzL1dUUEFjdGl2aXR5QnJpZGdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2FjdGl2aXRpZXMvV1RQQWN0aXZpdHlCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUzOGVhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2FjdGl2aXRpZXMvV1RQQWN0aXZpdHlCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmFjdGl2aXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdUUEFjdGl2aXR5QnJpZGdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UID0gIldUUEFjdGl2aXR5QnJpZGdlSGVscGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNURU5FUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFdUUEFjdGl2aXR5QnJpZGdlIElOU1RBTkNFID0gbnVsbDsKLQlwcml2YXRlIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyW10gbGlzdGVuZXJzOwotCi0JcHVibGljIHN0YXRpYyBXVFBBY3Rpdml0eUJyaWRnZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKG51bGwgPT0gSU5TVEFOQ0UpIHsKLQkJCUlOU1RBTkNFID0gbmV3IFdUUEFjdGl2aXR5QnJpZGdlKCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXByaXZhdGUgV1RQQWN0aXZpdHlCcmlkZ2UoKSB7Ci0JCWxvYWRFeHRlbnNpb25Qb2ludHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVBY3Rpdml0eShTdHJpbmcgYWN0aXZpdHlJRCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uZW5hYmxlQWN0aXZpdHkoYWN0aXZpdHlJRCwgZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEVuYWJsZWRBY3Rpdml0eUlkcygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCXJldHVybiBsaXN0ZW5lcnNbaV0uZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkQWN0aXZpdHlJZHMoU2V0IGFjdGl2aXR5SURzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uc2V0RW5hYmxlZEFjdGl2aXR5SWRzKGFjdGl2aXR5SURzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTZXQgZ2V0QWN0aXZpdHlJRHNGcm9tQ29udHJpYnV0aW9uKFN0cmluZyBsb2NhbElELCBTdHJpbmcgcGx1Z2luSUQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCXJldHVybiBsaXN0ZW5lcnNbaV0uZ2V0QWN0aXZpdHlJRHNGcm9tQ29udHJpYnV0aW9uKGxvY2FsSUQsIHBsdWdpbklEKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRXh0ZW5zaW9uUG9pbnRzKCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UKTsKLQkJaWYgKHBvaW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWxpc3RlbmVycyA9IG5ldyBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlcltlbGVtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobnVsbCA9PSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoTElTVEVORVJfQ0xBU1MpKSB7Ci0JCQkJbG9nRXJyb3IoZWxlbWVudHNbaV0sICJObyAiICsgTElTVEVORVJfQ0xBU1MgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJdHJ5IHsKLQkJCQlsaXN0ZW5lcnNbaV0gPSAoV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIpIGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oTElTVEVORVJfQ0xBU1MpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nRXJyb3IoZWxlbWVudHNbaV0sICJFcnJvciBsb2FkaW5nICIgKyBMSVNURU5FUl9DTEFTUyArICI6IiArIGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShMSVNURU5FUl9DTEFTUykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2FjdGl2aXRpZXMvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvYWN0aXZpdGllcy9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzc4ZGYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvYWN0aXZpdGllcy9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuYWN0aXZpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIgewotCi0JcHVibGljIHZvaWQgZW5hYmxlQWN0aXZpdHkoU3RyaW5nIGFjdGl2aXR5SUQsIGJvb2xlYW4gZW5hYmxlZCk7Ci0KLQlwdWJsaWMgU2V0IGdldEVuYWJsZWRBY3Rpdml0eUlkcygpOwotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZEFjdGl2aXR5SWRzKFNldCBhY3Rpdml0eUlEcyk7Ci0KLQlwdWJsaWMgU2V0IGdldEFjdGl2aXR5SURzRnJvbUNvbnRyaWJ1dGlvbihTdHJpbmcgbG9jYWxJRCwgU3RyaW5nIHBsdWdpbklEKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbEV4dGVuc2lvblJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmFkYmM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbEV4dGVuc2lvblJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbEV4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT04gPSAiRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfRUxFTUVOVCA9ICJEYXRhTW9kZWxQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGSU5FU19UWVBFX0VMRU1FTlQgPSAiUHJvdmlkZXJEZWZpbmVzVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UU19UWVBFX0VMRU1FTlQgPSAiUHJvdmlkZXJJbXBsZW1lbnRzVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1BST1ZJREVSX1RZUEUgPSAicHJvdmlkZXJUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfUFJPVklERVJfSUQgPSAicHJvdmlkZXJJRCI7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfRkcgPSAiZnVuY3Rpb25Hcm91cElEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBIYXNoTWFwIHByb3ZpZGVyRXh0ZW5zaW9uczsKLQlwcml2YXRlIEhhc2hNYXAgZGVmaW5lc0V4dGVuc2lvbnM7Ci0JcHJpdmF0ZSBIYXNoTWFwIGltcGxlbWVudHNFeHRlbnNpb25zOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyKCkgewotCQlzdXBlcihXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT04pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoUFJPVklERVJfRUxFTUVOVCkpIHsKLQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9JRCk7Ci0JCQlpZiAobnVsbCA9PSBpZCB8fCBpZC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIFBST1ZJREVSX0VMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9JRCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9DTEFTUyk7Ci0JCQlpZiAobnVsbCA9PSBjbGFzc05hbWUgfHwgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgUFJPVklERVJfRUxFTUVOVCArICIgaXMgbWlzc2luZyAiICsgQVRUUklCVVRFX0NMQVNTKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlhZGRQcm92aWRlckV4dGVuc2lvbihpZCwgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKERFRklORVNfVFlQRV9FTEVNRU5UKSkgewotCQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfUFJPVklERVJfVFlQRSk7Ci0JCQlpZiAobnVsbCA9PSB0eXBlIHx8IHR5cGUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBERUZJTkVTX1RZUEVfRUxFTUVOVCArICIgaXMgbWlzc2luZyAiICsgQVRUUklCVVRFX1BST1ZJREVSX1RZUEUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9QUk9WSURFUl9JRCk7Ci0JCQlpZiAobnVsbCA9PSBpZCB8fCBpZC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIERFRklORVNfVFlQRV9FTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfUFJPVklERVJfSUQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCWFkZERlZmluZXNFeHRlbnNpb24odHlwZSwgaWQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhJTVBMRU1FTlRTX1RZUEVfRUxFTUVOVCkpIHsKLQkJCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1BST1ZJREVSX1RZUEUpOwotCQkJaWYgKG51bGwgPT0gdHlwZSB8fCB0eXBlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgREVGSU5FU19UWVBFX0VMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9QUk9WSURFUl9UWVBFKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfUFJPVklERVJfSUQpOwotCQkJaWYgKG51bGwgPT0gaWQgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBERUZJTkVTX1RZUEVfRUxFTUVOVCArICIgaXMgbWlzc2luZyAiICsgQVRUUklCVVRFX1BST1ZJREVSX0lEKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlhZGRJbXBsZW1lbnRzRXh0ZW5zaW9uKHR5cGUsIGlkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUHJvdmlkZXJFeHRlbnNpb24oU3RyaW5nIGlkLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAocHJvdmlkZXJFeHRlbnNpb25zLmNvbnRhaW5zS2V5KGlkKSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEdXBsaWNhdGUgIiArIFBST1ZJREVSX0VMRU1FTlQgKyAiICIgKyBBVFRSSUJVVEVfSUQgKyAiICIgKyBpZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXByb3ZpZGVyRXh0ZW5zaW9ucy5wdXQoaWQsIGVsZW1lbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREZWZpbmVzRXh0ZW5zaW9uKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpIHsKLQkJaWYgKGRlZmluZXNFeHRlbnNpb25zLmNvbnRhaW5zS2V5KHR5cGUpKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkR1cGxpY2F0ZSAiICsgUFJPVklERVJfRUxFTUVOVCArICIgIiArIEFUVFJJQlVURV9QUk9WSURFUl9UWVBFICsgIiAiICsgdHlwZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWRlZmluZXNFeHRlbnNpb25zLnB1dCh0eXBlLCBpZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEltcGxlbWVudHNFeHRlbnNpb24oU3RyaW5nIHR5cGUsIFN0cmluZyBpZCkgewotCQlMaXN0IGNhY2hlOwotCQlpZiAoaW1wbGVtZW50c0V4dGVuc2lvbnMuY29udGFpbnNLZXkodHlwZSkpCi0JCQljYWNoZSA9IChMaXN0KSBpbXBsZW1lbnRzRXh0ZW5zaW9ucy5nZXQodHlwZSk7Ci0JCWVsc2UKLQkJCWNhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQljYWNoZS5hZGQoaWQpOwotCQlpbXBsZW1lbnRzRXh0ZW5zaW9ucy5wdXQodHlwZSwgY2FjaGUpOwotCX0KLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0UHJvdmlkZXJFeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCXJlYWRSZWdpc3RyeUlmTmVjZXNzYXJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgcHJvdmlkZXJFeHRlbnNpb25zLmdldChpZCk7Ci0JCWlmIChudWxsID09IGVsZW1lbnQpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2cobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBQUk9WSURFUl9FTEVNRU5UICsgIiBub3QgZm91bmQgZm9yICIgKyBBVFRSSUJVVEVfSUQgKyAiOiAiICsgaWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmaW5lc0V4dGVuc2lvbihTdHJpbmcgcHJvdmlkZXJUeXBlKSB7Ci0JCXJlYWRSZWdpc3RyeUlmTmVjZXNzYXJ5KCk7Ci0JCVN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgZGVmaW5lc0V4dGVuc2lvbnMuZ2V0KHByb3ZpZGVyVHlwZSk7Ci0JCWlmIChudWxsID09IGVsZW1lbnQpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2cobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBERUZJTkVTX1RZUEVfRUxFTUVOVCArICIgbm90IGZvdW5kIGZvciAiICsgQVRUUklCVVRFX1BST1ZJREVSX1RZUEUgKyAiOiAiICsgcHJvdmlkZXJUeXBlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UHJvdmlkZXJEZXNjcmlwdG9yc0ZvclByb3ZpZGVyS2luZChTdHJpbmcgcHJvdmlkZXJUeXBlKSB7Ci0JCXJlYWRSZWdpc3RyeUlmTmVjZXNzYXJ5KCk7Ci0JCUxpc3QgcHJvdmlkZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcm92aWRlckxpc3QuYWRkKGdldERlZmluZXNFeHRlbnNpb24ocHJvdmlkZXJUeXBlKSk7Ci0JCWlmIChpbXBsZW1lbnRzRXh0ZW5zaW9ucy5jb250YWluc0tleShwcm92aWRlclR5cGUpKSB7Ci0JCQlMaXN0IGltcGxlbWVudHNJZHMgPSAoTGlzdCkgaW1wbGVtZW50c0V4dGVuc2lvbnMuZ2V0KHByb3ZpZGVyVHlwZSk7Ci0JCQlpZiAoaW1wbGVtZW50c0lkcyAhPSBudWxsICYmICFpbXBsZW1lbnRzSWRzLmlzRW1wdHkoKSkgewotCQkJCXByb3ZpZGVyTGlzdC5hZGRBbGwoaW1wbGVtZW50c0lkcyk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gcHJvdmlkZXJBcnJheSA9IG5ldyBTdHJpbmdbcHJvdmlkZXJMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJBcnJheS5sZW5ndGg7IGkrKykgewotCQkJcHJvdmlkZXJBcnJheVtpXSA9IChTdHJpbmcpIHByb3ZpZGVyTGlzdC5nZXQoaSk7Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyQXJyYXk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeUlmTmVjZXNzYXJ5KCkgewotCQlpZiAoIWhhc0luaXRpYWxpemVkKSB7Ci0JCQlwcm92aWRlckV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJZGVmaW5lc0V4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJaW1wbGVtZW50c0V4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JCQloYXNJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbFByb3ZpZGVyIGdldFByb3ZpZGVyKFN0cmluZyBpZCkgewotCQlJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGdldFByb3ZpZGVyRXh0ZW5zaW9uKGlkKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcHJvdmlkZXIgPSAoSURhdGFNb2RlbFByb3ZpZGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUklCVVRFX0NMQVNTKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0ZGMzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUmVzb3VyY2VIYW5kbGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRGF0YU1vZGVsSW1wbCBpbXBsZW1lbnRzIElEYXRhTW9kZWwsIElEYXRhTW9kZWxMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTk9UX0xPQ0FURURfID0gV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjAiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVNURURfTU9ERUxfTk9UX0xPQ0FURUQgPSBXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyMSIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBOT19ERVNDUklQVE9SUyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF07Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gYmFzZVByb3BlcnR5TmFtZXM7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGFsbFByb3BlcnR5TmFtZXM7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIG5lc3RlZFByb3BlcnR5TmFtZXM7IC8vIGxhemlseSBpbml0aWFsemVkIHdoZW4gbmVzdGVkIG1vZGVscyBhZGRlZAotCXByaXZhdGUgTWFwIHByb3BlcnR5VmFsdWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgTWFwIG5lc3RlZE1vZGVsczsKLQlwcml2YXRlIFNldCBuZXN0aW5nTW9kZWxzOwotCXByaXZhdGUgTGlzdCBsaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIElEYXRhTW9kZWxQcm92aWRlciBwcm92aWRlcjsKLQotCXB1YmxpYyBEYXRhTW9kZWxJbXBsKElEYXRhTW9kZWxQcm92aWRlciBkYXRhTW9kZWxQcm92aWRlcikgewotCQlpbml0KGRhdGFNb2RlbFByb3ZpZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdChJRGF0YU1vZGVsUHJvdmlkZXIgZGF0YU1vZGVsUHJvdmlkZXIpIHsKLQkJdGhpcy5wcm92aWRlciA9IGRhdGFNb2RlbFByb3ZpZGVyOwotCQlkYXRhTW9kZWxQcm92aWRlci5zZXREYXRhTW9kZWwodGhpcyk7Ci0JCUNvbGxlY3Rpb24gcHJvcGVydHlOYW1lcyA9IGRhdGFNb2RlbFByb3ZpZGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJSGFzaFNldCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJcHJvcGVydGllcy5hZGRBbGwocHJvcGVydHlOYW1lcyk7Ci0KLQkJcHJvcGVydGllcy5hZGQoSURhdGFNb2RlbFByb3BlcnRpZXMuQUxMT1dfRVhURU5TSU9OUyk7Ci0JCXByb3BlcnRpZXMuYWRkKElEYXRhTW9kZWxQcm9wZXJ0aWVzLlJFU1RSSUNUX0VYVEVOU0lPTlMpOwotCQliYXNlUHJvcGVydHlOYW1lcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24ocHJvcGVydGllcyk7Ci0JCWFsbFByb3BlcnR5TmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQlhbGxQcm9wZXJ0eU5hbWVzLmFkZEFsbChiYXNlUHJvcGVydHlOYW1lcyk7Ci0JCWRhdGFNb2RlbFByb3ZpZGVyLmluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Jhc2VQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBiYXNlUHJvcGVydHlOYW1lcy5jb250YWlucyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEJhc2VQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihiYXNlUHJvcGVydHlOYW1lcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBhbGxQcm9wZXJ0eU5hbWVzLmNvbnRhaW5zKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWxsUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oYWxsUHJvcGVydHlOYW1lcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsICE9IG5lc3RlZFByb3BlcnR5TmFtZXMgJiYgbmVzdGVkUHJvcGVydHlOYW1lcy5jb250YWlucyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RlZFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG5lc3RlZFByb3BlcnR5TmFtZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1ZhbGlkUHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKCFpc1Byb3BlcnR5KHByb3BlcnR5TmFtZSkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFBST1BFUlRZX05PVF9MT0NBVEVEXyArIHByb3BlcnR5TmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIERhdGFNb2RlbEltcGwgZ2V0T3duaW5nRGF0YU1vZGVsKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJY2hlY2tWYWxpZFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gc2VhcmNoTmVzdGVkTW9kZWxzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBEYXRhTW9kZWxJbXBsIHNlYXJjaE5lc3RlZE1vZGVscyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChpc0Jhc2VQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfSBlbHNlIGlmIChuZXN0ZWRNb2RlbHMgIT0gbnVsbCkgewotCQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBudWxsOwotCQkJT2JqZWN0W10ga2V5cyA9IG5lc3RlZE1vZGVscy5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCQlkYXRhTW9kZWwgPSAoRGF0YU1vZGVsSW1wbCkgbmVzdGVkTW9kZWxzLmdldChrZXlzW2ldKTsKLQkJCQlpZiAoZGF0YU1vZGVsLmlzUHJvcGVydHkocHJvcGVydHlOYW1lKSkgewotCQkJCQlyZXR1cm4gZGF0YU1vZGVsLnNlYXJjaE5lc3RlZE1vZGVscyhwcm9wZXJ0eU5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihQUk9QRVJUWV9OT1RfTE9DQVRFRF8gKyBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlpZiAoZGF0YU1vZGVsLnByb3BlcnR5VmFsdWVzLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBkYXRhTW9kZWwucHJvcGVydHlWYWx1ZXMuZ2V0KHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGRhdGFNb2RlbC5wcm92aWRlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gZ2V0T3duaW5nRGF0YU1vZGVsKHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBkYXRhTW9kZWwucHJvdmlkZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCU9iamVjdCBwcm9wID0gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKHByb3AgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuICgoSW50ZWdlcikgcHJvcCkuaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlPYmplY3QgcHJvcCA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChwcm9wID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIHByb3ApLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlPYmplY3QgcHJvcCA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChwcm9wID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIChTdHJpbmcpIHByb3A7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gZ2V0T3duaW5nRGF0YU1vZGVsKHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBkYXRhTW9kZWwucHJvcGVydHlWYWx1ZXMuY29udGFpbnNLZXkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gZ2V0T3duaW5nRGF0YU1vZGVsKHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBkYXRhTW9kZWwucHJvdmlkZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gZ2V0T3duaW5nRGF0YU1vZGVsKHByb3BlcnR5TmFtZSk7Ci0JCWRhdGFNb2RlbC5pbnRlcm5hbFNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsU2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJT2JqZWN0IG9sZFZhbHVlID0gcHJvcGVydHlWYWx1ZXMuZ2V0KHByb3BlcnR5TmFtZSk7Ci0JCWlmICh2YWx1ZUNoYW5nZWQocHJvcGVydHlWYWx1ZSwgb2xkVmFsdWUpKSB7Ci0JCQlpZiAobnVsbCAhPSBwcm9wZXJ0eVZhbHVlKQotCQkJCXByb3BlcnR5VmFsdWVzLnB1dChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQkJZWxzZSBpZiAocHJvcGVydHlWYWx1ZXMuY29udGFpbnNLZXkocHJvcGVydHlOYW1lKSkKLQkJCQlwcm9wZXJ0eVZhbHVlcy5yZW1vdmUocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcm92aWRlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpKSB7Ci0JCQkJbm90aWZ5UHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHZhbHVlQ2hhbmdlZChPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlyZXR1cm4gbzEgIT0gbzIgJiYgKChvMSAhPSBudWxsICYmICFvMS5lcXVhbHMobzIpKSB8fCAhbzIuZXF1YWxzKG8xKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW50UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IHZhbHVlKSB7Ci0JCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbmV3IEludGVnZXIodmFsdWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsICh2YWx1ZSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkTmVzdGVkTW9kZWwoU3RyaW5nIG1vZGVsTmFtZSwgSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKHRoaXMgPT0gZGF0YU1vZGVsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG51bGwgPT0gbmVzdGVkTW9kZWxzKSB7Ci0JCQluZXN0ZWRNb2RlbHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQluZXN0ZWRQcm9wZXJ0eU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCQlEYXRhTW9kZWxJbXBsIG5lc3RlZERhdGFNb2RlbCA9IChEYXRhTW9kZWxJbXBsKSBkYXRhTW9kZWw7Ci0JCWlmIChudWxsID09IG5lc3RlZERhdGFNb2RlbC5uZXN0aW5nTW9kZWxzKSB7Ci0JCQluZXN0ZWREYXRhTW9kZWwubmVzdGluZ01vZGVscyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJaWYgKG5lc3RlZERhdGFNb2RlbC5uZXN0aW5nTW9kZWxzLmNvbnRhaW5zKHRoaXMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJbmVzdGVkRGF0YU1vZGVsLm5lc3RpbmdNb2RlbHMuYWRkKHRoaXMpOwotCi0JCW5lc3RlZE1vZGVscy5wdXQobW9kZWxOYW1lLCBuZXN0ZWREYXRhTW9kZWwpOwotCi0JCWFkZE5lc3RlZFByb3BlcnRpZXMobmVzdGVkRGF0YU1vZGVsLmFsbFByb3BlcnR5TmFtZXMpOwotCQluZXN0ZWREYXRhTW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROZXN0ZWRQcm9wZXJ0aWVzKENvbGxlY3Rpb24gbmVzdGVkUHJvcGVydGllcykgewotCQlib29sZWFuIHByb3BlcnRpZXNBZGRlZCA9IGFsbFByb3BlcnR5TmFtZXMuYWRkQWxsKG5lc3RlZFByb3BlcnRpZXMpOwotCQlwcm9wZXJ0aWVzQWRkZWQgPSBuZXN0ZWRQcm9wZXJ0eU5hbWVzLmFkZEFsbChuZXN0ZWRQcm9wZXJ0aWVzKSB8fCBwcm9wZXJ0aWVzQWRkZWQ7Ci0JCS8vIFBhc3MgdGhlIG5ldyBwcm9wZXJ0aWVzIHVwIHRoZSBuZXN0aW5nIGNoYWluCi0JCWlmIChwcm9wZXJ0aWVzQWRkZWQgJiYgbmVzdGluZ01vZGVscyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG5lc3RpbmdNb2RlbHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkoKERhdGFNb2RlbEltcGwpIGl0ZXJhdG9yLm5leHQoKSkuYWRkTmVzdGVkUHJvcGVydGllcyhuZXN0ZWRQcm9wZXJ0aWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RlZE1vZGVscygpIHsKLQkJcmV0dXJuIG5lc3RlZE1vZGVscyAhPSBudWxsID8gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihuZXN0ZWRNb2RlbHMudmFsdWVzKCkpIDogQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RlZE1vZGVsTmFtZXMoKSB7Ci0JCXJldHVybiBuZXN0ZWRNb2RlbHMgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obmVzdGVkTW9kZWxzLmtleVNldCgpKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0aW5nTW9kZWxzKCkgewotCQlyZXR1cm4gbmVzdGluZ01vZGVscyAhPSBudWxsID8gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihuZXN0aW5nTW9kZWxzKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbCByZW1vdmVOZXN0ZWRNb2RlbChTdHJpbmcgbW9kZWxOYW1lKSB7Ci0JCWlmICghaXNOZXN0ZWRNb2RlbChtb2RlbE5hbWUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlEYXRhTW9kZWxJbXBsIG1vZGVsID0gKERhdGFNb2RlbEltcGwpIG5lc3RlZE1vZGVscy5yZW1vdmUobW9kZWxOYW1lKTsKLQkJbW9kZWwubmVzdGluZ01vZGVscy5yZW1vdmUodGhpcyk7Ci0JCXJlbW92ZU5lc3RlZFByb3BlcnRpZXMobW9kZWwuYWxsUHJvcGVydHlOYW1lcyk7Ci0JCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQlpZiAobmVzdGVkTW9kZWxzLmlzRW1wdHkoKSkgewotCQkJbmVzdGVkTW9kZWxzID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5lc3RlZFByb3BlcnRpZXMoQ29sbGVjdGlvbiBuZXN0ZWRQcm9wZXJ0aWVzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmVzdGVkUHJvcGVydGllcy5pdGVyYXRvcigpOwotCQlTdHJpbmcgcHJvcGVydHkgPSBudWxsOwotCQlib29sZWFuIGtlZXBQcm9wZXJ0eSA9IGZhbHNlOwotCQlTZXQgbmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJa2VlcFByb3BlcnR5ID0gZmFsc2U7Ci0JCQlwcm9wZXJ0eSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChiYXNlUHJvcGVydHlOYW1lcy5jb250YWlucyhwcm9wZXJ0eSkpIHsKLQkJCQlrZWVwUHJvcGVydHkgPSB0cnVlOwotCQkJfQotCQkJaWYgKCFrZWVwUHJvcGVydHkgJiYgbmVzdGVkTW9kZWxzICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBuZXN0ZWRNb2RlbHNJdGVyYXRvciA9IG5lc3RlZE1vZGVscy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlICgha2VlcFByb3BlcnR5ICYmIG5lc3RlZE1vZGVsc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlEYXRhTW9kZWxJbXBsIG5lc3RlZE1vZGVsID0gKERhdGFNb2RlbEltcGwpIG5lc3RlZE1vZGVsc0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKG5lc3RlZE1vZGVsLmlzUHJvcGVydHkocHJvcGVydHkpKSB7Ci0JCQkJCQlrZWVwUHJvcGVydHkgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFrZWVwUHJvcGVydHkpIHsKLQkJCQlpZiAobnVsbCA9PSBuZXN0ZWRQcm9wZXJ0aWVzVG9SZW1vdmUpIHsKLQkJCQkJbmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQoKTsKLQkJCQl9Ci0JCQkJbmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlLmFkZChwcm9wZXJ0eSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobnVsbCAhPSBuZXN0ZWRQcm9wZXJ0aWVzVG9SZW1vdmUpIHsKLQkJCWFsbFByb3BlcnR5TmFtZXMucmVtb3ZlQWxsKG5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZSk7Ci0JCQluZXN0ZWRQcm9wZXJ0eU5hbWVzLnJlbW92ZUFsbChuZXN0ZWRQcm9wZXJ0aWVzVG9SZW1vdmUpOwotCQkJaWYgKG5lc3RpbmdNb2RlbHMgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIG5lc3RpbmdNb2RlbHNJdGVyYXRvciA9IG5lc3RpbmdNb2RlbHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAobmVzdGluZ01vZGVsc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkoKERhdGFNb2RlbEltcGwpIG5lc3RpbmdNb2RlbHNJdGVyYXRvci5uZXh0KCkpLnJlbW92ZU5lc3RlZFByb3BlcnRpZXMobmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05lc3RlZE1vZGVsKFN0cmluZyBtb2RlbE5hbWUpIHsKLQkJcmV0dXJuIG1vZGVsTmFtZSAhPSBudWxsICYmIG51bGwgIT0gbmVzdGVkTW9kZWxzICYmIG5lc3RlZE1vZGVscy5jb250YWluc0tleShtb2RlbE5hbWUpOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsIGdldE5lc3RlZE1vZGVsKFN0cmluZyBtb2RlbE5hbWUpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAobnVsbCAhPSBuZXN0ZWRNb2RlbHMgJiYgbnVsbCAhPSBtb2RlbE5hbWUpID8gKElEYXRhTW9kZWwpIG5lc3RlZE1vZGVscy5nZXQobW9kZWxOYW1lKSA6IG51bGw7Ci0JCWlmIChudWxsID09IGRhdGFNb2RlbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTkVTVEVEX01PREVMX05PVF9MT0NBVEVEICsgbW9kZWxOYW1lKTsKLQkJfQotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGRhdGFNb2RlbC5wcm92aWRlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JzID09IG51bGwgPyBOT19ERVNDUklQVE9SUyA6IGRlc2NyaXB0b3JzOwotCX0KLQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBnZXRPd25pbmdEYXRhTW9kZWwocHJvcGVydHlOYW1lKTsKLQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBkYXRhTW9kZWwucHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yID09IG51bGwgPyBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpIDogZGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZykgewotCQlpZiAoZmxhZyA9PSBERUZBVUxUX0NIRykgewotCQkJaWYgKGlzUHJvcGVydHlTZXQocHJvcGVydHlOYW1lKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZsYWcgPSBWQUxVRV9DSEc7Ci0JCX0KLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBEYXRhTW9kZWxFdmVudCh0aGlzLCBwcm9wZXJ0eU5hbWUsIGZsYWcpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCAmJiAhbGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJSURhdGFNb2RlbExpc3RlbmVyIGxpc3RlbmVyOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlsaXN0ZW5lciA9IChJRGF0YU1vZGVsTGlzdGVuZXIpIGxpc3RlbmVycy5nZXQoaSk7Ci0JCQkJaWYgKGxpc3RlbmVyICE9IGV2ZW50LmdldERhdGFNb2RlbCgpKSB7Ci0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCW5vdGlmeUxpc3RlbmVycyhldmVudCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0JCXJldHVybiB2YWxpZGF0ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShib29sZWFuIHN0b3BPbkZpcnN0RmFpbHVyZSkgewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCUlTdGF0dXMgcHJvcFN0YXR1czsKLQkJU3RyaW5nIHByb3BOYW1lOwotCQlJdGVyYXRvciBpdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCWl0ID0gYmFzZVByb3BlcnR5TmFtZXMuaXRlcmF0b3IoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaXQgPSBnZXROZXN0ZWRNb2RlbE5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlwcm9wTmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlwcm9wU3RhdHVzID0gcHJvdmlkZXIudmFsaWRhdGUocHJvcE5hbWUpOwotCQkJCWlmIChwcm9wU3RhdHVzICE9IG51bGwpIHsKLQkJCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5pc09LKCkpCi0JCQkJCQlzdGF0dXMgPSBwcm9wU3RhdHVzOwotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKQotCQkJCQkJCSgoTXVsdGlTdGF0dXMpIHN0YXR1cykubWVyZ2UocHJvcFN0YXR1cyk7Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cygib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsIiwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQltdWx0aS5tZXJnZShzdGF0dXMpOwotCQkJCQkJCW11bHRpLm1lcmdlKHByb3BTdGF0dXMpOwotCQkJCQkJCXN0YXR1cyA9IG11bHRpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzdG9wT25GaXJzdEZhaWx1cmUgJiYgc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuIElEYXRhTW9kZWxQcm92aWRlci5PS19TVEFUVVM7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLQkJCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQl9IGVsc2UgaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCAmJiBsaXN0ZW5lciAhPSBudWxsKQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGRvZXNuJ3QgaGF2ZSBhbnkgZXJyb3JzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiB2YWxpZGF0ZSh0cnVlKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVZhbGlkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUHJvcGVydHkocHJvcGVydHlOYW1lKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gZ2V0T3duaW5nRGF0YU1vZGVsKHByb3BlcnR5TmFtZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gZGF0YU1vZGVsLnByb3ZpZGVyLnZhbGlkYXRlKHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBzdGF0dXMgPT0gbnVsbCA/IElEYXRhTW9kZWxQcm92aWRlci5PS19TVEFUVVMgOiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRDb250ZXh0KCkgewotCQlMaXN0IGV4dGVuZGVkQ29udGV4dCA9IHByb3ZpZGVyLmdldEV4dGVuZGVkQ29udGV4dCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRDb250ZXh0ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogZXh0ZW5kZWRDb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRSYXdPcGVyYXRpb24oKSB7Ci0JCUlEYXRhTW9kZWxPcGVyYXRpb24gcHJvdmlkZXJPcCA9IHByb3ZpZGVyLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJaWYgKG51bGwgPT0gcHJvdmlkZXJPcCkgewotCQkJcHJvdmlkZXJPcCA9IG5ldyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbih0aGlzKSB7Ci0JCQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCXJldHVybiBPS19TVEFUVVM7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gcHJvdmlkZXJPcDsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbChnZXRSYXdPcGVyYXRpb24oKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJJRGF0YU1vZGVsLCBwcm92aWRlcj0iICsgcHJvdmlkZXIudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCVN0cmluZyBpZCA9IHByb3ZpZGVyLmdldElEKCk7Ci0JCXJldHVybiBudWxsICE9IGlkID8gaWQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGM4YWQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgaW1wbGVtZW50cyBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudCB7Ci0KLQlwcml2YXRlIElEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uOwotCXByaXZhdGUgaW50IG9wZXJhdGlvblR5cGU7Ci0JcHJpdmF0ZSBpbnQgZXhlY3V0aW9uVHlwZTsKLQotCXB1YmxpYyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbiwgaW50IG9wZXJhdGlvblR5cGUsIGludCBleGVjdXRpb25UeXBlKSB7Ci0JCXRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotCQl0aGlzLm9wZXJhdGlvblR5cGUgPSBvcGVyYXRpb25UeXBlOwotCQl0aGlzLmV4ZWN1dGlvblR5cGUgPSBleGVjdXRpb25UeXBlOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG9wZXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9wZXJhdGlvblR5cGUoKSB7Ci0JCXJldHVybiBvcGVyYXRpb25UeXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXhlY3V0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGV4ZWN1dGlvblR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiYzRiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWRhcHRhYmlsaXR5VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5Db21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLk9wZXJhdGlvblN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbCBleHRlbmRzIFdyYXBwZWRPcGVyYXRpb24gaW1wbGVtZW50cyBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gewotCi0JLy8gU3RhY2sgb2YgU3RhY2tFbnRyaWVzIHRvIGJlIGV4ZWN1dGVkCi0JcHJvdGVjdGVkIFN0YWNrIG9wZXJhdGlvblN0YWNrVG9FeGVjdXRlID0gbnVsbDsKLQotCS8vIFN0YWNrIG9mIFN0YWNrRW50cmllcyBhbHJlYWR5IGV4ZWN1dGVkCi0JcHJvdGVjdGVkIFN0YWNrIHVuZG9TdGFjayA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0YWNrIHJlZG9TdGFjayA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgT3BlcmF0aW9uU3RhY2tFbnRyeSByb290U3RhY2tFbnRyeSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBvcGVyYXRpb25MaXN0ZW5lcnM7Ci0KLQlwcm90ZWN0ZWQgaW50IGV4ZWN1dGlvblN0YXRlID0gTk9UX1NUQVJURUQ7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsKElEYXRhTW9kZWxPcGVyYXRpb24gcm9vdE9wZXJhdGlvbikgewotCQlzdXBlcihyb290T3BlcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb25MaXN0ZW5lcihJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lciBvcGVyYXRpb25MaXN0ZW5lcikgewotCQlpZiAobnVsbCA9PSBvcGVyYXRpb25MaXN0ZW5lcnMpIHsKLQkJCW9wZXJhdGlvbkxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlvcGVyYXRpb25MaXN0ZW5lcnMuYWRkKG9wZXJhdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVPcGVyYXRpb25MaXN0ZW5lcihJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lciBvcGVyYXRpb25MaXN0ZW5lcikgewotCQlpZiAobnVsbCAhPSBvcGVyYXRpb25MaXN0ZW5lcnMpIHsKLQkJCW9wZXJhdGlvbkxpc3RlbmVycy5yZW1vdmUob3BlcmF0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRFeGVjdXRpb25TdGF0ZSgpIHsKLQkJcmV0dXJuIGV4ZWN1dGlvblN0YXRlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVYRUNVVEVfSU1QTCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVU5ET19JTVBMID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSRURPX0lNUEwgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJPTExCQUNLX0lNUEwgPSAzOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJFU1VNRV9JTVBMID0gNDsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSB0aHJlYWRUb0V4dGVuZGVkT3BDb250cm9sID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHJvdGVjdGVkIElTdGF0dXMgY2FjaGVUaHJlYWRBbmRDb250aW51ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbywgaW50IHJ1blR5cGUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlmaW5hbCBUaHJlYWQgY3VycmVudFRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JCWZpbmFsIGJvb2xlYW4gaXNUb3BMZXZlbE9wZXJhdGlvbiA9ICF0aHJlYWRUb0V4dGVuZGVkT3BDb250cm9sLmNvbnRhaW5zS2V5KGN1cnJlbnRUaHJlYWQpOwotCQl0cnkgewotCQkJaWYgKGlzVG9wTGV2ZWxPcGVyYXRpb24pIHsKLQkJCQl0aHJlYWRUb0V4dGVuZGVkT3BDb250cm9sLnB1dChjdXJyZW50VGhyZWFkLCB0aGlzKTsKLQkJCX0KLQkJCXN3aXRjaCAocnVuVHlwZSkgewotCQkJCWNhc2UgRVhFQ1VURV9JTVBMIDoKLQkJCQkJcmV0dXJuIGV4ZWN1dGVJbXBsKG1vbml0b3IsIGluZm8pOwotCQkJCWNhc2UgVU5ET19JTVBMIDoKLQkJCQkJcmV0dXJuIHVuZG9JbXBsKG1vbml0b3IsIGluZm8pOwotCQkJCWNhc2UgUkVET19JTVBMIDoKLQkJCQkJcmV0dXJuIHJlZG9JbXBsKG1vbml0b3IsIGluZm8pOwotCQkJCWNhc2UgUk9MTEJBQ0tfSU1QTCA6Ci0JCQkJCXJldHVybiByb2xsQmFja0ltcGwobW9uaXRvciwgaW5mbyk7Ci0JCQkJY2FzZSBSRVNVTUVfSU1QTCA6Ci0JCQkJCXJldHVybiByZXN1bWVJbXBsKG1vbml0b3IsIGluZm8pOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlzVG9wTGV2ZWxPcGVyYXRpb24pIHsKLQkJCQl0aHJlYWRUb0V4dGVuZGVkT3BDb250cm9sLnJlbW92ZShjdXJyZW50VGhyZWFkKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlc3VtZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjYWNoZVRocmVhZEFuZENvbnRpbnVlKG1vbml0b3IsIGluZm8sIFJFU1VNRV9JTVBMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyByZXN1bWVJbXBsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChleGVjdXRpb25TdGF0ZSkgewotCQkJY2FzZSBOT1RfU1RBUlRFRCA6Ci0JCQkJcmV0dXJuIGV4ZWN1dGVJbXBsKG1vbml0b3IsIGluZm8pOwotCQkJY2FzZSBQQVVTRURfRVhFQ1VURSA6Ci0JCQljYXNlIENPTVBMRVRFX1JPTExCQUNLIDoKLQkJCQlyZXR1cm4gZG9FeGVjdXRlKG1vbml0b3IsIGluZm8pOwotCQkJY2FzZSBQQVVTRURfVU5ETyA6Ci0JCQkJcmV0dXJuIGRvVW5kbyhtb25pdG9yLCBpbmZvKTsKLQkJCWNhc2UgUEFVU0VEX1JFRE8gOgotCQkJCXJldHVybiByZWRvSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJfQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJlZG8oKSB7Ci0JCXJldHVybiAoQ09NUExFVEVfVU5ETyA9PSBleGVjdXRpb25TdGF0ZSkgJiYgc3VwZXIuY2FuUmVkbygpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gY2FjaGVUaHJlYWRBbmRDb250aW51ZShtb25pdG9yLCBpbmZvLCBSRURPX0lNUEwpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJlZG9JbXBsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCXJldHVybiBkb1JlZG8obW9uaXRvciwgaW5mbyk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9SZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCXRyeSB7Ci0JCQlleGVjdXRpb25TdGF0ZSA9IFJVTk5JTkdfUkVETzsKLQkJCU9wZXJhdGlvblN0YXR1cyByZXR1cm5TdGF0dXMgPSBudWxsOwotCQkJaW50IHNob3VsZENvbnRpbnVlID0gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUU7Ci0JCQl3aGlsZSAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUUgPT0gc2hvdWxkQ29udGludWUgJiYgIXJlZG9TdGFjay5pc0VtcHR5KCkpIHsKLQkJCQlPcGVyYXRpb25TdGFja0VudHJ5IHN0YWNrRW50cnkgPSAoT3BlcmF0aW9uU3RhY2tFbnRyeSkgcmVkb1N0YWNrLnBlZWsoKTsKLQkJCQlJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHN0YWNrRW50cnkuZ2V0T3BlcmF0aW9uKCk7Ci0JCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwob3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX1NUQVJUSU5HLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5SRURPKTsKLQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0JCQkJaWYgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFID09IHNob3VsZENvbnRpbnVlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQl1bmRvU3RhY2sucHVzaChyZWRvU3RhY2sucG9wKCkpOwotCQkJCXJldHVyblN0YXR1cyA9IHJ1bk9wZXJhdGlvbihvcGVyYXRpb24sIG1vbml0b3IsIGluZm8sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlJFRE8sIHJldHVyblN0YXR1cyk7Ci0JCQkJZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwob3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX0ZJTklTSEVELCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5SRURPKTsKLQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0KLQkJCX0KLQkJCXJldHVybiByZXR1cm5TdGF0dXMgPT0gbnVsbCA/IFN0YXR1cy5PS19TVEFUVVMgOiByZXR1cm5TdGF0dXM7Ci0JCX0gZmluYWxseSB7Ci0JCQlleGVjdXRpb25TdGF0ZSA9IHJlZG9TdGFjay5pc0VtcHR5KCkgPyBDT01QTEVURV9SRURPIDogUEFVU0VEX1JFRE87Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gKGV4ZWN1dGlvblN0YXRlID09IENPTVBMRVRFX0VYRUNVVEUgfHwgZXhlY3V0aW9uU3RhdGUgPT0gQ09NUExFVEVfUkVETykgJiYgc3VwZXIuY2FuVW5kbygpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gY2FjaGVUaHJlYWRBbmRDb250aW51ZShtb25pdG9yLCBpbmZvLCBVTkRPX0lNUEwpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHVuZG9JbXBsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCXJlZG9TdGFjayA9IG5ldyBTdGFjaygpOwotCQlyZXR1cm4gZG9VbmRvKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgewotCQl0cnkgewotCQkJZXhlY3V0aW9uU3RhdGUgPSBSVU5OSU5HX1VORE87Ci0JCQlPcGVyYXRpb25TdGF0dXMgcmV0dXJuU3RhdHVzID0gbnVsbDsKLQkJCWludCBzaG91bGRDb250aW51ZSA9IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFOwotCQkJd2hpbGUgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFID09IHNob3VsZENvbnRpbnVlICYmICF1bmRvU3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBzdGFja0VudHJ5ID0gKE9wZXJhdGlvblN0YWNrRW50cnkpIHVuZG9TdGFjay5wZWVrKCk7Ci0JCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24gPSBzdGFja0VudHJ5LmdldE9wZXJhdGlvbigpOwotCQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKG9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9TVEFSVElORywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuVU5ETyk7Ci0JCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCWlmIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRSA9PSBzaG91bGRDb250aW51ZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVkb1N0YWNrLnB1c2godW5kb1N0YWNrLnBvcCgpKTsKLQkJCQlyZXR1cm5TdGF0dXMgPSBydW5PcGVyYXRpb24ob3BlcmF0aW9uLCBtb25pdG9yLCBpbmZvLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5VTkRPLCByZXR1cm5TdGF0dXMpOwotCQkJCWV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKG9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9GSU5JU0hFRCwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuVU5ETyk7Ci0JCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCi0JCQl9Ci0JCQlyZXR1cm4gcmV0dXJuU3RhdHVzID09IG51bGwgPyBTdGF0dXMuT0tfU1RBVFVTIDogcmV0dXJuU3RhdHVzOwotCQl9IGZpbmFsbHkgewotCQkJZXhlY3V0aW9uU3RhdGUgPSB1bmRvU3RhY2suaXNFbXB0eSgpID8gQ09NUExFVEVfVU5ETyA6IFBBVVNFRF9VTkRPOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjYWNoZVRocmVhZEFuZENvbnRpbnVlKG1vbml0b3IsIGluZm8sIEVYRUNVVEVfSU1QTCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgZXhlY3V0ZUltcGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJZXhlY3V0aW9uU3RhdGUgPSBSVU5OSU5HX0VYRUNVVEU7Ci0JCQl1bmRvU3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJCW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlID0gbmV3IFN0YWNrKCk7Ci0JCQlyb290U3RhY2tFbnRyeSA9IG5ldyBPcGVyYXRpb25TdGFja0VudHJ5KG51bGwsIHJvb3RPcGVyYXRpb24pOwotCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucHVzaChyb290U3RhY2tFbnRyeSk7Ci0JCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChyb290T3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5OT0RFX1NUQVJUSU5HLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCWlmIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRSA9PSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpKSB7Ci0JCQkJcmV0dXJuIGRvRXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGZpbmFsbHkgewotCQkJZXhlY3V0aW9uU3RhdGUgPSBvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5pc0VtcHR5KCkgPyBDT01QTEVURV9FWEVDVVRFIDogUEFVU0VEX0VYRUNVVEU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJT3BlcmF0aW9uU3RhdHVzIHJldHVyblN0YXR1cyA9IG51bGw7Ci0JCQlpbnQgc2hvdWxkQ29udGludWUgPSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRTsKLQkJCXdoaWxlIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRSA9PSBzaG91bGRDb250aW51ZSAmJiAhb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUuaXNFbXB0eSgpKSB7Ci0JCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBzdGFja0VudHJ5ID0gKE9wZXJhdGlvblN0YWNrRW50cnkpIG9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnBlZWsoKTsKLQkJCQlPcGVyYXRpb25TdGFja0VudHJ5IHByZVN0YWNrRW50cnkgPSBzdGFja0VudHJ5LmdldE5leHRQcmVPcGVyYXRpb24oKTsKLQkJCQlpZiAobnVsbCAhPSBwcmVTdGFja0VudHJ5KSB7Ci0JCQkJCW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnB1c2gocHJlU3RhY2tFbnRyeSk7Ci0JCQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKHByZVN0YWNrRW50cnkuZ2V0T3BlcmF0aW9uKCksIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk5PREVfU1RBUlRJTkcsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUpOwotCQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlJRGF0YU1vZGVsT3BlcmF0aW9uIHN0YWNrRW50cnlPcGVyYXRpb24gPSBzdGFja0VudHJ5LmdldE9wZXJhdGlvbkZvckV4ZWN1dGlvbigpOwotCQkJCWlmIChudWxsICE9IHN0YWNrRW50cnlPcGVyYXRpb24pIHsKLQkJCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwoc3RhY2tFbnRyeU9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9TVEFSVElORywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSk7Ci0JCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQkJaWYgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFID09IHNob3VsZENvbnRpbnVlKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlyZXR1cm5TdGF0dXMgPSBydW5PcGVyYXRpb24oc3RhY2tFbnRyeU9wZXJhdGlvbiwgbW9uaXRvciwgaW5mbywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSwgcmV0dXJuU3RhdHVzKTsKLQkJCQkJdW5kb1N0YWNrLnB1c2goc3RhY2tFbnRyeSk7Ci0JCQkJCWV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKHN0YWNrRW50cnlPcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fRklOSVNIRUQsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUpOwotCQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0JCQkJCWlmIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRSA9PSBzaG91bGRDb250aW51ZSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBwb3N0U3RhY2tFbnRyeSA9IHN0YWNrRW50cnkuZ2V0TmV4dFBvc3RPcGVyYXRpb24oKTsKLQkJCQlpZiAobnVsbCAhPSBwb3N0U3RhY2tFbnRyeSkgewotCQkJCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wdXNoKHBvc3RTdGFja0VudHJ5KTsKLQkJCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwocG9zdFN0YWNrRW50cnkuZ2V0T3BlcmF0aW9uKCksIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk5PREVfU1RBUlRJTkcsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUpOwotCQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wb3AoKTsKLQkJCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChzdGFja0VudHJ5LmdldE9wZXJhdGlvbigpLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5OT0RFX0ZJTklTSEVELCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0dXJuU3RhdHVzID09IG51bGwgPyBTdGF0dXMuT0tfU1RBVFVTIDogcmV0dXJuU3RhdHVzOwotCQl9IGZpbmFsbHkgewotCQkJZXhlY3V0aW9uU3RhdGUgPSBvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5pc0VtcHR5KCkgPyBDT01QTEVURV9FWEVDVVRFIDogUEFVU0VEX0VYRUNVVEU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByb2xsQmFjayhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjYWNoZVRocmVhZEFuZENvbnRpbnVlKG1vbml0b3IsIGluZm8sIFJPTExCQUNLX0lNUEwpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJvbGxCYWNrSW1wbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChQQVVTRURfRVhFQ1VURSA9PSBleGVjdXRpb25TdGF0ZSB8fCBQQVVTRURfUk9MTEJBQ0sgPT0gZXhlY3V0aW9uU3RhdGUpIHsKLQkJCXRyeSB7Ci0JCQkJZXhlY3V0aW9uU3RhdGUgPSBSVU5OSU5HX1JPTExCQUNLOwotCQkJCU9wZXJhdGlvblN0YXR1cyByZXR1cm5TdGF0dXMgPSBudWxsOwotCQkJCWludCBzaG91bGRDb250aW51ZSA9IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFOwotCQkJCXdoaWxlIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRSA9PSBzaG91bGRDb250aW51ZSAmJiAhdW5kb1N0YWNrLmlzRW1wdHkoKSkgewotCQkJCQlPcGVyYXRpb25TdGFja0VudHJ5IHN0YWNrRW50cnkgPSAoT3BlcmF0aW9uU3RhY2tFbnRyeSkgdW5kb1N0YWNrLnBlZWsoKTsKLQkJCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24gPSBzdGFja0VudHJ5LmdldE9wZXJhdGlvbigpOwotCQkJCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChvcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fU1RBUlRJTkcsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlJPTExCQUNLKTsKLQkJCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCQlpZiAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuUEFVU0UgPT0gc2hvdWxkQ29udGludWUpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXVuZG9TdGFjay5wb3AoKTsKLQkJCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBleGVjdXRpb25Ub3BTdGFja0VudHJ5ID0gc3RhY2tFbnRyeS5yb2xsQmFja09uZU9wZXJhdGlvbigpOwotCQkJCQlpZiAob3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUuY29udGFpbnMoZXhlY3V0aW9uVG9wU3RhY2tFbnRyeSkpIHsKLQkJCQkJCXdoaWxlIChvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wZWVrKCkgIT0gZXhlY3V0aW9uVG9wU3RhY2tFbnRyeSkgewotCQkJCQkJCW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnBvcCgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RhY2sgcGFyZW50U3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJCQkJCXBhcmVudFN0YWNrLnB1c2goZXhlY3V0aW9uVG9wU3RhY2tFbnRyeSk7Ci0JCQkJCQlPcGVyYXRpb25TdGFja0VudHJ5IGVudHJ5ID0gZXhlY3V0aW9uVG9wU3RhY2tFbnRyeS5wYXJlbnQ7Ci0JCQkJCQl3aGlsZSAoIW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLmNvbnRhaW5zKGVudHJ5KSkgewotCQkJCQkJCXBhcmVudFN0YWNrLnB1c2goZW50cnkpOwotCQkJCQkJCWVudHJ5ID0gZW50cnkucGFyZW50OwotCQkJCQkJfQotCQkJCQkJd2hpbGUgKG9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnBlZWsoKSAhPSBlbnRyeSkgewotCQkJCQkJCW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnBvcCgpOwotCQkJCQkJfQotCQkJCQkJd2hpbGUgKCFwYXJlbnRTdGFjay5pc0VtcHR5KCkpIHsKLQkJCQkJCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wdXNoKHBhcmVudFN0YWNrLnBvcCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm5TdGF0dXMgPSBydW5PcGVyYXRpb24ob3BlcmF0aW9uLCBtb25pdG9yLCBpbmZvLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5VTkRPLCByZXR1cm5TdGF0dXMpOwotCQkJCQlldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChvcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fRklOSVNIRUQsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlJPTExCQUNLKTsKLQkJCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0dXJuU3RhdHVzID09IG51bGwgPyBTdGF0dXMuT0tfU1RBVFVTIDogcmV0dXJuU3RhdHVzOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlleGVjdXRpb25TdGF0ZSA9IHVuZG9TdGFjay5pc0VtcHR5KCkgPyBDT01QTEVURV9ST0xMQkFDSyA6IFBBVVNFRF9ST0xMQkFDSzsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgaW50IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCkgewotCQlpZiAobnVsbCAhPSBvcGVyYXRpb25MaXN0ZW5lcnMpIHsKLQkJCUlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmF0aW9uTGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJbGlzdGVuZXIgPSAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIpIG9wZXJhdGlvbkxpc3RlbmVycy5nZXQoaSk7Ci0JCQkJaWYgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFID09IGxpc3RlbmVyLm5vdGlmeShldmVudCkpIHsKLQkJCQkJcmV0dXJuIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUU7Ci0JfQotCi0JcHJvdGVjdGVkIE9wZXJhdGlvblN0YXR1cyBhZGRTdGF0dXMoT3BlcmF0aW9uU3RhdHVzIHJldHVyblN0YXR1cywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHJldHVyblN0YXR1cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm5TdGF0dXMgPSBuZXcgT3BlcmF0aW9uU3RhdHVzKHN0YXR1cy5nZXRNZXNzYWdlKCksIHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm5TdGF0dXMuc2V0U2V2ZXJpdHkoc3RhdHVzLmdldFNldmVyaXR5KCkpOwotCQkJcmV0dXJuU3RhdHVzLmFkZChzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuU3RhdHVzLmFkZChzdGF0dXMpOwotCQl9Ci0JCXJldHVybiByZXR1cm5TdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBPcGVyYXRpb25TdGF0dXMgYWRkRXh0ZW5kZWRTdGF0dXMoT3BlcmF0aW9uU3RhdHVzIHJldHVyblN0YXR1cywgSVN0YXR1cyBhU3RhdHVzKSB7Ci0JCWlmIChyZXR1cm5TdGF0dXMgPT0gbnVsbCkgewotCQkJcmV0dXJuU3RhdHVzID0gbmV3IE9wZXJhdGlvblN0YXR1cyhuZXcgSVN0YXR1c1tde1dUUENvbW1vblBsdWdpbi5PS19TVEFUVVN9KTsKLQkJfQotCQlyZXR1cm5TdGF0dXMuYWRkRXh0ZW5kZWRTdGF0dXMoYVN0YXR1cyk7Ci0JCXJldHVybiByZXR1cm5TdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBPcGVyYXRpb25TdGF0dXMgcnVuT3BlcmF0aW9uKGZpbmFsIElEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElBZGFwdGFibGUgaW5mbywgZmluYWwgaW50IGV4ZWN1dGlvblR5cGUsIE9wZXJhdGlvblN0YXR1cyByZXR1cm5TdGF0dXMpIHsKLQkJaWYgKHJvb3RPcGVyYXRpb24gPT0gb3BlcmF0aW9uKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bk9wZXJhdGlvbihvcGVyYXRpb24sIG1vbml0b3IsIGluZm8sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuU3RhdHVzID0gYWRkU3RhdHVzKHJldHVyblN0YXR1cywgc3RhdHVzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBydW5PcGVyYXRpb24ob3BlcmF0aW9uLCBtb25pdG9yLCBpbmZvLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJcmV0dXJuU3RhdHVzID0gYWRkRXh0ZW5kZWRTdGF0dXMocmV0dXJuU3RhdHVzLCBzdGF0dXMpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsIFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI1IiwgbmV3IE9iamVjdFtde29wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKX0pLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVyblN0YXR1cyA9IGFkZEV4dGVuZGVkU3RhdHVzKHJldHVyblN0YXR1cywgc3RhdHVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0dXJuU3RhdHVzOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBydW5PcGVyYXRpb24oZmluYWwgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24sIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUFkYXB0YWJsZSBpbmZvLCBmaW5hbCBpbnQgZXhlY3V0aW9uVHlwZSkgewotCQlJV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzIHdvcmtzcGFjZVJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMoaW5mbykgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlzd2l0Y2ggKGV4ZWN1dGlvblR5cGUpIHsKLQkJCQkJCWNhc2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSA6Ci0JCQkJCQkJdGhpcy5zZXRTdGF0dXMob3BlcmF0aW9uLmV4ZWN1dGUocG0sIGluZm8pKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuVU5ETyA6Ci0JCQkJCQkJdGhpcy5zZXRTdGF0dXMob3BlcmF0aW9uLnVuZG8ocG0sIGluZm8pKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUkVETyA6Ci0JCQkJCQkJdGhpcy5zZXRTdGF0dXMob3BlcmF0aW9uLnJlZG8ocG0sIGluZm8pKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAobnVsbCA9PSB0aGlzLmdldFN0YXR1cygpKSB7Ci0JCQkJCQl0aGlzLnNldFN0YXR1cyhTdGF0dXMuT0tfU1RBVFVTKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRoaXMuc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgMCwgV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjUiLCBuZXcgT2JqZWN0W117b3BlcmF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpfSksIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlXVFBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG9wZXJhdGlvbi5nZXRTY2hlZHVsaW5nUnVsZSgpOwotCQlpZiAobnVsbCA9PSBydWxlKSB7Ci0JCQlydWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHdvcmtzcGFjZVJ1bm5hYmxlLCBydWxlLCBvcGVyYXRpb24uZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJd29ya3NwYWNlUnVubmFibGUuc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgMCwgV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjUiLCBuZXcgT2JqZWN0W117b3BlcmF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpfSksIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB3b3Jrc3BhY2VSdW5uYWJsZS5nZXRTdGF0dXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgT3BlcmF0aW9uU3RhY2tFbnRyeSB7Ci0KLQkJcHJpdmF0ZSBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbjsKLQkJcHJpdmF0ZSBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbkZvckV4ZWN1dGlvbjsKLQotCQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRPcHNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JCXByaXZhdGUgQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlciBleHRPcEhvbGRlciA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBpbnQgcHJlT3BJbmRleCA9IDA7Ci0JCXByaXZhdGUgaW50IHBvc3RPcEluZGV4ID0gMDsKLQotCQlwcml2YXRlIE9wZXJhdGlvblN0YWNrRW50cnlbXSBwcmVPcFN0YWNrRW50cmllcyA9IG51bGw7Ci0JCXByaXZhdGUgT3BlcmF0aW9uU3RhY2tFbnRyeVtdIHBvc3RPcFN0YWNrRW50cmllcyA9IG51bGw7Ci0KLQkJcHVibGljIE9wZXJhdGlvblN0YWNrRW50cnkgcGFyZW50ID0gbnVsbDsKLQotCQlwdWJsaWMgT3BlcmF0aW9uU3RhY2tFbnRyeShPcGVyYXRpb25TdGFja0VudHJ5IHBhcmVudCwgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0JCQl0aGlzLm9wZXJhdGlvbkZvckV4ZWN1dGlvbiA9IG9wZXJhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBPcGVyYXRpb25TdGFja0VudHJ5IHJvbGxCYWNrT25lT3BlcmF0aW9uKCkgewotCQkJcG9zdE9wSW5kZXggPSAwOwotCQkJb3BlcmF0aW9uRm9yRXhlY3V0aW9uID0gb3BlcmF0aW9uOwotCQkJaWYgKHByZU9wSW5kZXggPT0gMCAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJlbnQucm9sbEJhY2tFeHRlbmRlZCh0aGlzKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzOwotCQl9Ci0KLQkJcHJpdmF0ZSBPcGVyYXRpb25TdGFja0VudHJ5IHJvbGxCYWNrRXh0ZW5kZWQoT3BlcmF0aW9uU3RhY2tFbnRyeSBleHRlbmRlZEVudHJ5KSB7Ci0JCQl3aGlsZSAocG9zdE9wSW5kZXggPiAwKSB7Ci0JCQkJaW50IGluZGV4ID0gLS1wb3N0T3BJbmRleDsKLQkJCQlpZiAocG9zdE9wU3RhY2tFbnRyaWVzW2luZGV4XSA9PSBleHRlbmRlZEVudHJ5KSB7Ci0JCQkJCXBvc3RPcFN0YWNrRW50cmllc1tpbmRleF0gPSBudWxsOwotCQkJCQlyZXR1cm4gdGhpczsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAocHJlT3BJbmRleCA+IDApIHsKLQkJCQlpbnQgaW5kZXggPSAtLXByZU9wSW5kZXg7Ci0JCQkJaWYgKHByZU9wU3RhY2tFbnRyaWVzW2luZGV4XSA9PSBleHRlbmRlZEVudHJ5KSB7Ci0JCQkJCXByZU9wU3RhY2tFbnRyaWVzW2luZGV4XSA9IG51bGw7Ci0JCQkJCWlmIChpbmRleCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gdGhpczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChudWxsICE9IHBhcmVudCkgewotCQkJCXJldHVybiBwYXJlbnQucm9sbEJhY2tFeHRlbmRlZCh0aGlzKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzOwotCQl9Ci0KLQkJcHVibGljIE9wZXJhdGlvblN0YWNrRW50cnkgZ2V0TmV4dFByZU9wZXJhdGlvbigpIHsKLQkJCWlmICghZXh0ZW5kZWRPcHNJbml0aWFsaXplZCkgewotCQkJCWluaXRFeHRlbmRlZE9wcygpOwotCQkJfQotCQkJaWYgKGV4dE9wSG9sZGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUxpc3Qgb3BzID0gZXh0T3BIb2xkZXIuZ2V0UHJlT3BzKCk7Ci0JCQlpZiAob3BzID09IG51bGwgfHwgb3BzLnNpemUoKSA8PSBwcmVPcEluZGV4KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXdoaWxlIChwcmVPcEluZGV4IDwgb3BzLnNpemUoKSkgewotCQkJCWludCBpbmRleCA9IHByZU9wSW5kZXgrKzsKLQkJCQlJRGF0YU1vZGVsT3BlcmF0aW9uIG9wID0gKElEYXRhTW9kZWxPcGVyYXRpb24pIG9wcy5nZXQoaW5kZXgpOwotCQkJCWlmIChzaG91bGRFeGVjdXRlRXh0ZW5kZWQob3AuZ2V0SUQoKSkpIHsKLQkJCQkJb3Auc2V0RGF0YU1vZGVsKGdldERhdGFNb2RlbCgpKTsKLQkJCQkJb3Auc2V0RW52aXJvbm1lbnQoZ2V0RW52aXJvbm1lbnQoKSk7Ci0JCQkJCXByZU9wU3RhY2tFbnRyaWVzW2luZGV4XSA9IG5ldyBPcGVyYXRpb25TdGFja0VudHJ5KHRoaXMsIG9wKTsKLQkJCQkJcmV0dXJuIHByZU9wU3RhY2tFbnRyaWVzW2luZGV4XTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0T3BlcmF0aW9uSUQoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0aW9uSUQoKSB7Ci0JCQlyZXR1cm4gb3BlcmF0aW9uLmdldElEKCk7Ci0JCX0KLQotCQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKSB7Ci0JCQlyZXR1cm4gb3BlcmF0aW9uOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXhlY3V0ZWQoKSB7Ci0JCQlyZXR1cm4gbnVsbCAhPSBvcGVyYXRpb25Gb3JFeGVjdXRpb247Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIHJvb3Qgb3BlcmF0aW9uIGlzIG9ubHkgcmV0dXJuZWQgb25jZTsgdGhpcyB3YXkgaXQgaXMga25vd24gd2hldGhlciBpdCBoYXMgYmVlbgotCQkgKiBleGVjdXRlZCB5ZXQgb3Igbm90LgotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0T3BlcmF0aW9uRm9yRXhlY3V0aW9uKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gb3BlcmF0aW9uRm9yRXhlY3V0aW9uOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlvcGVyYXRpb25Gb3JFeGVjdXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9wZXJhdGlvblN0YWNrRW50cnkgZ2V0TmV4dFBvc3RPcGVyYXRpb24oKSB7Ci0JCQlpZiAoIWV4dGVuZGVkT3BzSW5pdGlhbGl6ZWQpIHsKLQkJCQlpbml0RXh0ZW5kZWRPcHMoKTsKLQkJCX0KLQkJCWlmIChleHRPcEhvbGRlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlMaXN0IG9wcyA9IGV4dE9wSG9sZGVyLmdldFBvc3RPcHMoKTsKLQkJCWlmIChvcHMgPT0gbnVsbCB8fCBvcHMuc2l6ZSgpIDw9IHBvc3RPcEluZGV4KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXdoaWxlIChwb3N0T3BJbmRleCA8IG9wcy5zaXplKCkpIHsKLQkJCQlpbnQgaW5kZXggPSBwb3N0T3BJbmRleCsrOwotCQkJCUlEYXRhTW9kZWxPcGVyYXRpb24gb3AgPSAoSURhdGFNb2RlbE9wZXJhdGlvbikgb3BzLmdldChpbmRleCk7Ci0JCQkJaWYgKHNob3VsZEV4ZWN1dGVFeHRlbmRlZChvcC5nZXRJRCgpKSkgewotCQkJCQlvcC5zZXREYXRhTW9kZWwoZ2V0RGF0YU1vZGVsKCkpOwotCQkJCQlvcC5zZXRFbnZpcm9ubWVudChnZXRFbnZpcm9ubWVudCgpKTsKLQkJCQkJcG9zdE9wU3RhY2tFbnRyaWVzW2luZGV4XSA9IG5ldyBPcGVyYXRpb25TdGFja0VudHJ5KHRoaXMsIG9wKTsKLQkJCQkJcmV0dXJuIHBvc3RPcFN0YWNrRW50cmllc1tpbmRleF07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBpbml0RXh0ZW5kZWRPcHMoKSB7Ci0JCQlpZiAoc2hvdWxkRXhlY3V0ZUV4dGVuZGVkKG9wZXJhdGlvbi5nZXRJRCgpKSkgewotCQkJCWV4dE9wSG9sZGVyID0gQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlci5jcmVhdGVFeHRlbmRlZE9wZXJhdGlvbkhvbGRlcihvcGVyYXRpb24uZ2V0SUQoKSk7Ci0JCQkJaWYgKG51bGwgIT0gZXh0T3BIb2xkZXIpIHsKLQkJCQkJaWYgKGV4dE9wSG9sZGVyLmhhc1ByZU9wcygpKSB7Ci0JCQkJCQlwcmVPcFN0YWNrRW50cmllcyA9IG5ldyBPcGVyYXRpb25TdGFja0VudHJ5W2V4dE9wSG9sZGVyLmdldFByZU9wcygpLnNpemUoKV07Ci0JCQkJCX0KLQkJCQkJaWYgKGV4dE9wSG9sZGVyLmhhc1Bvc3RPcHMoKSkgewotCQkJCQkJcG9zdE9wU3RhY2tFbnRyaWVzID0gbmV3IE9wZXJhdGlvblN0YWNrRW50cnlbZXh0T3BIb2xkZXIuZ2V0UG9zdE9wcygpLnNpemUoKV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlleHRlbmRlZE9wc0luaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEV4ZWN1dGVFeHRlbmRlZChTdHJpbmcgb3BlcmF0aW9uSUQpIHsKLQkJLy8gQ2hlY2sgdGhlIHRvcCBtb3N0IGxldmVsIG9wZXJhdGlvbiBmaXJzdAotCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwgdGhyZWFkUm9vdE9wZXJhdGlvbiA9IChEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwpIHRocmVhZFRvRXh0ZW5kZWRPcENvbnRyb2wuZ2V0KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotCQlpZiAodGhyZWFkUm9vdE9wZXJhdGlvbiAhPSB0aGlzICYmIHRocmVhZFJvb3RPcGVyYXRpb24uZ2V0RGF0YU1vZGVsKCkgIT0gZ2V0RGF0YU1vZGVsKCkgJiYgIXRocmVhZFJvb3RPcGVyYXRpb24uc2hvdWxkRXhlY3V0ZUV4dGVuZGVkKG9wZXJhdGlvbklEKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIE5vIGV4dGVuZGVkIG9wZXJhdGlvbnMgYXJlIGJlaW5nIGV4ZWN1dGVkCi0JCWJvb2xlYW4gYWxsb3dFeHRlbnNpb25zID0gZ2V0RGF0YU1vZGVsKCkuZ2V0Qm9vbGVhblByb3BlcnR5KElEYXRhTW9kZWxQcm9wZXJ0aWVzLkFMTE9XX0VYVEVOU0lPTlMpOwotCQlpZiAoIWFsbG93RXh0ZW5zaW9ucykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIFRoaXMgc3BlY2lmaWMgb3BlcmF0aW9uIHNob3VsZCBub3QgYmUgZXhlY3V0ZWQKLQkJTGlzdCByZXN0cmljdGVkRXh0ZW5zaW9ucyA9IChMaXN0KSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TKTsKLQkJaWYgKHJlc3RyaWN0ZWRFeHRlbnNpb25zLmNvbnRhaW5zKG9wZXJhdGlvbklEKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIFRoaXMgc3BlY2lmaWMgZnVuY3Rpb24gZ3JvdXAgc2hvdWxkIG5vdCBiZSBleGVjdXRlZAotCQlMaXN0IGV4dGVuZGVkQ29udGV4dCA9IGdldERhdGFNb2RlbCgpLmdldEV4dGVuZGVkQ29udGV4dCgpOwotCQlmb3IgKGludCBjb250ZXh0Q291bnQgPSAwOyBjb250ZXh0Q291bnQgPCBleHRlbmRlZENvbnRleHQuc2l6ZSgpOyBjb250ZXh0Q291bnQrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgQWRhcHRhYmlsaXR5VXRpbGl0eS5nZXRBZGFwdGVyKGV4dGVuZGVkQ29udGV4dC5nZXQoY29udGV4dENvdW50KSwgSVByb2plY3QuY2xhc3MpOwotCQkJaWYgKG51bGwgIT0gcHJvamVjdCAmJiAhSUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIob3BlcmF0aW9uSUQsIHByb2plY3QpLmlzRW5hYmxlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkOTRhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIDxwPgotICogSURhdGFNb2RlbE1hbmFnZXJPcGVyYXRpb24gaXMgYW4gSURhdGFNb2RlbE9wZXJhdGlvbiByZXR1cm5lZCBmcm9tCi0gKiB7QGxpbmtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwjZ2V0RGVmYXVsdE9wZXJhdGlvbigpfS4gVGhpcyBPcGVyYXRpb24gd3JhcHMgdGhlIElEYXRhTW9kZWxPcGVyYXRpb24gcmV0dXJuZWQKLSAqIGZyb20gdGhlIElEYXRNb2RlbFByb3ZpZGVyIGJhY2tpbmcgdGhlIElEYXRhTW9kZWwgdGhhdCBjcmVhdGVkIGl0LgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIG9wZXJhdGlvbiBzdXBwb3J0cyBwcmUgYW5kIHBvc3Qgb3BlcmF0aW9uIGV4ZWN1dGlvbi4gUHJlIGFuZCBwb3N0IG9wZXJhdGlvbnMgYXJlCi0gKiBJRGF0YU1vZGVsT3BlcmF0aW9ucyByZWdpc3RlcmVkIHRocm91Z2ggdGhlIE9wZXJhdGlvbkV4dGVuc2lvbiBleHRlbnNpb24gcG9pbnQgd2hpY2ggYXJlIGV4ZWN1dGVkCi0gKiBiZWZvcmUgYW5kIGFmdGVyIHRoZSBwcmltYXJ5IG9wZXJhdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+RXhhbXBsZSAxPC9iPiA8YnI+Ci0gKiBTdXBwb3NlIGFuIElEYXRhTW9kZWxQcm92aWRlciByZXR1cm5zIElEYXRhTW9kZWxPcGVyYXRpb24gWCBhcyBpdHMgZGVmYXVsdCBvcGVyYXRpb24sIGFuZCB0aGlzCi0gKiBJRGF0YU1vZGVsTWFuYWdlck9wZXJhdGlvbiBpcyB3cmFwcGluZyBYLiBBbHNvIHN1cHBvc2Ugb3BlcmF0aW9uIEEgaXMgcmVnaXN0ZXJlZCBhcyBhIHByZQotICogb3BlcmF0aW9uIHRvIFggYW5kIG9wZXJhdGlvbiBCIGlzIHJlZ2lzdGVyZWQgYXMgYSBwb3N0IG9wZXJhdGlvbiB0byBYLiBXaGVuIHRoaXMKLSAqIElEYXRhTW9kZWxNYW5hZ2VyT3BlcmF0aW9uIGlzIGV4ZWN1dGVkIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoaXMgb3JkZXI6Ci0gKiBBLCBYLCBCIHdoaWNoIG1heSBiZSB0aG91Z2h0IGFzIGEgcHJlb3JkZXIgZXhlY3V0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdHJlZToKLSAqIDwvcD4KLSAqIAotICogPHByZT4KLSAqICAgICAgICAgICBYCi0gKiAgICAgICAgICAvIFwKLSAqICAgICAgICAgQSAgIEIKLSAqICAgICAgICAgCi0gKiAgIGV4ZWN1dGlvbiA9IEEuZXhlY3V0ZSgpLCAgWC5leGVjdXRlKCksIEIuZXhlY3V0ZSgpCi0gKiAgIHVuZG8gPSBCLnVuZG8oKSwgWC51bmRvKCksIEEudW5kbygpCi0gKiAgIHJlZG8gPSBBLnJlZG8oKSwgWC5yZWRvKCksIEIucmVkbygpCi0gKiA8L3ByZT4KLSAqIAotICogPHA+Ci0gKiA8Yj5FeGFtcGxlIDI8L2I+IDxicj4KLSAqIElmIEEgaGFkIGEgcHJlIG9wZXJhdGlvbiBDIGFuZCBwb3N0IG9wZXJhdGlvbiBELCBhbmQgQiBoYWQgYSBwcmUgb3BlcmF0aW9uIEUgYW5kIHBvc3Qgb3BlcmF0aW9uIEYKLSAqIHRoZW4gdGhlIHRyZWUgd291bGQgbG9vayBsaWtlOgotICogPC9wPgotICogCi0gKiA8cHJlPgotICogICAgICAgICAgICBYCi0gKiAgICAgICAgICAgLyBcCi0gKiAgICAgICAgICAvICAgXAotICogICAgICAgICBBICAgICBCCi0gKiAgICAgICAgLyBcICAgLyBcCi0gKiAgICAgICBDICAgRCBFICAgRgotICogICAKLSAqICAgZXhlY3V0aW9uID0gQy5leGVjdXRlKCksIEEuZXhlY3V0ZSgpLCAgRC5leGVjdXRlKCksIFguZXhlY3V0ZSgpLCBFLmV4ZWN1dGUoKSwgQi5leGVjdXRlKCksIEYuZXhlY3V0ZSgpCi0gKiAgIHVuZG8gPSBGLnVuZG8oKSwgQi51bmRvKCksIEUudW5kbygpLCBYLnVuZG8oKSwgRC51bmRvKCksIEEudW5kbygpLCBDLnVuZG8oKQotICogICByZWRvID0gQy5yZWRvKCksIEEucmVkbygpLCAgRC5yZWRvKCksIFgucmVkbygpLCBFLnJlZG8oKSwgQi5yZWRvKCksIEYucmVkbygpCi0gKiA8L3ByZT4KLSAqIAotICogPC9wPgotICogPGI+RXhhbXBsZSAzPC9iPiA8YnI+Ci0gKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHByZSBvcGVyYXRpb24gb3IgcG9zdCBvcGVyYXRpb24gZm9yIGEgcGFydGljdWxhciBvcGVyYXRpb24sIHRoZW4gdGhlcmUKLSAqIGlzIG5vIGRlZmluZWQgb3JkZXJpbmcgb2YgdGhvc2UgcHJlIGFuZCBwb3N0IG9wZXJhdGlvbiB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlciwgb3RoZXIgdGhhbgotICogdGhhdCBpdCB3aWxsIGJlIGNvbnNpc3RlbnQuIEZvciBleGFtcGxlIHN1cHBvc2Ugb3BlcmF0aW9uIFggaGFkIG9ubHkgdHdvIHByZSBvcGVyYXRpb25zLCBBIGFuZCBCLAotICogYW5kIHR3byBwb3N0IG9wZXJhdGlvbnMsIEMgYW5kIEQuIFRoZSBleGVjdXRpb24gdHJlZSB3b3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqIDwvcD4KLSAqIAotICogPHByZT4KLSAqICAgICAgICAgWCAgICAgICAgICAgICAgWCAgICAgICAgICAgICAgWCAgICAgICAgICAgICAgWAotICogICAgICAgIC8gXCAgICAgICAgICAgIC8gXCAgICAgICAgICAgIC8gXCAgICAgICAgICAgIC8gXAotICogICAgICBBQiAgIENEICAgICAgICBCQSAgIENEICAgICAgICBBQiAgIERDICAgICAgICBCQSAgIERDCi0gKiAgIAotICogICAgZXhlYyA9IEFCWENEICAgZXhlYyA9IEJBWENEICAgZXhlYyA9IEFCWERDICAgZXhlYyA9IEJBWERDCi0gKiAgICB1bmRvID0gRENYQkEgICB1bmRvID0gRENYQUIgICB1bmRvID0gQ0RYQkEgICB1bmRvID0gQ0RYQUIgCi0gKiAgICByZWRvID0gQUJYQ0QgICByZWRvID0gQkFYQ0QgICByZWRvID0gQUJYREMgICByZWRvID0gQkFYREMKLSAqIDwvcHJlPgotICogCi0gKiA8cD4KLSAqIER1cmluZyBleGVjdXRpb24sIHJvbGxiYWNrLCB1bmRvLCBhbmQgcmVkbywge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50fXMgYXJlIGZpcmVkIHRvIGFsbAotICogcmVnaXN0ZXJlZCB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXJ9cyBnaXZpbmcgZWFjaCBvZiB0aGVtIGFuIG9wcG9ydHVuaXR5IHRvIHBhdXNlIHRoZQotICogb3BlcmF0aW9uIGJ5IHJldHVybmluZyB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIjUEFVU0V9LgotICoge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50fSBoYXMgbW9yZSBkZXRhaWxzIG9uIHdoZW4gdGhlc2UgZXZlbnRzIGFyZSBmaXJlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWVvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0gKiAKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gZXh0ZW5kcyBJRGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIG5ldmVyIGJlZW4gZXhlY3V0ZWQuIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzCi0JICogc3RhdGUgaXQgbWF5IG9ubHkgYmUgZXhlY3V0ZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1NUQVJURUQgPSAwOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hpbGUgdGhlIG9wZXJhdGlvbiBpcyBleGVjdXRpbmcuIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlIGl0Ci0JICogbWF5IG9ubHkgYmUgcGF1c2VkIGJ5IGFuIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcn0uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICogQHNlZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkdfRVhFQ1VURSA9IDE7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGlsZSB0aGUgb3BlcmF0aW9uIGlzIHJvbGxpbmcgYmFjay4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUKLQkgKiBpdCBtYXkgb25seSBiZSBwYXVzZWQgYnkgYW4ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjcm9sbEJhY2soSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKiBAc2VlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOTklOR19ST0xMQkFDSyA9IDI7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGlsZSB0aGUgb3BlcmF0aW9uIGlzIHJlZG9pbmcuIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlIGl0Ci0JICogbWF5IG9ubHkgYmUgcGF1c2VkIGJ5IGFuIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcn0uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiN1bmRvKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICogQHNlZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkdfVU5ETyA9IDM7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGlsZSB0aGUgb3BlcmFpdG9uIGlzIHJlZG9pbmcuIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlIGl0Ci0JICogbWF5IG9ubHkgYmUgcGF1c2VkIGJ5IGFuIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcn0uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNyZWRvKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICogQHNlZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkdfUkVETyA9IDQ7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gcGF1c2VkIHdoaWxlIGl0IHdhcyBleGVjdXRpbmcuIFdoZW4gdGhlCi0JICogb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUgaXQgbWF5IGVpdGhlciBiZSByZXN1bWVkIHRvIGNvbnRpbnVlIGV4ZWN1dGlvbiBvciByb2xsZWQgYmFjayB0bwotCSAqIHVuZG8gdGhlIHBhcnRpYWwgZXhlY3V0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlICNyZXN1bWUoSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKiBAc2VlICNyb2xsQmFjayhJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBVVNFRF9FWEVDVVRFID0gNTsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBwYXVzZWQgd2hpbGUgaXQgd2FzIHJvbGxpbmcgYmFjay4gV2hlbiB0aGUKLQkgKiBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZSBpdCBtYXkgZWl0aGVyIGJlIHJlc3VtZWQgdG8gY29udGludWUgcm9sbGluZyBiYWNrIG9yIGV4ZWN1dGVkCi0JICogd2hpY2ggY29udGludWUgdGhlIGZvd2FyZCBleGVjdXRpb24gZnJvbSB0aGUgcG9pbnQgd2hlcmUgdGhlIHJvbGxiYWNrIHdhcyBwYXVzZWQKLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjcmVzdW1lKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVVTRURfUk9MTEJBQ0sgPSA2OwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIHBhdXNlZCB3aGlsZSBpdCB3YXMgdW5kb2luZy4gV2hlbiB0aGUKLQkgKiBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZSBpdCBtYXkgYmUgb25seSBiZSByZXN1bWVkIHRvIGNvbnRpbnVlIHVuZG9pbmcuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI3Jlc3VtZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBVVNFRF9VTkRPID0gNzsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBwYXVzZWQgd2hpbGUgaXQgd2FzIHJlZG9pbmcuIFdoZW4gdGhlCi0JICogb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUgaXQgbWF5IG9ubHkgYmUgcmVzdW1lZCB0byBjb250aW51ZSByZWRvaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlICNyZXN1bWUoSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVVTRURfUkVETyA9IDg7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gZmluaXNoZWQgZXhlY3V0aW9uLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcwotCSAqIHN0YXRlIGl0IG1heSBvbmx5IGJlIHVuZG9uZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI3VuZG8oSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVURV9FWEVDVVRFID0gOTsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBmaW5pc2hlZCByb2xsaW5nIGJhY2suIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzCi0JICogc3RhdGUgaXQgbWF5IG9ubHkgYmUgZXhlY3V0ZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVfUk9MTEJBQ0sgPSAxMDsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBmaW5pc2hlZCB1bmRvaW5nLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZQotCSAqIGl0IG1heSBvbmx5IGJlIHJlZG9uZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI3JlZG8oSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVURV9VTkRPID0gMTE7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gZmluaXNoZWQgcmVkb2luZy4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUKLQkgKiBpdCBtYXkgb25seSBiZSB1ZG9uZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI3VuZG8oSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVURV9SRURPID0gMTI7Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlIG9mIHRoZSBvcGVyYXRpb24uIFJldHVybnMgb25lIG9mOgotCSAqIDx1bD4KLQkgKiA8bGk+e0BsaW5rICNOT1RfU1RBUlRFRH08L2xpPgotCSAqIDxsaT57QGxpbmsgI1JVTk5JTkdfRVhFQ1VURX08L2xpPgotCSAqIDxsaT57QGxpbmsgI1JVTk5JTkdfUk9MTEJBQ0t9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNSVU5OSU5HX1VORE99PC9saT4KLQkgKiA8bGk+e0BsaW5rICNSVU5OSU5HX1JFRE99PC9saT4KLQkgKiA8bGk+e0BsaW5rICNQQVVTRURfRVhFQ1VURX08L2xpPgotCSAqIDxsaT57QGxpbmsgI1BBVVNFRF9ST0xMQkFDS308L2xpPgotCSAqIDxsaT57QGxpbmsgI1BBVVNFRF9VTkRPfTwvbGk+Ci0JICogPGxpPntAbGluayAjUEFVU0VEX1JFRE99PC9saT4KLQkgKiA8bGk+e0BsaW5rICNDT01QTEVURV9FWEVDVVRFfTwvbGk+Ci0JICogPGxpPntAbGluayAjQ09NUExFVEVfUk9MTEJBQ0t9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNDT01QTEVURV9VTkRPfTwvbGk+Ci0JICogPGxpPntAbGluayAjQ09NUExFVEVfUkVET308L2xpPgotCSAqIDwvdWw+Ci0JICogPHA+Ci0JICogCi0JICogQHJldHVybiBUaGUgY3VycmVudCBleGVjdXRpb24gc3RhdGUuCi0JICovCi0JcHVibGljIGludCBnZXRFeGVjdXRpb25TdGF0ZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmVzdW1lcyBleGVjdXRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyBjdXJlbnRseSBwYXVzZWQuIEFuIG9wZXJhdGlvbiBpcyBwYXVzZWQgaWYKLQkgKiB7QGxpbmsgI2dldEV4ZWN1dGlvblN0YXRlKCl9IHJldHVybnMgYW55IG9mIHtAbGluayAjUEFVU0VEX0VYRUNVVEV9LAotCSAqIHtAbGluayAjUEFVU0VEX1JPTExCQUNLfSwge0BsaW5rICNQQVVTRURfVU5ET30sIG9yIHtAbGluayAjUEFVU0VEX1JFRE99LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSB0byB1c2UgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyB0bwotCSAqICAgICAgICAgICAgdGhlIHVzZXIuCi0JICogQHBhcmFtIGluZm8KLQkgKiAgICAgICAgICAgIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkKLQkgKiAgICAgICAgICAgIFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyIGZvciB0aGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLmNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElTdGF0dXMgb2YgdGhlIHJlc3VtZS4gVGhlIHN0YXR1cyBzZXZlcml0eSBzaG91bGQgYmUgc2V0IHRvIDxjb2RlPk9LPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYW5kIDxjb2RlPkVSUk9SPC9jb2RlPiBpZiBpdCB3YXMgbm90LiBBbnkgb3RoZXIKLQkgKiAgICAgICAgIHN0YXR1cyBpcyBhc3N1bWVkIHRvIHJlcHJlc2VudCBhbiBpbmNvbXBsZXRpb24gb2YgdGhlIHJlc3VtZS4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZXN1bWUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSb2xscyBiYWNrIHRoZSBwYXJ0aWFsIGV4ZWN1dGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBpbgotCSAqIHtAbGluayAjZ2V0RXhlY3V0aW9uU3RhdGUoKX0gcmV0dXJucyBlaXRlciB7QGxpbmsgI1BBVVNFRF9FWEVDVVRFfSBvcgotCSAqIHtAbGluayAjUEFVU0VEX1JPTExCQUNLfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIChvciA8Y29kZT5udWxsPC9jb2RlPikgdG8gdXNlIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgdG8KLQkgKiAgICAgICAgICAgIHRoZSB1c2VyLgotCSAqIEBwYXJhbSBpbmZvCi0JICogICAgICAgICAgICB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5Ci0JICogICAgICAgICAgICBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZSB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlciBmb3IgdGhlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbC5jbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJU3RhdHVzIG9mIHRoZSByZXN1bWUuIFRoZSBzdGF0dXMgc2V2ZXJpdHkgc2hvdWxkIGJlIHNldCB0byA8Y29kZT5PSzwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGFuZCA8Y29kZT5FUlJPUjwvY29kZT4gaWYgaXQgd2FzIG5vdC4gQW55IG90aGVyCi0JICogICAgICAgICBzdGF0dXMgaXMgYXNzdW1lZCB0byByZXByZXNlbnQgYW4gaW5jb21wbGV0aW9uIG9mIHRoZSByZXN1bWUuCi0JICogCi0JICovCi0JcHVibGljIElTdGF0dXMgcm9sbEJhY2soSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciB0byBsaXN0ZW4gZm9yIG9wZXJhdGlvbiBldmVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb25MaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIElPcGVyYXRpb25MaXN0ZW5lciB0byBhZGQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkT3BlcmF0aW9uTGlzdGVuZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgb3BlcmF0aW9uTGlzdGVuZXIpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIElPcGVyYXRpb25MaW5zdGVuZXIuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbkxpc3RlbmVyCi0JICogICAgICAgICAgICBUaGUgSU9wZXJhdG9pbkxpc3RlbmVyIHRvIHJlbW92ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVPcGVyYXRpb25MaXN0ZW5lcihJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lciBvcGVyYXRpb25MaXN0ZW5lcik7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjY3ODA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZXNlIGV2ZW50cyBhcmUgZmlyZWQgdG8ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyfXMgZnJvbSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufXMgZHVyaW5nIGV4ZWN1dGlvbiwgcm9sbGJhY2ssIHVuZG8sCi0gKiBhbmQgcmVkby4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiA8Yj5FeGFtcGxlIDI8L2I+IGZyb20ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn08YnI+Ci0gKiA8cHJlPgotICogICAgICAgICAgWAotICogICAgICAgICAvIFwKLSAqICAgICAgICAvICAgXAotICogICAgICAgQSAgICAgQgotICogICAgICAvIFwgICAvIFwKLSAqICAgICBDICAgRCBFICAgRgotICogPC9wcmU+Ci0gKiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGV2ZW50cyB3aWxsIGJlIGZpcmVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgZHVyaW5nIGFuIGV4ZWN1dGlvbjoKLSAqIDx0YWJsZSBib3JkZXI9MT4KLSAqIDx0cj48dGg+b3BlcmF0aW9uPC90aD48dGg+b3BlcmF0aW9uIHR5cGU8L3RoPjx0aD5leGVjdXRpb24gdHlwZTwvdGg+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk5PREVfU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+Tk9ERV9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5OT0RFX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5OT0RFX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5OT0RFX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5OT0RFX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk5PREVfRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk5PREVfU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+Tk9ERV9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+Tk9ERV9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+Tk9ERV9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+Tk9ERV9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5OT0RFX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk5PREVfRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPC90YWJsZT4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+RXhhbXBsZSAyPC9iPiBmcm9tIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259PGJyPgotICogPHByZT4KLSAqICAgICAgICAgIFgKLSAqICAgICAgICAgLyBcCi0gKiAgICAgICAgLyAgIFwKLSAqICAgICAgIEEgICAgIEIKLSAqICAgICAgLyBcICAgLyBcCi0gKiAgICAgQyAgIEQgRSAgIEYKLSAqIDwvcHJlPgotICogSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBldmVudHMgd2lsbCBiZSBmaXJlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGR1cmluZyBhIHJvbGxiYWNrOgotICogPHRhYmxlIGJvcmRlcj0xPgotICogPHRyPjx0aD5vcGVyYXRpb248L3RoPjx0aD5vcGVyYXRpb24gdHlwZTwvdGg+PHRoPmV4ZWN1dGlvbiB0eXBlPC90aD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlJPTExCQUNLPC90ZD48L3RyPgotICogPC90YWJsZT4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+RXhhbXBsZSAyPC9iPiBmcm9tIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259PGJyPgotICogPHByZT4KLSAqICAgICAgICAgIFgKLSAqICAgICAgICAgLyBcCi0gKiAgICAgICAgLyAgIFwKLSAqICAgICAgIEEgICAgIEIKLSAqICAgICAgLyBcICAgLyBcCi0gKiAgICAgQyAgIEQgRSAgIEYKLSAqIDwvcHJlPgotICogSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBldmVudHMgd2lsbCBiZSBmaXJlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGR1cmluZyBhbiB1bmRvOgotICogPHRhYmxlIGJvcmRlcj0xPgotICogPHRyPjx0aD5vcGVyYXRpb248L3RoPjx0aD5vcGVyYXRpb24gdHlwZTwvdGg+PHRoPmV4ZWN1dGlvbiB0eXBlPC90aD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDwvdGFibGU+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPkV4YW1wbGUgMjwvYj4gZnJvbSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufTxicj4KLSAqIDxwcmU+Ci0gKiAgICAgICAgICBYCi0gKiAgICAgICAgIC8gXAotICogICAgICAgIC8gICBcCi0gKiAgICAgICBBICAgICBCCi0gKiAgICAgIC8gXCAgIC8gXAotICogICAgIEMgICBEIEUgICBGCi0gKiA8L3ByZT4KLSAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZXZlbnRzIHdpbGwgYmUgZmlyZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBkdXJpbmcgYSByZWRvOgotICogPHRhYmxlIGJvcmRlcj0xPgotICogPHRyPjx0aD5vcGVyYXRpb248L3RoPjx0aD5vcGVyYXRpb24gdHlwZTwvdGg+PHRoPmV4ZWN1dGlvbiB0eXBlPC90aD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDwvdGFibGU+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiB0eXBlIHNldCB3aGVuIGFuIG9wZXJhdGlvbiBleGVjdXRpb24gdHJhdmVyc2FsIGlzIGFib3V0IHRvIHN0YXJ0IHdpdGhpbiB0aGUKLQkgKiB0cmVlIG9mIG9wZXJhdGlvbnMgaGFuZGxlZCBieSB0aGUgb3duaW5nIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259LiBUaGlzIG9wZXJhdGlvbgotCSAqIHR5cGUgaXMgb25seSBzZXQgd2hlbiB0aGUgZXhlY3V0aW9uIHR5cGUgaXMgc2V0IHRvIHtAbGluayAjRVhFQ1VURX0uIFVzaW5nIHRoZSBleGFtcGxlCi0JICogYWJvdmUsIGV2ZW50cyB3aXRoIHRoaXMgb3BlcmF0aW9uIHR5cGUgd2lsbCBiZSBmaXJlZCBhY2NvcmRpbmcgdG8gYW4gaW4gb3JkZXIgdHJhdmVyc2FsIG9mCi0JICogdGhlIHRyZWU7IGkuZS4gWEFDREJFRgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0RFX1NUQVJUSU5HID0gMTsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgb3BlcmF0aW9uIHR5cGUgc2V0IHdoZW4gYW4gb3BlcmF0aW9uIGV4ZWN1dGlvbiB0cmF2ZXJzYWwgZmluaXNoZXMgd2l0aGluIHRoZSB0cmVlIG9mCi0JICogb3BlcmF0aW9ucyBoYW5kbGVkIGJ5IHRoZSBvd25pbmcge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn0uIFRoaXMgb3BlcmF0aW9uIHR5cGUgaXMKLQkgKiBvbmx5IHNldCB3aGVuIHRoZSBleGVjdXRpb24gdHlwZSBpcyBzZXQgdG8ge0BsaW5rICNFWEVDVVRFfS4gVXNpbmcgdGhlIGV4YW1wbGUgYWJvdmUsIGV2ZW50cwotCSAqIHdpdGggdGhpcyBvcGVyYXRpb24gdHlwZSB3aWxsIGJlIGZpcmVkIGFjY29yZGluZyB0byBhIHBvc3Qgb3JkZXIgdHJhdmVyc2FsIG9mIHRoZSB0cmVlOyBpLmUuCi0JICogQ0RBRUZCWAotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0RFX0ZJTklTSEVEID0gMjsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgb3BlcmF0aW9uIHR5cGUgc2V0IHJpZ2h0IGJlZm9yZSBhbiBvcGVyYXRpb24gaXMgZ29pbmcgdG8gZG8gaXRzIHdvcmsuIFRoaXMgb3BlcmF0aW9uIHR5cGUKLQkgKiBtYXkgYmUgdXNlZCB3aXRoIGFsbCBleGVjdGlvbiB0eXBlcy4gVXNpbmcgdGhlIGV4YW1wbGUgYWJvdmUsIGV2ZW50cyB3aXRoIHRoaXMgb3Blcml0b24gdHlwZQotCSAqIHdpbGwgYmUgZmlyZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdHJlZSB0cmF2ZXJzYWw6IENBRFhCRUYKLQkgKiA8cD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUlOX1NUQVJUSU5HID0gMzsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgb3BlcmF0aW9uIHR5cGUgc2V0IGltbWVkaWF0bHkgYWZ0ZXIgYW4gb3BlcmF0aW9uIGZpbnNoZWQgZG9pbmcgaXRzIHdvcmsuIFRoaXMgb3BlcmF0aW9uCi0JICogdHlwZSBtYXkgYmUgdXNlZCB3aXRoIGFsbCBleGVjdGlvbiB0eXBlcy4gVXNpbmcgdGhlIGV4YW1wbGUgYWJvdmUsIGV2ZW50cyB3aXRoIHRoaXMgb3Blcml0b24KLQkgKiB0eXBlIHdpbGwgYmUgZmlyZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdHJlZSB0cmF2ZXJzYWw6IENBRFhCRUYKLQkgKiA8cD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUlOX0ZJTklTSEVEID0gNDsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGVjdXRpb24gdHlwZSBzZXQgd2hlbiBkdXJpbmcgZXhlY3V0aW9uLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEVDVVRFID0gMDsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhlY3V0aW9uIHR5cGUgc2V0IHdoZW4gZHVyaW5nIHJvbGxiYWNrLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST0xMQkFDSyA9IDE7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZWN1dGlvbiB0eXBlIHNldCB3aGVuIGR1cmluZyB1bmRvLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRPID0gMjsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhlY3V0aW9uIHR5cGUgc2V0IHdoZW4gZHVyaW5nIHJlZG8uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFRE8gPSAzOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgb3BlcmF0aW9uIGluIHF1ZXN0aW9uLiBUaGlzIG9wZXJhdGlvbiB3aWxsIGJlIG9uZSBvZiB0aGUgb3BlcmF0aW9ucyB3aXRoaW4gdGhlCi0JICogdHJlZSBvZiBvcGVyYXRpb25zIGhhbmRsZWQgYnkgdGhlIG93bmluZyB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgdHlwZSBvZiBvcGVyYXRpb24gd2l0aCByZXNwZWN0IHRvIHRoZSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufQotCSAqIGV4ZWN1dGluZyBpdC4gVGhpcyB3aWxsIGJlIG9uZSBvZiB7QGxpbmsgI05PREVfU1RBUlRJTkd9LCB7QGxpbmsgI05PREVfRklOSVNIRUR9LAotCSAqIHtAbGluayAjTUFJTl9TVEFSVElOR30sIG9yIHtAbGluayAjTUFJTl9GSU5JU0hFRH0uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gb25lIG9mIHtAbGluayAjTk9ERV9TVEFSVElOR30sIHtAbGluayAjTk9ERV9GSU5JU0hFRH0sIHtAbGluayAjTUFJTl9TVEFSVElOR30sIG9yCi0JICogICAgICAgICB7QGxpbmsgI01BSU5fRklOSVNIRUR9LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgdHlwZSBvZiBleGVjdXRpb24gdGhlIG9wZXJhdGlvbiBpcyBhYm91dCB0byBiZWdpbi4gVGhpcyB3aWxsIGJlIG9uZSBvZgotCSAqIHtAbGluayAjRVhFQ1VURX0sIHtAbGluayAjUk9MTEJBQ0t9LCB7QGxpbmsgI1VORE99LCBvciB7QGxpbmsgI1JFRE99LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIG9uZSBvZiB7QGxpbmsgI0VYRUNVVEV9LCB7QGxpbmsgI1JPTExCQUNLfSwge0BsaW5rICNVTkRPfSwgb3Ige0BsaW5rICNSRURPfS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4ZWN1dGlvblR5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NWY0NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBVc2VkIHRvIGxpc3RlbiBmb3Ige0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50fXMgZmlyZWQgZnJvbSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDbGllbnRzIHNob3VsZCByZXR1cm4gdGhpcyBjb25zdGFudCBmcm9tIHtAbGluayAjbm90aWZ5KElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50KX0gdG8gc3BlY2lmeSB0aGF0Ci0JICogZXhlY3V0aW9uIHNob3VsZCBjb250aW51ZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVElOVUUgPSAwOwotCi0JLyoqCi0JICogPHA+Ci0JICogQ2xpZW50cyBzaG91bGQgcmV0dXJuIHRoaXMgY29uc3RhbnQgZnJvbSB7QGxpbmsgI25vdGlmeShJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudCl9IHRvIHNwZWNpZnkgdGhhdAotCSAqIGV4ZWN1dGlvbiBzaG91bGQgcGF1c2UuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBVVNFID0gMTsKLQotCi0JLyoqCi0JICogPHA+Ci0JICogTGlzdGVuZXIgaW50ZXJmYWNlIGJ5IHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259IGZvciBvcGVyYXRpb24gZXhlY3V0aW9uCi0JICogbm90aWZpY2F0aW9uLiBQcmlvciB0byBzdGFydGluZyBhbnkgb3BlcmF0aW9uJ3MgZXhlY3V0aW9uLCBub3RpZmljYXRpb25zIHdpbGwgYmUgc2VudCB3aGljaAotCSAqIGFsbG93IGNsaWVudHMgdG8gcGF1c2UgYW4gb3BlcmF0aW9uJ3MgZXhlY3V0aW9uLiBJbXBsZW1lbnRlcnMgc2hvdWxkIHJldHVybiB7QGxpbmsgI0NPTlRJTlVFfQotCSAqIHRvIGFsbG93IHRoZSBvcGVyYXRpb24ncyBleGVjdXRpb24gdG8gY29udGludWUgb3Ige0BsaW5rICNQQVVTRX0gdG8gcGF1c2UgZXhlY3V0aW9uLiBJZgotCSAqIHtAbGluayAjUEFVU0V9IGlzIHJldHVybmVkLCB0aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW9uIHN0YWNrIHdpbGwgYmUgcGF1c2VkIHVudGlsIGl0IGlzCi0JICogcmVzdW1lZC4gVGhlIHJlc3BvbnNpYmxpdHkgZm9yIHJlc3VtaW5nIGEgcGF1c2VkIG9wZXJhdGlvbiBsaWVzIG9uIHRoZSBjbGllbnQgdGhhdCBwYXVzZWQgaXQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBldmVudAotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJuIENPTlRJTlVFIHRvIGNvbnRpbnVlLCBvciBQQVVTRSB0byBwYXVzZS4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiNhZGRPcGVyYXRpb25MaXN0ZW5lcihJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcikKLQkgKiBAc2VlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiNyZXN1bWUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgaW50IG5vdGlmeShJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxNGJkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGNsYXNzIElXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMgaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUgewotCXByaXZhdGUgSUFkYXB0YWJsZSBpbmZvOwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLXB1YmxpYyBJV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzKElBZGFwdGFibGUgaW5mbykgewotCQlzdXBlcigpOwotCQl0aGlzLmluZm8gPSBpbmZvOwotCX0KLXB1YmxpYyBJQWRhcHRhYmxlIGdldEluZm8oKSB7Ci0JLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCXJldHVybiBpbmZvOwotfQotcHVibGljIHZvaWQgc2V0U3RhdHVzKElTdGF0dXMgYVN0YXR1cykgewotCXN0YXR1cyA9IGFTdGF0dXM7Ci19Ci0KLXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JfQotcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCXJldHVybiBzdGF0dXM7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL1dyYXBwZWRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL1dyYXBwZWRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzNTg1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9XcmFwcGVkT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXcmFwcGVkT3BlcmF0aW9uIGltcGxlbWVudHMgSURhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbE9wZXJhdGlvbiByb290T3BlcmF0aW9uOwotCQotCXB1YmxpYyBXcmFwcGVkT3BlcmF0aW9uKElEYXRhTW9kZWxPcGVyYXRpb24gcm9vdE9wZXJhdGlvbikgewotCQl0aGlzLnJvb3RPcGVyYXRpb24gPSByb290T3BlcmF0aW9uOwotCQlpZiAobnVsbCA9PSByb290T3BlcmF0aW9uKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5jYW5SZWRvKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uY2FuVW5kbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCkgewotCQlyb290T3BlcmF0aW9uLnNldElEKGlkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5nZXRJRCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXJvb3RPcGVyYXRpb24uc2V0RGF0YU1vZGVsKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmdldERhdGFNb2RlbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlyb290T3BlcmF0aW9uLnNldEVudmlyb25tZW50KGVudmlyb25tZW50KTsKLQl9Ci0KLQlwdWJsaWMgSUVudmlyb25tZW50IGdldEVudmlyb25tZW50KCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5nZXRFbnZpcm9ubWVudCgpOwotCX0KLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmdldFNjaGVkdWxpbmdSdWxlKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLnVuZG8obW9uaXRvciwgaW5mbyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLnJlZG8obW9uaXRvciwgaW5mbyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRPcGVyYXRpb25FeGVjdXRpb25GbGFncygpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5nZXRMYWJlbCgpOwotCX0KLQotCXB1YmxpYyBJVW5kb0NvbnRleHRbXSBnZXRDb250ZXh0cygpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZ2V0Q29udGV4dHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb250ZXh0KElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmhhc0NvbnRleHQoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ29udGV4dChJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQlyb290T3BlcmF0aW9uLmFkZENvbnRleHQoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dChJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQlyb290T3BlcmF0aW9uLnJlbW92ZUNvbnRleHQoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJcm9vdE9wZXJhdGlvbi5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvQWJzdHJhY3RJZGVudGlmaWFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9BYnN0cmFjdElkZW50aWZpYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2QxNDNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9BYnN0cmFjdElkZW50aWZpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RJZGVudGlmaWFibGUgaW1wbGVtZW50cyBJZGVudGlmaWFibGUgewotCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQotCXB1YmxpYyBBYnN0cmFjdElkZW50aWZpYWJsZShTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YWZhMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0FzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGJsYW5jZXR0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBc2NlbmRpbmdHcm91cENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBBc2NlbmRpbmdHcm91cENvbXBhcmF0b3Igc2luZ2xldG9uOwotCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCWlmIChvMiA9PSBudWxsICYmIG8xICE9IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChvMSA9PSBudWxsICYmIG8yICE9IG51bGwpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKG8xID09IG51bGwgJiYgbzIgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCi0JCUZ1bmN0aW9uR3JvdXAgZ3JvdXAxID0gKEZ1bmN0aW9uR3JvdXApIG8xOwotCQlGdW5jdGlvbkdyb3VwIGdyb3VwMiA9IChGdW5jdGlvbkdyb3VwKSBvMjsKLQotCQlpZiAoZ3JvdXAxLmdldFByaW9yaXR5KCkgPiBncm91cDIuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiAxOwotCQlpZiAoZ3JvdXAxLmdldFByaW9yaXR5KCkgPT0gZ3JvdXAyLmdldFByaW9yaXR5KCkpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKGdyb3VwMS5nZXRQcmlvcml0eSgpIDwgZ3JvdXAyLmdldFByaW9yaXR5KCkpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXNpbmdsZXRvbiA9IG5ldyBBc2NlbmRpbmdHcm91cENvbXBhcmF0b3IoKTsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9EYXRhTW9kZWxFbmFibGVtZW50RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0RhdGFNb2RlbEVuYWJsZW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZTEyNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0RhdGFNb2RlbEVuYWJsZW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxFbmFibGVtZW50RmFjdG9yeSB7Ci0JLyoqCi0JICogTG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIElEYXRhTW9kZWxQcm92aWRlciBieSB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyS2luZCBTdHJpbmcgYW5kIGEKLQkgKiBjb250ZXh0IG9mIHRoZSBjb250YWluaW5nIFByb2plY3QuIFRoZSBtZXRob2QgZ2V0cyBhbiBhcnJheSBvZiBEYXRhTW9kZWxQcm92aWRlckRlc2NyaXB0b3IKLQkgKiBmcm9tIHRoZSBiYXNlIERhdGFNb2RlbEZhY3RvcnkgdGhlbiBmaWx0ZXJzIG91dCBQcm92aWRlcnMgYmFzZWQgb24gZnVuY3Rpb24gZ3JvdXAgZW5hYmxlbWVudC4KLQkgKiBGaW5hbGx5IHRoZSBQcm92aWRlciB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IGlzIHJldHVybmVkLiBJZiB0aGUgSURhdGFNb2RlbFByb3ZpZGVyIGlzIG5vdAotCSAqIGZvdW5kIHRoZW4gYSBSdW50aW1lRXhjZXB0aW9uIGlzIGxvZ2dlZCBhbmQgbnVsbCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdmlkZXJLaW5kCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIGlkIG9mIHRoZSBwcm92aWRlciBraW5kCi0JICogQHBhcmFtIGN1clByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBjb250YWluaW5nIElQcm9qZWN0Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChTdHJpbmcgcHJvdmlkZXJLaW5kLCBJUHJvamVjdCBjdXJQcm9qZWN0KSB7Ci0JCVN0cmluZ1tdIHByb3ZpZGVySURzID0gRGF0YU1vZGVsRmFjdG9yeS5nZXREYXRhTW9kZWxQcm92aWRlcklEc0ZvcktpbmQocHJvdmlkZXJLaW5kKTsKLQkJaWYgKHByb3ZpZGVySURzID09IG51bGwgfHwgcHJvdmlkZXJJRHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHRvcFByb3ZpZGVyID0gZ2V0SGlnaGVzdFByaW9yaXR5RW5hYmxlZFByb3ZpZGVyRGVzYyhwcm92aWRlcklEcywgY3VyUHJvamVjdCk7Ci0JCWlmICh0b3BQcm92aWRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCh0b3BQcm92aWRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEhpZ2hlc3RQcmlvcml0eUVuYWJsZWRQcm92aWRlckRlc2MoU3RyaW5nW10gcHJvdmlkZXJJRHMsIElQcm9qZWN0IGN1clByb2plY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRJRCA9IHByb3ZpZGVySURzWzBdOwotCQlJRW5hYmxlbWVudElkZW50aWZpZXIgZW5hYmxlbWVudElkZW50aWZpZXI7Ci0JCUlkZW50aWZpYWJsZSB0ZW1wSWRlbnRpZmlhYmxlOwotCQlJZGVudGlmaWFibGUgdG9wUHJpb3JpdHlJZGVudGlmaWFibGUgPSBudWxsOwotCi0JCWZvciAoaW50IGkgPSAxOyBpIDwgcHJvdmlkZXJJRHMubGVuZ3RoOyBpKyspIHsKLQkJCXRlbXBJZGVudGlmaWFibGUgPSBuZXcgQWJzdHJhY3RJZGVudGlmaWFibGUocHJvdmlkZXJJRHNbaV0pOwotCQkJZW5hYmxlbWVudElkZW50aWZpZXIgPSBFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKHRlbXBJZGVudGlmaWFibGUuZ2V0SUQoKSwgY3VyUHJvamVjdCk7Ci0JCQlpZiAoZW5hYmxlbWVudElkZW50aWZpZXIuaXNFbmFibGVkKCkpIHsKLQkJCQlpZiAodG9wUHJpb3JpdHlJZGVudGlmaWFibGUgPT0gbnVsbCkKLQkJCQkJdG9wUHJpb3JpdHlJZGVudGlmaWFibGUgPSB0ZW1wSWRlbnRpZmlhYmxlOwotCQkJCWVsc2UgaWYgKElkZW50aWZpYWJsZUNvbXBhcmF0b3IuaW5zdGFuY2UuY29tcGFyZSh0ZW1wSWRlbnRpZmlhYmxlLCB0b3BQcmlvcml0eUlkZW50aWZpYWJsZSkgPT0gSWRlbnRpZmlhYmxlQ29tcGFyYXRvci5HUkVBVEVSX1RIQU4pCi0JCQkJCXRvcFByaW9yaXR5SWRlbnRpZmlhYmxlID0gdGVtcElkZW50aWZpYWJsZTsKLQkJCX0KLQkJfQotCQlpZiAodG9wUHJpb3JpdHlJZGVudGlmaWFibGUgPT0gbnVsbCkKLQkJCXJldHVybiBkZWZhdWx0SUQ7Ci0JCXJldHVybiB0b3BQcmlvcml0eUlkZW50aWZpYWJsZS5nZXRJRCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9EZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRGVzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzIwODU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9EZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgYmxhbmNldHQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERlc2NlbmRpbmdHcm91cENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIERlc2NlbmRpbmdHcm91cENvbXBhcmF0b3Igc2luZ2xldG9uOwotCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCWlmIChvMSA9PSBudWxsICYmIG8yICE9IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChvMiA9PSBudWxsICYmIG8xICE9IG51bGwpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKG8xID09IG51bGwgJiYgbzIgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCi0JCUZ1bmN0aW9uR3JvdXAgZ3JvdXAxID0gKEZ1bmN0aW9uR3JvdXApIG8xOwotCQlGdW5jdGlvbkdyb3VwIGdyb3VwMiA9IChGdW5jdGlvbkdyb3VwKSBvMjsKLQotCQlpZiAoZ3JvdXAxLmdldFByaW9yaXR5KCkgPiBncm91cDIuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKGdyb3VwMS5nZXRQcmlvcml0eSgpID09IGdyb3VwMi5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChncm91cDEuZ2V0UHJpb3JpdHkoKSA8IGdyb3VwMi5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIDE7Ci0JCXJldHVybiAwOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIHNpbmdsZXRvbigpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQkJc2luZ2xldG9uID0gbmV3IERlc2NlbmRpbmdHcm91cENvbXBhcmF0b3IoKTsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50SWRlbnRpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZGJiZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVuYWJsZW1lbnRJZGVudGlmaWVyIGltcGxlbWVudHMgSUVuYWJsZW1lbnRJZGVudGlmaWVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBIQVNIX0ZBQ1RPUiA9IDg5OwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEhBU0hfSU5JVElBTCA9IEVuYWJsZW1lbnRJZGVudGlmaWVyLmNsYXNzLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU2V0IHN0cm9uZ1JlZmVyZW5jZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJpdmF0ZSBTZXQgZnVuY3Rpb25Hcm91cElkczsKLQotCXByaXZhdGUgdHJhbnNpZW50IFN0cmluZ1tdIGZ1bmN0aW9uR3JvdXBJZHNBc0FycmF5OwotCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQ7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBpbnQgaGFzaENvZGU7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGhhc2hDb2RlQ29tcHV0ZWQ7Ci0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCXByaXZhdGUgTGlzdCBpZGVudGlmaWVyTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIHN0cmluZzsKLQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCXByb3RlY3RlZCBFbmFibGVtZW50SWRlbnRpZmllcihTdHJpbmcgaWQpIHsKLQkJdGhpcyhpZCwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVuYWJsZW1lbnRJZGVudGlmaWVyKFN0cmluZyBpZCwgSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSWRlbnRpZmllckxpc3RlbmVyKElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIGlkZW50aWZpZXJMaXN0ZW5lcikgewotCQlpZiAoaWRlbnRpZmllckxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlpZiAoaWRlbnRpZmllckxpc3RlbmVycyA9PSBudWxsKQotCQkJaWRlbnRpZmllckxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoIWlkZW50aWZpZXJMaXN0ZW5lcnMuY29udGFpbnMoaWRlbnRpZmllckxpc3RlbmVyKSkKLQkJCWlkZW50aWZpZXJMaXN0ZW5lcnMuYWRkKGlkZW50aWZpZXJMaXN0ZW5lcik7Ci0KLQkJc3Ryb25nUmVmZXJlbmNlcy5hZGQodGhpcyk7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG9iamVjdCkgewotCQlFbmFibGVtZW50SWRlbnRpZmllciBjYXN0ZWRPYmplY3QgPSAoRW5hYmxlbWVudElkZW50aWZpZXIpIG9iamVjdDsKLQkJcmV0dXJuIFV0aWwuY29tcGFyZShpZCwgY2FzdGVkT2JqZWN0LmlkKTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEVuYWJsZW1lbnRJZGVudGlmaWVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlFbmFibGVtZW50SWRlbnRpZmllciBjYXN0ZWRPYmplY3QgPSAoRW5hYmxlbWVudElkZW50aWZpZXIpIG9iamVjdDsKLQkJYm9vbGVhbiBlcXVhbHMgPSBVdGlsLmVxdWFscyhpZCwgY2FzdGVkT2JqZWN0LmlkKTsKLQkJcmV0dXJuIGVxdWFsczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSWRlbnRpZmllckNoYW5nZWQoRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCBmdW5jdGlvbklkZW50aWZpZXJFdmVudCkgewotCQlpZiAoZnVuY3Rpb25JZGVudGlmaWVyRXZlbnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCWlmIChpZGVudGlmaWVyTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoaWRlbnRpZmllckxpc3RlbmVycykgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWRlbnRpZmllckxpc3RlbmVycy5zaXplKCk7IGkrKykKLQkJCQkJKChJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lcikgaWRlbnRpZmllckxpc3RlbmVycy5nZXQoaSkpLmlkZW50aWZpZXJDaGFuZ2VkKGZ1bmN0aW9uSWRlbnRpZmllckV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTZXQgZ2V0RnVuY3Rpb25Hcm91cElkcygpIHsKLQkJcmV0dXJuIGZ1bmN0aW9uR3JvdXBJZHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWlmICghaGFzaENvZGVDb21wdXRlZCkgewotCQkJaGFzaENvZGUgPSBIQVNIX0lOSVRJQUw7Ci0JCQloYXNoQ29kZSA9IGhhc2hDb2RlICogSEFTSF9GQUNUT1IgKyBVdGlsLmhhc2hDb2RlKGlkKTsKLQkJCWhhc2hDb2RlQ29tcHV0ZWQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGhhc2hDb2RlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSWRlbnRpZmllckxpc3RlbmVyKElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIGlkZW50aWZpZXJMaXN0ZW5lcikgewotCQlpZiAoaWRlbnRpZmllckxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlpZiAoaWRlbnRpZmllckxpc3RlbmVycyAhPSBudWxsKQotCQkJaWRlbnRpZmllckxpc3RlbmVycy5yZW1vdmUoaWRlbnRpZmllckxpc3RlbmVyKTsKLQotCQlpZiAoaWRlbnRpZmllckxpc3RlbmVycy5pc0VtcHR5KCkpCi0JCQlzdHJvbmdSZWZlcmVuY2VzLnJlbW92ZSh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRGdW5jdGlvbkdyb3VwSWRzKFNldCBmdW5jdGlvbkdyb3VwSWRzKSB7Ci0JCWZ1bmN0aW9uR3JvdXBJZHMgPSBVdGlsLnNhZmVDb3B5KGZ1bmN0aW9uR3JvdXBJZHMsIFN0cmluZy5jbGFzcyk7Ci0KLQkJaWYgKCFVdGlsLmVxdWFscyhmdW5jdGlvbkdyb3VwSWRzLCB0aGlzLmZ1bmN0aW9uR3JvdXBJZHMpKSB7Ci0JCQl0aGlzLmZ1bmN0aW9uR3JvdXBJZHMgPSBmdW5jdGlvbkdyb3VwSWRzOwotCQkJdGhpcy5mdW5jdGlvbkdyb3VwSWRzQXNBcnJheSA9IChTdHJpbmdbXSkgdGhpcy5mdW5jdGlvbkdyb3VwSWRzLnRvQXJyYXkobmV3IFN0cmluZ1t0aGlzLmZ1bmN0aW9uR3JvdXBJZHMuc2l6ZSgpXSk7Ci0KLQkJCWhhc2hDb2RlQ29tcHV0ZWQgPSBmYWxzZTsKLQkJCWhhc2hDb2RlID0gMDsKLQkJCXN0cmluZyA9IG51bGw7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAoZW5hYmxlZCAhPSB0aGlzLmVuYWJsZWQpIHsKLQkJCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JCQloYXNoQ29kZUNvbXB1dGVkID0gZmFsc2U7Ci0JCQloYXNoQ29kZSA9IDA7Ci0JCQlzdHJpbmcgPSBudWxsOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVjb21wdXRlIHRoZSBlbmFibGVkIHN0YXRlIGFuZCByZXR1cm4gd2hldGhlciB0aGUgc3RhdGUgY2hhbmdlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc2V0RW5hYmxlZCgpIHsKLQkJcmV0dXJuIHNldEVuYWJsZWQoZ2V0TmV3RW5hYmxlZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXROZXdFbmFibGVkKCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmdW5jdGlvbkdyb3VwSWRzQXNBcnJheS5sZW5ndGggPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uR3JvdXBJZHNBc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlGdW5jdGlvbkdyb3VwIGdyb3VwID0gRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0R3JvdXBCeUlEKGZ1bmN0aW9uR3JvdXBJZHNBc0FycmF5W2ldKTsKLQkJCWlmIChncm91cCAhPSBudWxsICYmIGdyb3VwLmlzRW5hYmxlZChwcm9qZWN0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnWycpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmdW5jdGlvbkdyb3VwSWRzKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJywnKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZW5hYmxlZCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGlkKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJ10nKTsKLQkJCXN0cmluZyA9IHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYXNzb2NpYXRlZCBQcm9qZWN0IG1heSBiZSBudWxsCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlGdW5jdGlvbkdyb3VwSWQoKSB7Ci0JCWludCBzZWxlY3RlZFByaW9yaXR5ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCWludCBwcmlvcml0eSA9IDA7Ci0JCVN0cmluZyBzZWxlY3RlZEZ1bmN0aW9uR3JvdXBJZCA9IG51bGw7Ci0JCVN0cmluZyBmdW5jdGlvbkdyb3VwSWQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RnVuY3Rpb25Hcm91cElkcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCWZ1bmN0aW9uR3JvdXBJZCA9IGl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpOwotCQkJcHJpb3JpdHkgPSBGdW5jdGlvbkdyb3VwUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRHcm91cFByaW9yaXR5KGZ1bmN0aW9uR3JvdXBJZCk7Ci0JCQlpZiAocHJpb3JpdHkgPCBzZWxlY3RlZFByaW9yaXR5KQotCQkJCXNlbGVjdGVkRnVuY3Rpb25Hcm91cElkID0gZnVuY3Rpb25Hcm91cElkOwotCQkJaWYgKHByaW9yaXR5ID09IDApCi0JCQkJcmV0dXJuIHNlbGVjdGVkRnVuY3Rpb25Hcm91cElkOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZEZ1bmN0aW9uR3JvdXBJZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50SWRlbnRpZmllckV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudElkZW50aWZpZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTBiMTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50SWRlbnRpZmllckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEwLCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IHsKLQotCXByaXZhdGUgYm9vbGVhbiBmdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZDsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZENoYW5nZWQ7Ci0JcHJpdmF0ZSBJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcjsKLQotCXB1YmxpYyBFbmFibGVtZW50SWRlbnRpZmllckV2ZW50KElFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyLCBib29sZWFuIGZ1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkLCBib29sZWFuIGVuYWJsZWRDaGFuZ2VkKSB7Ci0JCWlmIChpZGVudGlmaWVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQl0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwotCQl0aGlzLmZ1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkID0gZnVuY3Rpb25Hcm91cElkc0NoYW5nZWQ7Ci0JCXRoaXMuZW5hYmxlZENoYW5nZWQgPSBlbmFibGVkQ2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgY2hhbmdlZC4gR3VhcmFudGVlZCBub3QgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIElFbmFibGVtZW50SWRlbnRpZmllciBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gaWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBmdW5jdGlvbkdyb3VwSWRzIHByb3BlcnR5IGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlLCBpZmYgdGhlIGZ1bmN0aW9uR3JvdXBJZHMgcHJvcGVydHkgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIGZ1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGVuYWJsZWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUsIGlmZiB0aGUgZW5hYmxlZCBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VuYWJsZWRDaGFuZ2VkKCkgewotCQlyZXR1cm4gZW5hYmxlZENoYW5nZWQ7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCBbaWRlbnRpZmllcj0iICsgaWRlbnRpZmllci50b1N0cmluZygpICsgIiwgZnVuY3Rpb25Hcm91cElkc0NoYW5nZWQ9IiArIGhhc0Z1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkKCkgKyAiLCBlbmFibGVkQ2hhbmdlZD0iICsgaGFzRW5hYmxlZENoYW5nZWQoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNGI1ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAzLCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLQotICogSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVtZW50TWFuYWdlciBpbXBsZW1lbnRzIElFbmFibGVtZW50TWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbmFibGVtZW50TWFuYWdlciBJTlNUQU5DRSA9IG5ldyBFbmFibGVtZW50TWFuYWdlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGlkZW50aWZpZXJzQnlQcm9qZWN0ID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgRW5hYmxlbWVudE1hbmFnZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIE1hcCBpbiB3aGljaCB0aGUga2V5cyBhcmUgaWRzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgaWRlbnRpZmllcnMKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldElkZW50aWZpZXJzQnlJZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCU1hcCBhTWFwID0gKE1hcCkgaWRlbnRpZmllcnNCeVByb2plY3QuZ2V0KHByb2plY3QpOwotCQlpZiAoYU1hcCA9PSBudWxsKSB7Ci0JCQlhTWFwID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0JCQlpZGVudGlmaWVyc0J5UHJvamVjdC5wdXQocHJvamVjdCwgYU1hcCk7Ci0JCX0KLQkJcmV0dXJuIGFNYXA7Ci0JfQotCi0gICAgcHVibGljIElFbmFibGVtZW50SWRlbnRpZmllciBnZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVySWQsIElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgaWYgKGlkZW50aWZpZXJJZCA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgcHJvamVjdCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBpZGVudGlmaWVyUmVxdWlyZXNVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLQkgICAgICAgIE1hcCBpZGVudGlmaWVyc0J5SWQgPSBnZXRJZGVudGlmaWVyc0J5SWQocHJvamVjdCk7CQotCSAgICAgICAgaWRlbnRpZmllciA9IChFbmFibGVtZW50SWRlbnRpZmllcikgaWRlbnRpZmllcnNCeUlkLmdldChpZGVudGlmaWVySWQpOwotCSAgICAgICAgaWYoaWRlbnRpZmllciA9PSBudWxsKXsKLQkgICAgICAgIAlpZGVudGlmaWVyUmVxdWlyZXNVcGRhdGUgPSB0cnVlOwotCSAgICAgICAgCWlkZW50aWZpZXIgPSBjcmVhdGVJZGVudGlmaWVyKGlkZW50aWZpZXJJZCwgcHJvamVjdCk7Ci0JICAgICAgICAgICAgaWRlbnRpZmllcnNCeUlkLnB1dChpZGVudGlmaWVySWQsIGlkZW50aWZpZXIpOwotCSAgICAgICAgfQotCSAgICB9Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQgKGlkZW50aWZpZXIpewotICAgICAgICAJaWYoaWRlbnRpZmllclJlcXVpcmVzVXBkYXRlKXsKLSAgICAgICAgICAgICAgICB1cGRhdGVJZGVudGlmaWVyKGlkZW50aWZpZXIpOwotICAgICAgICAJfQotICAgICAgICAJcmV0dXJuIGlkZW50aWZpZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcm90ZWN0ZWQgRW5hYmxlbWVudElkZW50aWZpZXIgY3JlYXRlSWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcklkLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgRW5hYmxlbWVudElkZW50aWZpZXIoaWRlbnRpZmllcklkLCBwcm9qZWN0KTsKLQl9Ci0KLQlwcml2YXRlIEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgdXBkYXRlSWRlbnRpZmllcihFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyKSB7Ci0JCVN0cmluZyBpZCA9IGlkZW50aWZpZXIuZ2V0SWQoKTsKLQkJU2V0IGZ1bmN0aW9uR3JvdXBJZHMgPSBuZXcgSGFzaFNldCgpOwotCi0JCUxpc3QgZ3JvdXBzID0gRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0S25vd25Hcm91cHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGdyb3Vwcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlGdW5jdGlvbkdyb3VwIGdyb3VwID0gKEZ1bmN0aW9uR3JvdXApIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJaWYgKGdyb3VwLmlzTWF0Y2goaWQpKQotCQkJCWZ1bmN0aW9uR3JvdXBJZHMuYWRkKGdyb3VwLmdldEdyb3VwSUQoKSk7Ci0JCX0KLQotCQlib29sZWFuIGZ1bmN0aW9uR3JvdXBzQ2hhbmdlZCA9IGlkZW50aWZpZXIuc2V0RnVuY3Rpb25Hcm91cElkcyhmdW5jdGlvbkdyb3VwSWRzKTsKLQkJYm9vbGVhbiBlbmFibGVkQ2hhbmdlZCA9IGlkZW50aWZpZXIucmVzZXRFbmFibGVkKCk7Ci0KLQkJaWYgKGZ1bmN0aW9uR3JvdXBzQ2hhbmdlZCB8fCBlbmFibGVkQ2hhbmdlZCkKLQkJCXJldHVybiBuZXcgRW5hYmxlbWVudElkZW50aWZpZXJFdmVudChpZGVudGlmaWVyLCBmdW5jdGlvbkdyb3Vwc0NoYW5nZWQsIGVuYWJsZWRDaGFuZ2VkKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBpZGVudGlmaWVyIGxpc3RlbmVycyB0aGF0IHRoZSBzdGF0ZSBvZiBhIHByb2plY3QgaGFzIGNoYW5nZWQgdGhhdCBhZmZlY3RzIHRoZQotCSAqIGVuYWJsZW1lbnQgb2YgYSBncm91cCBmb3IgYSBwcm9qZWN0LiBUaGlzIG1ldGhvZCBpcyBmYWlsIHNhZmUsIGluIHRoYXQgaWYgb25lIGxpc3RlbmVyIHRocm93cwotCSAqIGFuIGV4Y2VwdGlvbiB3aGlsZSBiZWluZyBub3RpZmllZCwgaXQgd2lsbCBub3Qgc3RvcCB0aGUgbm90aWZpY2F0aW9uIG9mIG90aGVyIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gZXZ0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgZXhjZXB0aW9ucyB3ZXJlIGNhdWdodCBub3RpZnlpbmcgYW55IG9mIHRoZSBsaXN0ZW5lcnMuIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlCi0JICogICAgICAgICAgICAgY29yZSBleGNlcHRpb24gZm9yIHRoZSBuZXN0ZWQgZXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBub3RpZnlGdW5jdGlvbkdyb3VwQ2hhbmdlZChTdHJpbmcgZ3JvdXBJRCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCU1hcCBpZGVudGlmaWVycyA9IGdldElkZW50aWZpZXJzQnlJZChwcm9qZWN0KTsKLQotCQlpZiAoaWRlbnRpZmllcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlciA9IGlkZW50aWZpZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUlTdGF0dXMgZXJyb3JTdGF0dXMgPSBudWxsOwotCQlJU3RhdHVzIG5leHRTdGF0dXMgPSBudWxsOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJaWRlbnRpZmllciA9IChFbmFibGVtZW50SWRlbnRpZmllcikgaXRlci5uZXh0KCk7Ci0KLQkJCUVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgZXZ0ID0gdXBkYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGV2dCAhPSBudWxsKQotCQkJCQlpZGVudGlmaWVyLmZpcmVJZGVudGlmaWVyQ2hhbmdlZChldnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy9EZWZlciB0aGUgZXhjZXB0aW9uIHNvIG90aGVycyBjYW4gaGFuZGxlIGl0LgotCQkJCW5leHRTdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uTWVzc2FnZXMuSU5URVJOQUxfRVJST1IsIGV4KTsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCWlmIChlcnJvclN0YXR1cyA9PSBudWxsKQotCQkJCQllcnJvclN0YXR1cyA9IG5leHRTdGF0dXM7Ci0JCQkJZWxzZSBpZiAoZXJyb3JTdGF0dXMuaXNNdWx0aVN0YXR1cygpKQotCQkJCQkoKE11bHRpU3RhdHVzKSBlcnJvclN0YXR1cykuYWRkKG5leHRTdGF0dXMpOwotCQkJCWVsc2UgewotCQkJCQlJU3RhdHVzW10gY2hpbGRyZW4gPSB7ZXJyb3JTdGF0dXMsIG5leHRTdGF0dXN9OwotCQkJCQllcnJvclN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhlcnJvclN0YXR1cy5nZXRQbHVnaW4oKSwgZXJyb3JTdGF0dXMuZ2V0Q29kZSgpLCBjaGlsZHJlbiwgV1RQQ29tbW9uTWVzc2FnZXMuSU5URVJOQUxfRVJST1IsIG51bGwpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWlmIChlcnJvclN0YXR1cyAhPSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oZXJyb3JTdGF0dXMpOwotCi0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgZm9yIGNsaWVudHMgdG8gZGlzcG9zZSBvZiBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlbWVudElkZW50aWZpZXJzCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lcihDb2xsZWN0aW9uIGVuYWJsZW1lbnRJZGVudGlmaWVycywgSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGVuYWJsZW1lbnRJZGVudGlmaWVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gKElFbmFibGVtZW50SWRlbnRpZmllcikgaXRlci5uZXh0KCk7Ci0JCQlpZGVudGlmaWVyLnJlbW92ZUlkZW50aWZpZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9GdW5jdGlvbkdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4MjU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9GdW5jdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUmVzb3VyY2VIYW5kbGVyOwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyL2JsYW5jZXR0Ci0gKi8KLXB1YmxpYyBjbGFzcyBGdW5jdGlvbkdyb3VwIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9OQU1FX0FUVFIgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9ERVNDX0FUVFIgPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfRU5BQkxFRF9CWV9ERUZBVUxUX0FUVFIgPSAiZW5hYmxlZEJ5RGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9QUklPUklUWV9BVFRSID0gInByaW9yaXR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0lOVElBTElaRVJfQ0xBU1NfQVRUUiA9ICJpbml0aWFsaXplckNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVfUFJJT1JJVFkgPSAtMTsKLQotCXByaXZhdGUgU3RyaW5nIGdyb3VwSUQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIFN0cmluZyBpbnRpYWxpemVyQ2xhc3NOYW1lOwotCXByaXZhdGUgU3RyaW5nIGRlY2xhcmluZ0V4dGVuc2lvbjsKLQlwcml2YXRlIGludCBwcmlvcml0eSA9IE5FR0FUSVZFX1BSSU9SSVRZOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBJR3JvdXBJbml0aWFsaXplciBncm91cEludGVyZmFjZTsKLQlwcml2YXRlIFNldCBmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzOwotLy8JcHJpdmF0ZSB0cmFuc2llbnQgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nW10gZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nc0FzQXJyYXk7Ci0JcHJpdmF0ZSBib29sZWFuIGVycm9yUmVwb3J0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBGdW5jdGlvbkdyb3VwKFN0cmluZyBncm91cElELCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmdyb3VwSUQgPSBncm91cElEOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJZGVzY3JpcHRpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShHUk9VUF9ERVNDX0FUVFIpOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JU3RyaW5nIGdldEluaXRhbGl6ZXJDbGFzc05hbWUoKSB7Ci0JCWlmIChpbnRpYWxpemVyQ2xhc3NOYW1lID09IG51bGwpCi0JCQlpbnRpYWxpemVyQ2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfSU5USUFMSVpFUl9DTEFTU19BVFRSKTsKLQkJcmV0dXJuIGludGlhbGl6ZXJDbGFzc05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEdST1VQX05BTUVfQVRUUik7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlY2xhcmluZ0V4dGVuc2lvbk5hbWUoKSB7Ci0JCWlmIChkZWNsYXJpbmdFeHRlbnNpb24gPT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWRlY2xhcmluZ0V4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZGVjbGFyaW5nRXh0ZW5zaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBJRCgpIHsKLQkJcmV0dXJuIGdyb3VwSUQ7Ci0JfQotCi0JSUdyb3VwSW5pdGlhbGl6ZXIgZ2V0SW5pdGlhbGl6ZXJDbGFzcygpIHsKLQkJaWYgKGdyb3VwSW50ZXJmYWNlID09IG51bGwpCi0JCQl0cnkgewotCQkJCWdyb3VwSW50ZXJmYWNlID0gKElHcm91cEluaXRpYWxpemVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oR1JPVVBfSU5USUFMSVpFUl9DTEFTU19BVFRSKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyOSIsIG5ldyBPYmplY3RbXXtHUk9VUF9JTlRJQUxJWkVSX0NMQVNTX0FUVFIsIGdldEluaXRhbGl6ZXJDbGFzc05hbWUoKSwgZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uTmFtZSgpfSkgKyAiXHJcbiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJcmV0dXJuIGdyb3VwSW50ZXJmYWNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiXCIiICsgZ2V0TmFtZSgpICsgIlwiICgiICsgZ2V0R3JvdXBJRCgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0JCWlmIChwcmlvcml0eSA9PSBORUdBVElWRV9QUklPUklUWSkKLQkJCXByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShHUk9VUF9QUklPUklUWV9BVFRSKSk7Ci0JCXJldHVybiBwcmlvcml0eTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoZ2V0SW5pdGlhbGl6ZXJDbGFzcygpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZXJDbGFzcygpLmlzR3JvdXBFbmFibGVkKHByb2plY3QpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQlpZiAodGhpcy5lcXVhbHMobykpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZSBpZiAoIShvIGluc3RhbmNlb2YgRnVuY3Rpb25Hcm91cCkpCi0JCQlyZXR1cm4gMTsKLQotCQlGdW5jdGlvbkdyb3VwIGdyb3VwID0gKEZ1bmN0aW9uR3JvdXApIG87Ci0JCWlmIChnZXRQcmlvcml0eSgpID09IGdyb3VwLmdldFByaW9yaXR5KCkpCi0JCQlyZXR1cm4gZ2V0R3JvdXBJRCgpLmNvbXBhcmVUbyhncm91cC5nZXRHcm91cElEKCkpOwotCi0JCWVsc2UgaWYgKGdldFByaW9yaXR5KCkgPCBncm91cC5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIC0xOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MgPT0gbnVsbCkgewotCQkJaWYgKCFlcnJvclJlcG9ydGVkKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjMwIiwgbmV3IE9iamVjdFtde2dldEdyb3VwSUQoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVycm9yUmVwb3J0ZWQgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyBmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcgPSAoRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmIChmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcuZ2V0UGF0dGVybigpLm1hdGNoZXIoc3RyaW5nKS5tYXRjaGVzKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JYm9vbGVhbiBzZXRGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzKFNldCBmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzKSB7Ci0JCWZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MgPSBVdGlsLnNhZmVDb3B5KGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MsIEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZy5jbGFzcyk7Ci0KLQkJaWYgKCFVdGlsLmVxdWFscyhmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzLCB0aGlzLmZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MpKSB7Ci0JCQl0aGlzLmZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MgPSBmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzOwotLy8JCQl0aGlzLmZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3NBc0FycmF5ID0gKEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ1tdKSB0aGlzLmZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MudG9BcnJheShuZXcgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nW3RoaXMuZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncy5zaXplKCldKTsKLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODc3NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBIQVNIX0ZBQ1RPUiA9IDg5OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBIQVNIX0lOSVRJQUwgPSBGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcuY2xhc3MuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVuY3Rpb25Hcm91cElkOwotCXByaXZhdGUgdHJhbnNpZW50IGludCBoYXNoQ29kZTsKLQlwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGhhc2hDb2RlQ29tcHV0ZWQ7Ci0JcHJpdmF0ZSBQYXR0ZXJuIHBhdHRlcm47Ci0JcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIHN0cmluZzsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nKFN0cmluZyBmdW5jdGlvbkdyb3VwSWQsIFBhdHRlcm4gcGF0dGVybikgewotCQlpZiAocGF0dGVybiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJdGhpcy5mdW5jdGlvbkdyb3VwSWQgPSBmdW5jdGlvbkdyb3VwSWQ7Ci0JCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG9iamVjdCkgewotCQlGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcgY2FzdGVkT2JqZWN0ID0gKEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZykgb2JqZWN0OwotCQlpbnQgY29tcGFyZVRvID0gVXRpbC5jb21wYXJlKGZ1bmN0aW9uR3JvdXBJZCwgY2FzdGVkT2JqZWN0LmZ1bmN0aW9uR3JvdXBJZCk7Ci0KLQkJaWYgKGNvbXBhcmVUbyA9PSAwKQotCQkJY29tcGFyZVRvID0gVXRpbC5jb21wYXJlKHBhdHRlcm4ucGF0dGVybigpLCBjYXN0ZWRPYmplY3QucGF0dGVybi5wYXR0ZXJuKCkpOwotCi0JCXJldHVybiBjb21wYXJlVG87Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcgY2FzdGVkT2JqZWN0ID0gKEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZykgb2JqZWN0OwotCQlib29sZWFuIGVxdWFscyA9IHRydWU7Ci0JCWVxdWFscyAmPSBVdGlsLmVxdWFscyhmdW5jdGlvbkdyb3VwSWQsIGNhc3RlZE9iamVjdC5mdW5jdGlvbkdyb3VwSWQpOwotCQllcXVhbHMgJj0gVXRpbC5lcXVhbHMocGF0dGVybiwgY2FzdGVkT2JqZWN0LnBhdHRlcm4pOwotCQlyZXR1cm4gZXF1YWxzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlJZCgpIHsKLQkJcmV0dXJuIGZ1bmN0aW9uR3JvdXBJZDsKLQl9Ci0KLQlwdWJsaWMgUGF0dGVybiBnZXRQYXR0ZXJuKCkgewotCQlyZXR1cm4gcGF0dGVybjsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoIWhhc2hDb2RlQ29tcHV0ZWQpIHsKLQkJCWhhc2hDb2RlID0gSEFTSF9JTklUSUFMOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SICsgVXRpbC5oYXNoQ29kZShmdW5jdGlvbkdyb3VwSWQpOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SICsgVXRpbC5oYXNoQ29kZShwYXR0ZXJuKTsKLQkJCWhhc2hDb2RlQ29tcHV0ZWQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGhhc2hDb2RlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJ1snKS5hcHBlbmQoZnVuY3Rpb25Hcm91cElkKS5hcHBlbmQoIixwYXR0ZXJuPVwiIikuYXBwZW5kKHBhdHRlcm4ucGF0dGVybigpKS5hcHBlbmQoIlwiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXN0cmluZyA9IHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NmM5MmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXBSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBUaGUgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5IHdpbGwgY29uc3VtZSBDb25maWd1cmF0aW9uIGVsZW1lbnRzIGNvbmZvcm1pbmcgdG8gdGhlIEZ1bmN0aW9uR3JvdXAKLSAqIEV4dGVuc2lvbiBQb2ludCBzY2hlbWEuCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlci9ibGFuY2V0dAotICovCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5IElOU1RBTkNFID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0VMRU1FTlQgPSAiZnVuY3Rpb25Hcm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9JRF9BVFRSID0gImZ1bmN0aW9uR3JvdXBJRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVU5DVElPTl9HUk9VUF9QQVRURVJOX0JJTkRJTkdfRUxNVCA9ICJmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTl9BVFRSID0gInBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1hcCBncm91cE1hcEJ5SWQ7Ci0JcHJpdmF0ZSBMaXN0IGtub3duR3JvdXBzOwotCXByaXZhdGUgTWFwIHBhdHRlcm5CaW5kaW5nc0J5R3JvdXBJZDsKLQotCXByaXZhdGUgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5KCkgewotCQlzdXBlcihXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCBXVFBDb21tb25QbHVnaW4uR1JPVVBfUkVHSVNUUllfRVhURU5TSU9OX1BPSU5UKTsKLQkJcGF0dGVybkJpbmRpbmdzQnlHcm91cElkID0gbmV3IEhhc2hNYXAoKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5KCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIFJlYWQgYWxsIHRoZSBlbGVtZW50cyBmaXJzdCwgdGhlbiBzZXQgdGhlIHBhdHRlcm4gYmluZGluZ3Mgb24gdGhlIGZ1bmN0aW9uCi0JICogZ3JvdXBzCi0JICovCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkgewotCQlzdXBlci5yZWFkUmVnaXN0cnkoKTsKLQkJc2V0UGF0dGVybkJpbmRpbmdzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFBhdHRlcm5CaW5kaW5ncygpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHBhdHRlcm5CaW5kaW5nc0J5R3JvdXBJZC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBncm91cElkID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlTZXQgdmFsdWUgPSAoU2V0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJRnVuY3Rpb25Hcm91cCBhR3JvdXAgPSBnZXRHcm91cEJ5SUQoZ3JvdXBJZCk7Ci0JCQlpZiAoYUdyb3VwICE9IG51bGwpCi0JCQkJYUdyb3VwLnNldEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3ModmFsdWUpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEdST1VQX0VMRU1FTlQpKSB7Ci0JCQlyZWFkR3JvdXAoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRlVOQ1RJT05fR1JPVVBfUEFUVEVSTl9CSU5ESU5HX0VMTVQpKSB7Ci0JCQlyZWFkUGF0dGVybkJpbmRpbmcoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZFBhdHRlcm5CaW5kaW5nKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBncm91cElEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfSURfQVRUUik7Ci0JCVN0cmluZyBwYXR0ZXJuID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUEFUVEVSTl9BVFRSKTsKLQkJaWYgKCFpc051bGxPckVtcHR5KGdyb3VwSUQpICYmICFpc051bGxPckVtcHR5KHBhdHRlcm4pKSB7Ci0JCQlQYXR0ZXJuIGFQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm4pOwotCQkJRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIGJpbmRpbmcgPSBuZXcgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nKGdyb3VwSUQsIGFQYXR0ZXJuKTsKLQkJCWFkZFBhdHRlcm5CaW5kaW5nKGdyb3VwSUQsIGJpbmRpbmcpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmluZGluZwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQYXR0ZXJuQmluZGluZyhTdHJpbmcgZ3JvdXBJRCwgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIGJpbmRpbmcpIHsKLQkJU2V0IGJpbmRpbmdzID0gKFNldCkgcGF0dGVybkJpbmRpbmdzQnlHcm91cElkLmdldChncm91cElEKTsKLQkJaWYgKGJpbmRpbmdzID09IG51bGwpIHsKLQkJCWJpbmRpbmdzID0gbmV3IEhhc2hTZXQoKTsKLQkJCXBhdHRlcm5CaW5kaW5nc0J5R3JvdXBJZC5wdXQoZ3JvdXBJRCwgYmluZGluZ3MpOwotCQl9Ci0JCWJpbmRpbmdzLmFkZChiaW5kaW5nKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gYVN0cmluZyA9PSBudWxsIHx8IGFTdHJpbmcubGVuZ3RoKCkgPT0gMDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEdyb3VwKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBncm91cElEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfSURfQVRUUik7Ci0JCWlmICghaXNOdWxsT3JFbXB0eShncm91cElEKSkgewotCQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IG5ldyBGdW5jdGlvbkdyb3VwKGdyb3VwSUQsIGVsZW1lbnQpOwotCQkJZ2V0R3JvdXBNYXBCeUlkKCkucHV0KGdyb3VwSUQsIGdyb3VwKTsKLQkJCWdldEtub3duR3JvdXBzKCkuYWRkKGdyb3VwKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRBc2NlbmRpbmdTb3J0ZWRHcm91cHMoSVByb2plY3QgcHJvamVjdCkgewotCQlDb21wYXJhdG9yIGFzY2VuZGluZ0dycENvbXBhcmF0b3IgPSBBc2NlbmRpbmdHcm91cENvbXBhcmF0b3Iuc2luZ2xldG9uKCk7Ci0JCUxpc3QgZ3JvdXBMaXN0ID0gZ2V0S25vd25Hcm91cHMocHJvamVjdCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoZ3JvdXBMaXN0LCBhc2NlbmRpbmdHcnBDb21wYXJhdG9yKTsKLQkJcmV0dXJuIGdyb3VwTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0RGVzY2VuZGluZ1NvcnRlZEdyb3VwcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUNvbXBhcmF0b3IgZGVzY2VuZGluZ0dycENvbXBhcmF0b3IgPSBEZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yLnNpbmdsZXRvbigpOwotCQlMaXN0IGdyb3VwTGlzdCA9IGdldEtub3duR3JvdXBzKHByb2plY3QpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGdyb3VwTGlzdCwgZGVzY2VuZGluZ0dycENvbXBhcmF0b3IpOwotCQlyZXR1cm4gZ3JvdXBMaXN0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEtub3duR3JvdXBzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJyYXlMaXN0IGdyb3VwQnlQcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoZ2V0S25vd25Hcm91cHMoKS5zaXplKCkpOwotCQlMaXN0IGdyb3VwTGlzdCA9IGdldEtub3duR3JvdXBzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGdW5jdGlvbkdyb3VwIGdyb3VwID0gKEZ1bmN0aW9uR3JvdXApIGdyb3VwTGlzdC5nZXQoaSk7Ci0JCQlpZiAoZ3JvdXAuaXNFbmFibGVkKHByb2plY3QpKQotCQkJCWdyb3VwQnlQcm9qZWN0TGlzdC5hZGQoZ3JvdXApOwotCQl9Ci0JCXJldHVybiBncm91cEJ5UHJvamVjdExpc3Q7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXNjZW5kaW5nUHJpb3JpdHlHcm91cE5hbWVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCBzb3J0ZWRHcm91cCA9IGdldEFzY2VuZGluZ1NvcnRlZEdyb3Vwcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGdldEdyb3VwTGlzdE5hbWVzKHNvcnRlZEdyb3VwLCBuZXcgQXJyYXlMaXN0KHNvcnRlZEdyb3VwLnNpemUoKSkpOwotCi0JfQotCi0JcHVibGljIExpc3QgZ2V0RGVzY2VuZGluZ1ByaW9yaXR5R3JvdXBOYW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3Qgc29ydGVkR3JvdXAgPSBnZXREZXNjZW5kaW5nU29ydGVkR3JvdXBzKHByb2plY3QpOwotCQlyZXR1cm4gZ2V0R3JvdXBMaXN0TmFtZXMoc29ydGVkR3JvdXAsIG5ldyBBcnJheUxpc3Qoc29ydGVkR3JvdXAuc2l6ZSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEdyb3VwTGlzdE5hbWVzKExpc3Qgc29ydGVkR3JvdXAsIExpc3Qgc29ydGVkR3JvdXBOYW1lcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvcnRlZEdyb3VwLnNpemUoKTsgaSsrKSB7Ci0JCQlGdW5jdGlvbkdyb3VwIGdycCA9IChGdW5jdGlvbkdyb3VwKSBzb3J0ZWRHcm91cC5nZXQoaSk7Ci0JCQlzb3J0ZWRHcm91cE5hbWVzLmFkZChncnAuZ2V0R3JvdXBJRCgpKTsKLQkJfQotCQlyZXR1cm4gc29ydGVkR3JvdXBOYW1lczsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0R3JvdXBJRHMoKSB7Ci0JCXJldHVybiBnZXRHcm91cE1hcEJ5SWQoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBGdW5jdGlvbkdyb3VwIGdldEdyb3VwQnlJRChTdHJpbmcgZ3JvdXBJRCkgewotCQlyZXR1cm4gKEZ1bmN0aW9uR3JvdXApIGdldEdyb3VwTWFwQnlJZCgpLmdldChncm91cElEKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dyb3VwRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZ3JvdXBJRCkgewotCQlGdW5jdGlvbkdyb3VwIGdyb3VwID0gZ2V0R3JvdXBCeUlEKGdyb3VwSUQpOwotCQlpZiAoZ3JvdXAgIT0gbnVsbCkKLQkJCXJldHVybiBncm91cC5pc0VuYWJsZWQocHJvamVjdCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRLbm93bkdyb3VwcygpIHsKLQkJaWYgKGtub3duR3JvdXBzID09IG51bGwpCi0JCQlrbm93bkdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGtub3duR3JvdXBzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZ3JvdXBNYXBCeUlkLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0R3JvdXBNYXBCeUlkKCkgewotCQlpZiAoZ3JvdXBNYXBCeUlkID09IG51bGwpCi0JCQlncm91cE1hcEJ5SWQgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZ3JvdXBNYXBCeUlkOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRoZSBwcmlvcml0eSBvZiB0aGUgdHdvIGdyb3VwcyByZWZlcmVuY2VkIGJ5Ci0JICogCi0JICogQGdyb3VwSUQxIGFuZAotCSAqIEBncm91cElEMgotCSAqIAotCSAqIEBwYXJhbSBncm91cElEMQotCSAqIEBwYXJhbSBncm91cElEMgotCSAqIEByZXR1cm4gMCBpZiB0aGUgdHdvIGdyb3VwcyBhcmUgZXF1YWwsIDEgaWYKLQkgKiBAZ3JvdXBJRDEgaGFzIGEgaGlnaGVyIHByZWNlZGVuY2UsIG90aGVyd2lzZSAtMQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgZ3JvdXBJRDEsIFN0cmluZyBncm91cElEMikgewotCQlGdW5jdGlvbkdyb3VwIGdyb3VwMSA9IGdldEdyb3VwQnlJRChncm91cElEMSk7Ci0JCUZ1bmN0aW9uR3JvdXAgZ3JvdXAyID0gZ2V0R3JvdXBCeUlEKGdyb3VwSUQyKTsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyOCIsIG5ldyBPYmplY3RbXXtncm91cElEMX0pKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI4IiwgbmV3IE9iamVjdFtde2dyb3VwSUQyfSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlyZXR1cm4gZ3JvdXAxLmNvbXBhcmVUbyhncm91cDIpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0R3JvdXBQcmlvcml0eShTdHJpbmcgZ3JwSWQpIHsKLQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IGdldEdyb3VwQnlJRChncnBJZCk7Ci0JCXJldHVybiAoZ3JvdXAgIT0gbnVsbCkgPyBncm91cC5nZXRQcmlvcml0eSgpIDogLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRGdW5jdGlvblByaW9yaXR5KFN0cmluZyBlbmFibGVtZW50SUQpIHsKLQkJaW50IHByaW9yaXR5ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBnZXRLbm93bkdyb3VwcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IChGdW5jdGlvbkdyb3VwKSBpdGVyLm5leHQoKTsKLQkJCWlmIChncm91cC5pc01hdGNoKGVuYWJsZW1lbnRJRCkpCi0JCQkJcHJpb3JpdHkgPSBNYXRoLm1pbihwcmlvcml0eSwgZ3JvdXAuZ2V0UHJpb3JpdHkoKSk7Ci0JCX0KLQkJcmV0dXJuIHByaW9yaXR5OwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3M2Q4MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50SWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVuYWJsZW1lbnRJZGVudGlmaWVyIHsKLQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIGluc3RhbmNlIG9mIDxjb2RlPklJZGVudGlmaWVyTGlzdGVuZXI8L2NvZGU+IHRvIGxpc3RlbiBmb3IgY2hhbmdlcyB0bwotCSAqIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWRlbnRpZmllckxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2UgdG8gcmVnaXN0ZXIuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBJZiBhbiBhdHRlbXB0IGlzIG1hZGUKLQkgKiAgICAgICAgICAgIHRvIHJlZ2lzdGVyIGFuIGluc3RhbmNlIHdoaWNoIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgaW5zdGFuY2UsIG5vCi0JICogICAgICAgICAgICBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgotCSAqLwotCXZvaWQgYWRkSWRlbnRpZmllckxpc3RlbmVyKElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIGlkZW50aWZpZXJMaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZnVuY3Rpb24gZ3JvdXAgaWRzIHRoYXQgdGhpcyBpbnN0YW5jZSBtYXRjaGVzLgotCSAqIDxwPgotCSAqIE5vdGlmaWNhdGlvbiBpcyBzZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyBpZiB0aGlzIHByb3BlcnR5IGNoYW5nZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBvZiBhY3Rpdml0eSBpZHMgdGhhdCB0aGlzIGluc3RhbmNlIG1hdGNoZXMuIFRoaXMgc2V0IG1heSBiZSBlbXB0eSwgYnV0IGlzCi0JICogICAgICAgICBndWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBzZXQgaXMgbm90IGVtcHR5LCBpdCBpcyBndWFyYW50ZWVkCi0JICogICAgICAgICB0byBvbmx5IGNvbnRhaW4gaW5zdGFuY2VzIG9mIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICovCi0JU2V0IGdldEZ1bmN0aW9uR3JvdXBJZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgaW5zdGFuY2UuIEd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIGluc3RhbmNlIGlzIGVuYWJsZWQuCi0JICogPHA+Ci0JICogTm90aWZpY2F0aW9uIGlzIHNlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzIGlmIHRoaXMgcHJvcGVydHkgY2hhbmdlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0cnVlLCBpZmYgdGhpcyBpbnN0YW5jZSBpcyBlbmFibGVkLgotCSAqLwotCWJvb2xlYW4gaXNFbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBVbnJlZ2lzdGVycyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lcjwvY29kZT4gbGlzdGVuaW5nIGZvciBjaGFuZ2VzCi0JICogdG8gcHJvcGVydGllcyBvZiB0aGlzIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBpZGVudGlmaWVyTGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBpbnN0YW5jZSB0byB1bnJlZ2lzdGVyLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSWYgYW4gYXR0ZW1wdCBpcwotCSAqICAgICAgICAgICAgbWFkZSB0byB1bnJlZ2lzdGVyIGFuIGluc3RhbmNlIHdoaWNoIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGluc3RhbmNlLAotCSAqICAgICAgICAgICAgbm8gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KLQkgKi8KLQl2b2lkIHJlbW92ZUlkZW50aWZpZXJMaXN0ZW5lcihJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciBpZGVudGlmaWVyTGlzdGVuZXIpOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwY2Y5MzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEwLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIHsKLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IG9uZSBvciBtb3JlIHByb3BlcnRpZXMgb2YgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SUlkZW50aWZpZXI8L2NvZGU+IGhhdmUKLQkgKiBjaGFuZ2VkLiBTcGVjaWZpYyBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4gdGhlIDxjb2RlPklkZW50aWZpZXJFdmVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGlkZW50aWZpZXJFdmVudAotCSAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZXZlbnQuIEd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXZvaWQgaWRlbnRpZmllckNoYW5nZWQoRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCBpZGVudGlmaWVyRXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTRjOTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVuYWJsZW1lbnRNYW5hZ2VyIHsKLQlTdHJpbmcgSU5URVJOQUxfRU5BQkxFTUVOVF9ERVRFUk1JTkFUSU9OX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5FbmFibGVtZW50RGV0ZXJtaW5hdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCUlFbmFibGVtZW50TWFuYWdlciBJTlNUQU5DRSA9IChJRW5hYmxlbWVudE1hbmFnZXIpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoSU5URVJOQUxfRU5BQkxFTUVOVF9ERVRFUk1JTkFUSU9OX0lEKTsKLQotCUlFbmFibGVtZW50SWRlbnRpZmllciBnZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVySWQsIElQcm9qZWN0IHByb2plY3QpOwotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBpZGVudGlmaWVyIGxpc3RlbmVycyB0aGF0IHRoZSBzdGF0ZSBvZiBhIHByb2plY3QgaGFzIGNoYW5nZWQgdGhhdCBhZmZlY3RzIHRoZQotCSAqIGVuYWJsZW1lbnQgb2YgYSBncm91cCBmb3IgYSBwcm9qZWN0LiBUaGlzIG1ldGhvZCBpcyBmYWlsIHNhZmUsIGluIHRoYXQgaWYgb25lIGxpc3RlbmVyIHRocm93cwotCSAqIGFuIGV4Y2VwdGlvbiB3aGlsZSBiZWluZyBub3RpZmllZCwgaXQgd2lsbCBub3Qgc3RvcCB0aGUgbm90aWZpY2F0aW9uIG9mIG90aGVyIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gZXZ0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgZXhjZXB0aW9ucyB3ZXJlIGNhdWdodCBub3RpZnlpbmcgYW55IG9mIHRoZSBsaXN0ZW5lcnMuIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlCi0JICogICAgICAgICAgICAgY29yZSBleGNlcHRpb24gZm9yIHRoZSBuZXN0ZWQgZXhjZXB0aW9ucy4KLQkgKi8KLQl2b2lkIG5vdGlmeUZ1bmN0aW9uR3JvdXBDaGFuZ2VkKFN0cmluZyBncm91cElELCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIGZvciBjbGllbnRzIHRvIGRpc3Bvc2Ugb2YgbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGVuYWJsZW1lbnRJZGVudGlmaWVycwotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lcihDb2xsZWN0aW9uIGVuYWJsZW1lbnRJZGVudGlmaWVycywgSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JR3JvdXBJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lHcm91cEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2RjOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lHcm91cEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0vKioKLSAqIEBhdXRob3IgYmxhbmNldHQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJR3JvdXBJbml0aWFsaXplciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dyb3VwRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lkZW50aWZpYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lkZW50aWZpYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM2NGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JZGVudGlmaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSWRlbnRpZmlhYmxlIHsKLQotCS8qKgotCSAqIHJldHVybiBpZCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBpbnN0YW5jZSBvZiBhbiBleHRlbnNpb24gcG9pbnQuIEl0IGlzIHVwIHRvIGVhY2gKLQkgKiBpbmRpdmlkdWFsIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlciB0byBkZWNpZGUgd2hhdCB0aGF0IG1pZ2h0IGJlIChlLmcuLCAiZWRpdG9ySUQiLCAicGFnZUlEIiwKLQkgKiBldGMuCi0JICovCi0JU3RyaW5nIGdldElEKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcmRlciB0aGUgSWRlbnRpZmlhYmxlIGVsZW1lbnQgd2FzIGxvYWRlZAotCSAqLwotCWludCBnZXRMb2FkT3JkZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JZGVudGlmaWFibGVDb21wYXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSWRlbnRpZmlhYmxlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGYyNmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JZGVudGlmaWFibGVDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlQ29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEdSRUFURVJfVEhBTiA9IDE7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBMRVNTX1RIQU4gPSAtMTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVRVUFMID0gMDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSWRlbnRpZmlhYmxlQ29tcGFyYXRvciBpbnN0YW5jZSA9IG5ldyBJZGVudGlmaWFibGVDb21wYXJhdG9yKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QUklPUklUWSA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBJZGVudGlmaWFibGVDb21wYXJhdG9yIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCUlkZW50aWZpYWJsZSBsdmFsdWUgPSBudWxsOwotCQlJZGVudGlmaWFibGUgcnZhbHVlID0gbnVsbDsKLQkJaWYgKG8xIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlKQotCQkJbHZhbHVlID0gKElkZW50aWZpYWJsZSkgbzE7Ci0JCWlmIChvMiBpbnN0YW5jZW9mIElkZW50aWZpYWJsZSkKLQkJCXJ2YWx1ZSA9IChJZGVudGlmaWFibGUpIG8yOwotCi0JCWlmIChydmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBHUkVBVEVSX1RIQU47Ci0JCWlmIChsdmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBMRVNTX1RIQU47Ci0KLQkJaWYgKChsdmFsdWUuZ2V0SUQoKSA9PSBudWxsICYmIHJ2YWx1ZS5nZXRJRCgpID09IG51bGwpIHx8IChnZXRQcmlvcml0eShsdmFsdWUpID09IGdldFByaW9yaXR5KHJ2YWx1ZSkpKQotCQkJcmV0dXJuIGNvbXBhcmVMb2FkT3JkZXIobHZhbHVlLCBydmFsdWUpOwotCQkvKiBSIC0gTCBpbXBsaWVzIDAgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgKi8KLQkJcmV0dXJuIGdldFByaW9yaXR5KGx2YWx1ZSkgLSBnZXRQcmlvcml0eShydmFsdWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIElkZW50aWZpYWJsZUNvbXBhcmF0b3I7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcGFyZUxvYWRPcmRlcihJZGVudGlmaWFibGUgbHZhbHVlLCBJZGVudGlmaWFibGUgcnZhbHVlKSB7Ci0JCS8qIFIgLSBMIGltcGxpZXMgMCBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eSAqLwotCQlyZXR1cm4gbHZhbHVlLmdldExvYWRPcmRlcigpIC0gcnZhbHVlLmdldExvYWRPcmRlcigpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSkgewotCQlpZiAoaWRlbnRpZmlhYmxlLmdldElEKCkgIT0gbnVsbCAmJiBpZGVudGlmaWFibGUuZ2V0SUQoKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RnVuY3Rpb25Qcmlvcml0eShpZGVudGlmaWFibGUuZ2V0SUQoKSk7Ci0JCXJldHVybiBERUZBVUxUX1BSSU9SSVRZOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDAyNzBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qCi0gKiBSZW5hbWUgdGhpcyBjbGFzcyB0byBFbmFibGVtZW50c1V0aWwKLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVXRpbCB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTb3J0ZWRNYXAgRU1QVFlfU09SVEVEX01BUCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZE1hcChuZXcgVHJlZU1hcCgpKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFNvcnRlZFNldCBFTVBUWV9TT1JURURfU0VUID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU29ydGVkU2V0KG5ldyBUcmVlU2V0KCkpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFpFUk9fTEVOR1RIX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0SW5zdGFuY2UoT2JqZWN0IG9iamVjdCwgQ2xhc3MgYykgewotCQlhc3NlcnRJbnN0YW5jZShvYmplY3QsIGMsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0SW5zdGFuY2UoT2JqZWN0IG9iamVjdCwgQ2xhc3MgYywgYm9vbGVhbiBhbGxvd051bGwpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsICYmIGFsbG93TnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCWVsc2UgaWYgKCFjLmlzSW5zdGFuY2Uob2JqZWN0KSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKGJvb2xlYW4gbGVmdCwgYm9vbGVhbiByaWdodCkgewotCQlyZXR1cm4gbGVmdCA9PSBmYWxzZSA/IChyaWdodCA9PSB0cnVlID8gLTEgOiAwKSA6IDE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShDb21wYXJhYmxlIGxlZnQsIENvbXBhcmFibGUgcmlnaHQpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGxlZnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZSBpZiAocmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQllbHNlCi0JCQlyZXR1cm4gbGVmdC5jb21wYXJlVG8ocmlnaHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoQ29tcGFyYWJsZVtdIGxlZnQsIENvbXBhcmFibGVbXSByaWdodCkgewotCQlpZiAobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZSBpZiAobGVmdCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQllbHNlIGlmIChyaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UgewotCQkJaW50IGwgPSBsZWZ0Lmxlbmd0aDsKLQkJCWludCByID0gcmlnaHQubGVuZ3RoOwotCi0JCQlpZiAobCAhPSByKQotCQkJCXJldHVybiBsIC0gcjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0JCQkJaW50IGNvbXBhcmVUbyA9IGNvbXBhcmUobGVmdFtpXSwgcmlnaHRbaV0pOwotCi0JCQkJaWYgKGNvbXBhcmVUbyAhPSAwKQotCQkJCQlyZXR1cm4gY29tcGFyZVRvOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQkJcmV0dXJuIGxlZnQgLSByaWdodDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKExpc3QgbGVmdCwgTGlzdCByaWdodCkgewotCQlpZiAobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZSBpZiAobGVmdCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQllbHNlIGlmIChyaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UgewotCQkJaW50IGwgPSBsZWZ0LnNpemUoKTsKLQkJCWludCByID0gcmlnaHQuc2l6ZSgpOwotCi0JCQlpZiAobCAhPSByKQotCQkJCXJldHVybiBsIC0gcjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0JCQkJaW50IGNvbXBhcmVUbyA9IGNvbXBhcmUoKENvbXBhcmFibGUpIGxlZnQuZ2V0KGkpLCAoQ29tcGFyYWJsZSkgcmlnaHQuZ2V0KGkpKTsKLQotCQkJCWlmIChjb21wYXJlVG8gIT0gMCkKLQkJCQkJcmV0dXJuIGNvbXBhcmVUbzsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpZmYoTWFwIGxlZnQsIE1hcCByaWdodCwgU2V0IGxlZnRPbmx5LCBTZXQgZGlmZmVyZW50LCBTZXQgcmlnaHRPbmx5KSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCB8fCBsZWZ0T25seSA9PSBudWxsIHx8IGRpZmZlcmVudCA9PSBudWxsIHx8IHJpZ2h0T25seSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsZWZ0LmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJaWYgKCFyaWdodC5jb250YWluc0tleShrZXkpKQotCQkJCWxlZnRPbmx5LmFkZChrZXkpOwotCQkJZWxzZSBpZiAoIVV0aWwuZXF1YWxzKGxlZnQuZ2V0KGtleSksIHJpZ2h0LmdldChrZXkpKSkKLQkJCQlkaWZmZXJlbnQuYWRkKGtleSk7Ci0JCX0KLQotCQlpdGVyYXRvciA9IHJpZ2h0LmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJaWYgKCFsZWZ0LmNvbnRhaW5zS2V5KGtleSkpCi0JCQkJcmlnaHRPbmx5LmFkZChrZXkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpZmYoU2V0IGxlZnQsIFNldCByaWdodCwgU2V0IGxlZnRPbmx5LCBTZXQgcmlnaHRPbmx5KSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCB8fCBsZWZ0T25seSA9PSBudWxsIHx8IHJpZ2h0T25seSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsZWZ0Lml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJaWYgKCFyaWdodC5jb250YWlucyhvYmplY3QpKQotCQkJCWxlZnRPbmx5LmFkZChvYmplY3QpOwotCQl9Ci0KLQkJaXRlcmF0b3IgPSByaWdodC5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmICghbGVmdC5jb250YWlucyhvYmplY3QpKQotCQkJCXJpZ2h0T25seS5hZGQob2JqZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmRzV2l0aChMaXN0IGxlZnQsIExpc3QgcmlnaHQsIGJvb2xlYW4gZXF1YWxzKSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGwgPSBsZWZ0LnNpemUoKTsKLQkJaW50IHIgPSByaWdodC5zaXplKCk7Ci0JCWlmIChyID4gbCB8fCAhZXF1YWxzICYmIHIgPT0gbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHI7IGkrKykKLQkJCWlmICghZXF1YWxzKGxlZnQuZ2V0KGwgLSBpIC0gMSksIHJpZ2h0LmdldChyIC0gaSAtIDEpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmRzV2l0aChPYmplY3RbXSBsZWZ0LCBPYmplY3RbXSByaWdodCwgYm9vbGVhbiBlcXVhbHMpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbCA9IGxlZnQubGVuZ3RoOwotCQlpbnQgciA9IHJpZ2h0Lmxlbmd0aDsKLQkJaWYgKHIgPiBsIHx8ICFlcXVhbHMgJiYgciA9PSBsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHI7IGkrKykKLQkJCWlmICghZXF1YWxzKGxlZnRbbCAtIGkgLSAxXSwgcmlnaHRbciAtIGkgLSAxXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGJvb2xlYW4gbGVmdCwgYm9vbGVhbiByaWdodCkgewotCQlyZXR1cm4gbGVmdCA9PSByaWdodDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQkJcmV0dXJuIGxlZnQgPT0gcmlnaHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCXJldHVybiBsZWZ0ID09IG51bGwgPyByaWdodCA9PSBudWxsIDogbGVmdC5lcXVhbHMocmlnaHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGJvb2xlYW4gYikgewotCQlyZXR1cm4gYiA/IEJvb2xlYW4uVFJVRS5oYXNoQ29kZSgpIDogQm9vbGVhbi5GQUxTRS5oYXNoQ29kZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGludCBpKSB7Ci0JCXJldHVybiBpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCAhPSBudWxsID8gb2JqZWN0Lmhhc2hDb2RlKCkgOiAwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzYWZlQ29weShMaXN0IGxpc3QsIENsYXNzIGMpIHsKLQkJcmV0dXJuIHNhZmVDb3B5KGxpc3QsIGMsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Qgc2FmZUNvcHkoTGlzdCBsaXN0LCBDbGFzcyBjLCBib29sZWFuIGFsbG93TnVsbEVsZW1lbnRzKSB7Ci0JCWlmIChsaXN0ID09IG51bGwgfHwgYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJbGlzdCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3IEFycmF5TGlzdChsaXN0KSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQlhc3NlcnRJbnN0YW5jZShpdGVyYXRvci5uZXh0KCksIGMsIGFsbG93TnVsbEVsZW1lbnRzKTsKLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1hcCBzYWZlQ29weShNYXAgbWFwLCBDbGFzcyBrZXlDbGFzcywgQ2xhc3MgdmFsdWVDbGFzcykgewotCQlyZXR1cm4gc2FmZUNvcHkobWFwLCBrZXlDbGFzcywgdmFsdWVDbGFzcywgZmFsc2UsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1hcCBzYWZlQ29weShNYXAgbWFwLCBDbGFzcyBrZXlDbGFzcywgQ2xhc3MgdmFsdWVDbGFzcywgYm9vbGVhbiBhbGxvd051bGxLZXlzLCBib29sZWFuIGFsbG93TnVsbFZhbHVlcykgewotCQlpZiAobWFwID09IG51bGwgfHwga2V5Q2xhc3MgPT0gbnVsbCB8fCB2YWx1ZUNsYXNzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQltYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobmV3IEhhc2hNYXAobWFwKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlhc3NlcnRJbnN0YW5jZShlbnRyeS5nZXRLZXkoKSwga2V5Q2xhc3MsIGFsbG93TnVsbEtleXMpOwotCQkJYXNzZXJ0SW5zdGFuY2UoZW50cnkuZ2V0VmFsdWUoKSwgdmFsdWVDbGFzcywgYWxsb3dOdWxsVmFsdWVzKTsKLQkJfQotCi0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTZXQgc2FmZUNvcHkoU2V0IHNldCwgQ2xhc3MgYykgewotCQlyZXR1cm4gc2FmZUNvcHkoc2V0LCBjLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTZXQgc2FmZUNvcHkoU2V0IHNldCwgQ2xhc3MgYywgYm9vbGVhbiBhbGxvd051bGxFbGVtZW50cykgewotCQlpZiAoc2V0ID09IG51bGwgfHwgYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJc2V0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0KHNldCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQlhc3NlcnRJbnN0YW5jZShpdGVyYXRvci5uZXh0KCksIGMsIGFsbG93TnVsbEVsZW1lbnRzKTsKLQotCQlyZXR1cm4gc2V0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIHNhZmVDb3B5KFNvcnRlZE1hcCBzb3J0ZWRNYXAsIENsYXNzIGtleUNsYXNzLCBDbGFzcyB2YWx1ZUNsYXNzKSB7Ci0JCXJldHVybiBzYWZlQ29weShzb3J0ZWRNYXAsIGtleUNsYXNzLCB2YWx1ZUNsYXNzLCBmYWxzZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIHNhZmVDb3B5KFNvcnRlZE1hcCBzb3J0ZWRNYXAsIENsYXNzIGtleUNsYXNzLCBDbGFzcyB2YWx1ZUNsYXNzLCBib29sZWFuIGFsbG93TnVsbEtleXMsIGJvb2xlYW4gYWxsb3dOdWxsVmFsdWVzKSB7Ci0JCWlmIChzb3J0ZWRNYXAgPT0gbnVsbCB8fCBrZXlDbGFzcyA9PSBudWxsIHx8IHZhbHVlQ2xhc3MgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCXNvcnRlZE1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZE1hcChuZXcgVHJlZU1hcChzb3J0ZWRNYXApKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzb3J0ZWRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWFzc2VydEluc3RhbmNlKGVudHJ5LmdldEtleSgpLCBrZXlDbGFzcywgYWxsb3dOdWxsS2V5cyk7Ci0JCQlhc3NlcnRJbnN0YW5jZShlbnRyeS5nZXRWYWx1ZSgpLCB2YWx1ZUNsYXNzLCBhbGxvd051bGxWYWx1ZXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNvcnRlZE1hcDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNvcnRlZFNldCBzYWZlQ29weShTb3J0ZWRTZXQgc29ydGVkU2V0LCBDbGFzcyBjKSB7Ci0JCXJldHVybiBzYWZlQ29weShzb3J0ZWRTZXQsIGMsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNvcnRlZFNldCBzYWZlQ29weShTb3J0ZWRTZXQgc29ydGVkU2V0LCBDbGFzcyBjLCBib29sZWFuIGFsbG93TnVsbEVsZW1lbnRzKSB7Ci0JCWlmIChzb3J0ZWRTZXQgPT0gbnVsbCB8fCBjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlzb3J0ZWRTZXQgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQobmV3IFRyZWVTZXQoc29ydGVkU2V0KSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc29ydGVkU2V0Lml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCWFzc2VydEluc3RhbmNlKGl0ZXJhdG9yLm5leHQoKSwgYywgYWxsb3dOdWxsRWxlbWVudHMpOwotCi0JCXJldHVybiBzb3J0ZWRTZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0c1dpdGgoTGlzdCBsZWZ0LCBMaXN0IHJpZ2h0LCBib29sZWFuIGVxdWFscykgewotCQlpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBsID0gbGVmdC5zaXplKCk7Ci0JCWludCByID0gcmlnaHQuc2l6ZSgpOwotCQlpZiAociA+IGwgfHwgIWVxdWFscyAmJiByID09IGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcjsgaSsrKQotCQkJaWYgKCFlcXVhbHMobGVmdC5nZXQoaSksIHJpZ2h0LmdldChpKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RhcnRzV2l0aChPYmplY3RbXSBsZWZ0LCBPYmplY3RbXSByaWdodCwgYm9vbGVhbiBlcXVhbHMpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbCA9IGxlZnQubGVuZ3RoOwotCQlpbnQgciA9IHJpZ2h0Lmxlbmd0aDsKLQkJaWYgKHIgPiBsIHx8ICFlcXVhbHMgJiYgciA9PSBsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcjsgaSsrKQotCQkJaWYgKCFlcXVhbHMobGVmdFtpXSwgcmlnaHRbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJhbnNsYXRlU3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBVdGlsLnRyYW5zbGF0ZVN0cmluZyhyZXNvdXJjZUJ1bmRsZSwga2V5LCBrZXksIHRydWUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyYW5zbGF0ZVN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgU3RyaW5nIGtleSwgU3RyaW5nIHN0cmluZywgYm9vbGVhbiBzaWduYWwsIGJvb2xlYW4gdHJpbSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJZmluYWwgU3RyaW5nIHRyYW5zbGF0ZWRTdHJpbmcgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQotCQkJCWlmICh0cmFuc2xhdGVkU3RyaW5nICE9IG51bGwpCi0JCQkJCXJldHVybiB0cmltID8gdHJhbnNsYXRlZFN0cmluZy50cmltKCkgOiB0cmFuc2xhdGVkU3RyaW5nOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGVNaXNzaW5nUmVzb3VyY2UpIHsKLQkJCQlpZiAoc2lnbmFsKQotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZU1pc3NpbmdSZXNvdXJjZSk7Ci0JCQl9Ci0KLQkJcmV0dXJuIHRyaW0gPyBzdHJpbmcudHJpbSgpIDogc3RyaW5nOwotCX0KLQotCXByaXZhdGUgVXRpbCgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3NTRiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlciB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBwcmVPcHMgPSBudWxsOwotCXByaXZhdGUgQXJyYXlMaXN0IHBvc3RPcHMgPSBudWxsOwotCi0JcHJvdGVjdGVkIENvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyIGNyZWF0ZUV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyKFN0cmluZyBvcGVyYXRpb25JRCkgewotCQlDb2xsZWN0aW9uIGV4dGVuc2lvbnMgPSAoQ29sbGVjdGlvbikgT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLmdldEV4dGVuc2lvblBvaW50cygpLmdldChvcGVyYXRpb25JRCk7Ci0JCWlmIChleHRlbnNpb25zID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlciBleHRPcGVyYXRpb25Ib2xkZXIgPSBuZXcgQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlcigpOwotCQlPYmplY3QgcHJlT3AgPSBudWxsOwotCQlPYmplY3QgcG9zdE9wID0gbnVsbDsKLQkJT3BlcmF0aW9uRXh0ZW5zaW9uIGN1cnJlbnRFeHQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXh0ZW5zaW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQljdXJyZW50RXh0ID0gKE9wZXJhdGlvbkV4dGVuc2lvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKEVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoY3VycmVudEV4dC5nZXRFeHRlbnNpb25JZCgpLCBudWxsKS5pc0VuYWJsZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXByZU9wID0gY3VycmVudEV4dC5nZXRQcmVPcGVyYXRpb24oKTsKLQkJCQkJaWYgKHByZU9wICE9IG51bGwpIHsKLQkJCQkJCWV4dE9wZXJhdGlvbkhvbGRlci5hZGRQcmVPcGVyYXRpb24ocHJlT3ApOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJcG9zdE9wID0gY3VycmVudEV4dC5nZXRQb3N0T3BlcmF0aW9uKCk7Ci0JCQkJCWlmIChwb3N0T3AgIT0gbnVsbCkgewotCQkJCQkJZXh0T3BlcmF0aW9uSG9sZGVyLmFkZFBvc3RPcGVyYXRpb24ocG9zdE9wKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBleHRPcGVyYXRpb25Ib2xkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlT3BlcmF0aW9uKE9iamVjdCBwcmVPcGVyYXRpb24pIHsKLQkJaWYgKHByZU9wcyA9PSBudWxsKSB7Ci0JCQlwcmVPcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcHJlT3BzLmFkZChwcmVPcGVyYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBvc3RPcGVyYXRpb24oT2JqZWN0IHBvc3RPcGVyYXRpb24pIHsKLQkJaWYgKHBvc3RPcHMgPT0gbnVsbCkgewotCQkJcG9zdE9wcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlwb3N0T3BzLmFkZChwb3N0T3BlcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmVPcHMoKSB7Ci0JCXJldHVybiBwcmVPcHMgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQb3N0T3BzKCkgewotCQlyZXR1cm4gcG9zdE9wcyAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0UG9zdE9wcygpIHsKLQkJcmV0dXJuIHBvc3RPcHM7Ci0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRQcmVPcHMoKSB7Ci0JCXJldHVybiBwcmVPcHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWRiODVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIFNpbWlhbGFyIHRvIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MsIGhvd2V2ZXIgd2l0aG91dCBVSSBkZXBlbmRlbmNpZXMuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCS8qKgotCSAqIFJ1bnMgdGhpcyBvcGVyYXRpb24gd2l0aG91dCBmb3JjaW5nIGEgVUkgZGVwZW5kZW5jeS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYW5kIHJlY2VpdmUgcmVxdWVzdHMgZm9yCi0JICogICAgICAgICAgICBjYW5jZWxhdGlvbgotCSAqIEBleGNlcHRpb24gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBydW4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sIGl0IHNob3VsZCB3cmFwIGl0IGluc2lkZQotCSAqICAgICAgICAgICAgICAgIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlCi0JICogICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSB3cmFwcGVkIGluIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+IGJ5IHRoZQotCSAqICAgICAgICAgICAgICAgIGNhbGxpbmcgY29udGV4dAotCSAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgdXNpbmcKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTwvY29kZT4sIGl0IHNob3VsZCBleGl0IGJ5IHRocm93aW5nCi0JICogICAgICAgICAgICAgICAgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+Ci0JICogCi0JICogQHNlZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSU9wZXJhdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JT3BlcmF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNlNGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JT3BlcmF0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotLyoqCi0gKiBQYXNzZWQgdG8gY29tcGxleCBtZXRob2RzIHRoYXQgbWF5IHJlcXVpcmUgcmVwb3J0aW5nIG9mIG1lc3NhZ2VzLCBvciBpbnRlcmFjdGlvbnMgZnJvbSB0aGUgdXNlcjsKLSAqIERlZmluZWQgYXMgYW4gaW50ZXJmYWNlIGJlY2F1c2UgdGhlIGFjdGlvbnMgbWF5IHJ1biBpbiBoZWFkbGVzcyBlbnZpcm9ubWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uSGFuZGxlciB7Ci0JaW50IFlFUyA9IDA7Ci0JaW50IFlFU19UT19BTEwgPSAxOwotCWludCBOTyA9IDI7Ci0JaW50IENBTkNFTCA9IDM7Ci0KLQkvKioKLQkgKiBBIGRlY2lzaW9uIG5lZWRzIHRvIG1hZGUgYXMgdG8gd2hldGhlciBhbiBhY3Rpb24vb3BlcmF0aW9uIGNhbiBjb250aW51ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRpbnVlKFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIEEgZGVjaXNpb24gbmVlZHMgdG8gbWFkZSBhcyB0byB3aGV0aGVyIGFuIGFjdGlvbi9vcGVyYXRpb24gY2FuIGNvbnRpbnVlLiA8Y29kZT5pdGVtczwvY29kZT4KLQkgKiBpcyBhbiBhcnJheSBvZiBkZXRhaWxzIHRoYXQgYWNjb21wYW55IHRoZSA8Y29kZT5tZXNzYWdlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpOwotCi0JLyoqCi0JICogQSBkZWNpc2lvbiBuZWVkcyB0byBtYWRlIGFzIHRvIHdoZXRoZXIgYW4gYWN0aW9uL29wZXJhdGlvbiBjYW4gY29udGludWUuIFRoZSBib29sZWFuIGFycmF5Ci0JICogd2lsbCByZXR1cm4gdHdvIGJvb2xlYW5zLiBUaGUgZmlyc3QgaW5kaWNhdGVzIHRoZWlyIHJlc3BvbnNlIHRvIHRoZSBvcmlnaW5hbCBxdWVzdGlvbiBhbmQgdGhlCi0JICogc2Vjb25kIGluZGljYXRlcyBpZiB0aGV5IHNlbGVjdGVkIHRoZSBhcHBseSB0byBhbGwgY2hlY2sgYm94LgotCSAqIAotCSAqIFJldHVybiB0aGUgcmV0dXJuIGNvZGUgZm9yIHRoZSBkaWFsb2cuIDAgPSBZZXMsIDEgPSBZZXMgdG8gYWxsLCAyID0gTm8KLQkgKi8KLQlpbnQgY2FuQ29udGludWVXaXRoQWxsQ2hlY2soU3RyaW5nIG1lc3NhZ2UpOwotCi0JaW50IGNhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogQW4gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogQW4gaW5mb3JtYXRpb25hbCBtZXNzYWdlIG5lZWRzIHRvIGJlIHByZXNlbnRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSk7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjM2Y2Q3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcgewotCi0JLyoqCi0JICogQSByZXF1aXJlZCBkYXRhTW9kZWwgcHJvcGVydHlOYW1lIGZvciBhIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+IHR5cGUuIFRoaXMgaXMgdXNlZCB0bwotCSAqIHNwZWNpZnkgdGhlIHByb2plY3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBCb29sZWFuIHByb3BlcnR5IHVzZWQgZm9yIGRldGVybWluaW5nIGhvdyB0aGUgUFJPSkVDVF9MT0NBVElPTiBpcyBjb21wdXRlZC4gSWYgdGhpcwotCSAqIHByb3BlcnR5IGlzIHRydWUgdGhlbiB0aGUgUFJPSkVDVF9MT0NBVElPTiBpcyBudWxsLiBPdGhlcndpc2UgdGhlIFBST0pFQ1RfTE9DQVRJT04gaXMgdGhlCi0JICogdmFsdWUgb2YgVVNFUl9ERUZJTkVEX0xPQ0FUSU9OLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9ERUZBVUxUX0xPQ0FUSU9OID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlVTRV9ERUZBVUxUX0xPQ0FUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBTdHJpbmcgcHJvcGVydHkgdXNlZCBpbiBjb25qdWN0aW9uIHdpdGggVVNFX0RFRkFVTFRfTE9DQVRJT04gdG8gb3ZlcnJpZGUgdGhlCi0JICogREVGQVVMVF9MT0NBVElPTi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RFRklORURfTE9DQVRJT04gPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuVVNFUl9ERUZJTkVEX0xPQ0FUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBTdHJpbmcgcHJvcGVydHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjVVNFX0RFRkFVTFRfTE9DQVRJT059IGFuZAotCSAqIHtAbGluayAjUFJPSkVDVF9OQU1FfSB0byBvdmVycmlkIHRoZSB7QGxpbmsgI1BST0pFQ1RfTE9DQVRJT059LgotCSAqIAotCSAqIElmIHtAbGluayAjVVNFX0RFRkFVTFRfTE9DQVRJT059IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIHRoZW4gdGhlCi0JICoge0BsaW5rICNQUk9KRUNUX0xPQ0FUSU9OfSBpcyBkZWZpbmVkIGJ5IHtAbGluayAjVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT059L3tAbGluayAjUFJPSkVDVF9OQU1FfS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTiA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5VU0VSX0RFRklORURfQkFTRV9MT0NBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIHVuc2V0dGFibGUgcHJvcGVydHkgd2hpY2ggc3BlY2lmaWVkIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciBhIG5ld2x5IGNyZWF0ZWQgcHJvamVjdC4gVGhlCi0JICogdmFsdWUgaXMgY29tcHV0ZWQgYnkgYXBwZW5kaW5nIHRoZSBwcm9qZWN0IG5hbWUgdG8gdGhlIHdvcmtzcGFjZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xPQ0FUSU9OID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LkRFRkFVTFRfTE9DQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiB1bnNldHRhYmxlIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJvamVjdCBsb2NhdGlvbi4gSWYgVVNFX0RFRkFVTFRfTE9DQVRJT04gdGhpcwotCSAqIHByb3BlcnR5IGV2YWx1YXRlcyB0byBVU0VSX0RFRklORURfTE9DQVRJT047IG90aGVyd2lzZSBpdCBpIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTE9DQVRJT04gPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9MT0NBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wdGlvbmFsIGRhdGFNb2RlbCBwcm9wZXJ0eU5hbWUgZm9yIGEgPGNvZGU+amF2YS5sYW5nLlN0cmluZ1tdPC9jb2RlPiB0eXBlLiBUaGlzIGlzIGEKLQkgKiBsaXN0IG9mIGFsbCBuYXR1cmVzIHRvIGFkZCB0byB0aGUgcHJvamVjdC4gVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BVFVSRVMgPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9OQVRVUkVTIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSVByb2plY3QuIEFuIG5vbiBzZXR0YWJsZSBwcm9wZXJ0eS4gVGhpcyBpcyBhIGNvbnZlbmllY2UgZm9yIGNvbnN0cnVjdGlvbmcgZ2V0dGluZyB0aGUKLQkgKiBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1QgPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElQcm9qZWN0RGVzY3JpcHRpb24uIEFuIG5vbiBzZXR0YWJsZSBwcm9wZXJ0eS4gVGhpcyBpcyBhIGNvbnZlbmllY2UgZm9yIGNvbnN0cnVjdGlvbmcgYQotCSAqIHByb2plY3QgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9ERVNDUklQVElPTiA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5QUk9KRUNUX0RFU0NSSVBUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmY2QxNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkV4dGVuc2lvbiB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG9wSUQgPSBudWxsOwotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBiYXNlRWxlbWVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZU9wZXJhdGlvbkNsYXNzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgcG9zdE9wZXJhdGlvbkNsYXNzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZW5zaW9uSWQ7Ci0KLQlwdWJsaWMgT3BlcmF0aW9uRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgaWQsIFN0cmluZyBwcmVPcCwgU3RyaW5nIHBvc3RPcCkgewotCQlzdXBlcigpOwotCQliYXNlRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXNldFVwRXh0ZW5zaW9uKGlkLCBwcmVPcCwgcG9zdE9wKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VXBFeHRlbnNpb24oU3RyaW5nIGlkLCBTdHJpbmcgcHJlT3AsIFN0cmluZyBwb3N0T3ApIHsKLQkJb3BJRCA9IGlkOwotCQlwcmVPcGVyYXRpb25DbGFzcyA9IHByZU9wOwotCQlwb3N0T3BlcmF0aW9uQ2xhc3MgPSBwb3N0T3A7Ci0JCXRoaXMuZXh0ZW5zaW9uSWQgPSBiYXNlRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JCWlmICh0aGlzLmV4dGVuc2lvbklkID09IG51bGwpCi0JCQl0aGlzLmV4dGVuc2lvbklkID0gYmFzZUVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPcElEKCkgewotCQlyZXR1cm4gb3BJRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3RPcGVyYXRpb25DbGFzcygpIHsKLQkJcmV0dXJuIHBvc3RPcGVyYXRpb25DbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZU9wZXJhdGlvbkNsYXNzKCkgewotCQlyZXR1cm4gcHJlT3BlcmF0aW9uQ2xhc3M7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQb3N0T3BlcmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocG9zdE9wZXJhdGlvbkNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJhc2VFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLkFUVF9QT1NUX09QKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByZU9wZXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHByZU9wZXJhdGlvbkNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJhc2VFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLkFUVF9QUkVfT1ApOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXh0ZW5zaW9uSWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb25JZCgpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbklkOwotCX0KLQotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0QmFzZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBiYXNlRWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjI1ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkV4dGVuc2lvblJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKLSAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCXByb3RlY3RlZCBzdGF0aWMgSGFzaE1hcCBvcEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9KMkVFT1BFWFQgPSAib3BlcmF0aW9uRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BSRV9PUCA9ICJwcmVPcGVyYXRpb25DbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUE9TVF9PUCA9ICJwb3N0T3BlcmF0aW9uQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyKCkgewotCQlzdXBlcihXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCAiT3BlcmF0aW9uRXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgd2l0aCBhbiBleHRlbnNpb24gbGlrZTogPG9wZXJhdGlvbkV4dGVuc2lvbgotCSAqIHByZU9wZXJhdGlvbkNsYXNzPSJjb20uaWJtLmV0b29scy4uLi5QcmVEZWxldGVPcGVyYXRpb24iCi0JICogcG9zdE9wZXJhdGlvbkNsYXNzPSJjb20uaWJtLmV0b29scy4uLi5Qb3N0RGVsZXRlT3BlcmF0aW9uIj4gPC9vcGVyYXRpb25FeHRlbnNpb24+Ci0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTEVNRU5UX0oyRUVPUEVYVCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCVN0cmluZyBwcmVPcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUkVfT1ApOwotCQlTdHJpbmcgcG9zdE9wID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BPU1RfT1ApOwotCQlPcGVyYXRpb25FeHRlbnNpb24gZXh0ZW5zaW9uID0gbmV3IE9wZXJhdGlvbkV4dGVuc2lvbihlbGVtZW50LCBpZCwgcHJlT3AsIHBvc3RPcCk7Ci0JCWFkZEV4dGVuc2lvblBvaW50KGV4dGVuc2lvbik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5zaW9ucwotCSAqICAgICAgICAgICAgVGhlIGV4dGVuc2lvbnMgdG8gc2V0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRFeHRlbnNpb25Qb2ludChPcGVyYXRpb25FeHRlbnNpb24gbmV3RXh0ZW5zaW9uKSB7Ci0JCUNvbGxlY3Rpb24gdGVtcCA9IG51bGw7Ci0JCU9iamVjdCBob2xkZXIgPSBvcEV4dGVuc2lvbnMuZ2V0KG5ld0V4dGVuc2lvbi5nZXRPcElEKCkpOwotCQlpZiAoaG9sZGVyID09IG51bGwpIHsKLQkJCXRlbXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0ZW1wLmFkZChuZXdFeHRlbnNpb24pOwotCQkJb3BFeHRlbnNpb25zLnB1dChuZXdFeHRlbnNpb24uZ2V0T3BJRCgpLCB0ZW1wKTsKLQkJfSBlbHNlIHsKLQkJCXRlbXAgPSAoQ29sbGVjdGlvbikgaG9sZGVyOwotCQkJdGVtcC5hZGQobmV3RXh0ZW5zaW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSGFzaE1hcCBnZXRFeHRlbnNpb25Qb2ludHMoKSB7Ci0JCWlmKG9wRXh0ZW5zaW9ucyA9PSBudWxsKXsKLQkJCW9wRXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlPcGVyYXRpb25FeHRlbnNpb25SZWFkZXIgb3BFeHRlbnNpb25SZWFkZXIgPSBuZXcgT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyKCk7Ci0JCQlvcEV4dGVuc2lvblJlYWRlci5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gb3BFeHRlbnNpb25zOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25TdGF0dXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwYTRjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvblN0YXR1cyBleHRlbmRzIE11bHRpU3RhdHVzIHsKLQotCXB1YmxpYyBPcGVyYXRpb25TdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB7Ci0JCXN1cGVyKFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsIG5ldyBJU3RhdHVzW117fSwgbWVzc2FnZSwgZSk7Ci0JfQotCi0JcHVibGljIE9wZXJhdGlvblN0YXR1cyhJU3RhdHVzW10gY2hpbGRyZW4pIHsKLQkJdGhpcyhXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCAwLCBjaGlsZHJlbiwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE9wZXJhdGlvblN0YXR1cyhTdHJpbmcgcGx1Z2luSWQsIGludCBjb2RlLCBJU3RhdHVzW10gY2hpbGRyZW4sIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXN1cGVyKHBsdWdpbklkLCBjb2RlLCBjaGlsZHJlbiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbmRlZFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQlpbnQgb2xkU2V2ZXJpdHkgPSBnZXRTZXZlcml0eSgpOwotCQlzdXBlci5hZGQoc3RhdHVzKTsKLQkJaWYgKG9sZFNldmVyaXR5ICE9IElTdGF0dXMuRVJST1IgJiYgZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQlzZXRTZXZlcml0eShJU3RhdHVzLldBUk5JTkcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBleHBvc2UgYXMgcHVibGljIGluc3RlYWQgb2YgcHJvdGVjdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29kZShpbnQgY29kZSkgewotCQlzdXBlci5zZXRDb2RlKGNvZGUpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gZXhwb3NlIGFzIHB1YmxpYyBpbnN0ZWFkIG9mIHByb3RlY3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXN1cGVyLnNldEV4Y2VwdGlvbihleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gZXhwb3NlIGFzIHB1YmxpYyBpbnN0ZWFkIG9mIHByb3RlY3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIuc2V0TWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIGV4cG9zZSBhcyBwdWJsaWMgaW5zdGVhZCBvZiBwcm90ZWN0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpIHsKLQkJc3VwZXIuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChJU3RhdHVzIHN0YXR1cykgewotCQlpbnQgbmV3U2V2ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0JCWlmIChuZXdTZXYgPiBnZXRTZXZlcml0eSgpKSB7Ci0JCQlzZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJc2V0RXhjZXB0aW9uKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQkJc3VwZXIuYWRkKHN0YXR1cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyM2VkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotcHVibGljIGNsYXNzIFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3IGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3IHsKLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uTmV3KG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VfREVGQVVMVF9MT0NBVElPTik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERFRkFVTFRfTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VSX0RFRklORURfTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTkFUVVJFUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfREVTQ1JJUFRJT04pOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTE9DQVRJT04pKSB7Ci0JCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9ERUZBVUxUX0xPQ0FUSU9OKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIGlmIChpc1Byb3BlcnR5U2V0KFVTRVJfREVGSU5FRF9CQVNFX0xPQ0FUSU9OKSkgewotCQkJCXJldHVybiBnZXRTdHJpbmdQcm9wZXJ0eShVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTikgKyBGaWxlLnNlcGFyYXRvciArIGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0UHJvcGVydHkoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKTsKLQkJfSBlbHNlIGlmIChERUZBVUxUX0xPQ0FUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAoVVNFX0RFRkFVTFRfTE9DQVRJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0gZWxzZSBpZiAoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IFVTRVJfREVGSU5FRF9CQVNFX0xPQ0FUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfREVTQ1JJUFRJT04pKQotCQkJcmV0dXJuIGdldFByb2plY3REZXNjcmlwdGlvbigpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdExvY2F0aW9uKCkgewotCQlJUGF0aCBwYXRoID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCkKLQkJCXBhdGggPSBwYXRoLmFwcGVuZChwcm9qZWN0TmFtZSk7Ci0JCXJldHVybiBwYXRoLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0xPQ0FUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKERFRkFVTFRfTE9DQVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9ERVNDUklQVElPTikpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7Ci0JCQlJU3RhdHVzIHN0YXQgPSBtb2RlbC52YWxpZGF0ZVByb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCQlpZiAoc3RhdCAhPSBPS19TVEFUVVMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNULCBnZXRQcm9qZWN0KCkpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoREVGQVVMVF9MT0NBVElPTiwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJaWYgKGdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTikgfHwgaXNQcm9wZXJ0eVNldChVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTikpIHsKLQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX0xPQ0FUSU9OLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VfREVGQVVMVF9MT0NBVElPTikpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBST0pFQ1RfTE9DQVRJT04sIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJfSBlbHNlIGlmICgocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX0RFRklORURfTE9DQVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04pKSAmJiAhZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9ERUZBVUxUX0xPQ0FUSU9OKSkgewotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUFJPSkVDVF9MT0NBVElPTiwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgSVByb2plY3REZXNjcmlwdGlvbiBnZXRQcm9qZWN0RGVzY3JpcHRpb24oKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdE5hbWUpOwotCQlTdHJpbmcgcHJvamVjdExvY2F0aW9uID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9MT0NBVElPTik7Ci0JCWlmIChwcm9qZWN0TG9jYXRpb24gIT0gbnVsbCkKLQkJCWRlc2Muc2V0TG9jYXRpb24obmV3IFBhdGgocHJvamVjdExvY2F0aW9uKSk7Ci0JCWVsc2UKLQkJCWRlc2Muc2V0TG9jYXRpb24obnVsbCk7Ci0JCXJldHVybiBkZXNjOwotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlyZXR1cm4gKG51bGwgIT0gcHJvamVjdE5hbWUgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwKSA/IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotCQkJU3RyaW5nIG5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZU5hbWUobmFtZSk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0xPQ0FUSU9OKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUxvY2F0aW9uKCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0xPQ0FUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0KLQkJCVN0cmluZyBwcm9qZWN0TG9jID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChnZXRCb29sZWFuUHJvcGVydHkoVVNFX0RFRkFVTFRfTE9DQVRJT04pKSB7Ci0JCQkJcHJvamVjdExvYyA9IGdldERlZmF1bHRMb2NhdGlvbigpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9qZWN0TG9jID0gZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9MT0NBVElPTik7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsaWRhdGVFeGlzdGluZyhwcm9qZWN0TmFtZSwgcHJvamVjdExvYyk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcGFyYW0gcHJvamVjdExvYwotCSAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlRXhpc3RpbmcoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcHJvamVjdExvYykgewotCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCAmJiAhcHJvamVjdE5hbWUuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHByb2plY3RMb2MpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCUZpbGUgZG90UHJvamVjdCA9IG5ldyBGaWxlKGZpbGUsICIucHJvamVjdCIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGRvdFByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlBST0pFQ1RfRVhJU1RTX0FUX0xPQ0FUSU9OX0VSUk9SLCBuZXcgT2JqZWN0W117ZmlsZS50b1N0cmluZygpfSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0SGFuZGxlRnJvbVByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKHByb2plY3ROYW1lLCBJUmVzb3VyY2UuUFJPSkVDVCk7Ci0JCXJldHVybiAobnVsbCAhPSBwcm9qZWN0TmFtZSAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSA+IDAgJiYgc3RhdHVzLmlzT0soKSkgPyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShwcm9qZWN0TmFtZSwgSVJlc291cmNlLlBST0pFQ1QpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCQlpZiAocHJvamVjdE5hbWUuZW5kc1dpdGgoIiAiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI0MSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZVByb2plY3ROYW1lKG5hbWUpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5hbWUpOwotCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuUFJPSkVDVF9FWElTVFNfU0FNRU5BTUVfRVJST1IsIG5ldyBPYmplY3RbXXtuYW1lfSkpOwotCQl9Ci0JCWlmICghV1RQUGx1Z2luLmlzUGxhdGZvcm1DYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCS8vIG5vdyBsb29rIGZvciBhIG1hdGNoaW5nIGNhc2UgdmFyaWFudCBpbiB0aGUgdHJlZQotCQkJSVJlc291cmNlIHZhcmlhbnQgPSAoKFJlc291cmNlKSBwcm9qZWN0KS5maW5kRXhpc3RpbmdSZXNvdXJjZVZhcmlhbnQocHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKLQkJCWlmICh2YXJpYW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjQyIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUxvY2F0aW9uKCkgewotCQlTdHJpbmcgbG9jID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9MT0NBVElPTik7Ci0JCWlmIChudWxsICE9IGxvYykgewotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jKTsKLQkJCXJldHVybiB3b3Jrc3BhY2UudmFsaWRhdGVQcm9qZWN0TG9jYXRpb24oZ2V0UHJvamVjdCgpLCBwYXRoKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Qcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25OZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Qcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25OZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzN2NmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uTmV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDI3LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uTmV3IGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldyB7Ci0KLQlwdWJsaWMgUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uTmV3KElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSAoSVByb2plY3REZXNjcmlwdGlvbikgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9ERVNDUklQVElPTik7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCXByb2plY3QuY3JlYXRlKGRlc2MsIHN1Yk1vbml0b3IpOwotCQkJfQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJcHJvamVjdC5vcGVuKHN1Yk1vbml0b3IpOwotCi0JCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSAoU3RyaW5nW10pIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1RfTkFUVVJFUyk7Ci0JCQlpZiAobnVsbCAhPSBuYXR1cmVJZHMpIHsKLQkJCQlkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlc2Muc2V0TmF0dXJlSWRzKG5hdHVyZUlkcyk7Ci0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTU4ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT53dHAgb3BlcmF0aW9uIGFwaSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlRoZSBXVFAgT3BlcmF0aW9uIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkby4uLmV2ZXJ5dGhpbmchPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VW5kZXIgQ29uc3RydWN0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpbWcgc3JjPSJlc2NhcGVfb3V0X3RvX3NvdXJjZV9mb2xkZXIgbGV2ZWwvb3ZlcnZpZXcveW91cl9pbWFnZS5qcGciPjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPHA+Ci08aT5GaWd1cmUgMTogSW1hZ2UgZGVzY3JpcHRpb248L2k+Ci08L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDUwZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gCi08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT53dHAgb3BlcmF0aW9uIGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLSAgICAgICAgPGFic3RyYWN0PlRoZSBXVFAgT3BlcmF0aW9uIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkby4uLmV2ZXJ5dGhpbmchPC9hYnN0cmFjdD4KLQotCQk8IS0tIGZvcm1hdHRpbmcgaGFuZGxlZCBieSBYU0xUIFRyYW5zZm9ybWF0aW9uIC0tPgotCQk8cD5VbmRlciBDb25zdHJ1Y3Rpb24uPC9wPgotCQk8aW1nIHNyYz0iZXNjYXBlX291dF90b19zb3VyY2VfZm9sZGVyIGxldmVsL292ZXJ2aWV3L3lvdXJfaW1hZ2UuanBnIiBjYXB0aW9uID0iSW1hZ2UgZGVzY3JpcHRpb24iIC8+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9wbHVnaW4vV1RQQ29tbW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhZGU4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiA1LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV1RQQ29tbW9uTWVzc2FnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfRVhJU1RTX0VSUk9SID0gIjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OT1RfRUFSID0gIjIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DT01QQVRBQkxFX0oyRUVfVkVSU0lPTlMgPSAiMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1FX01PRFVMRV9BTkRfRUFSX05BTUUgPSAiNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX0ZJTEVfTkFNRV9FTVBUWV9FUlJPUiA9ICI1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfRE9FU19OT1RfRVhJU1RfRVJST1IgPSAiNiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUk5BTF9FUlJPUiA9ICI3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRV9JTlZBTElEID0gIjgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTVElOQVRJT05fQVJDSElWRV9TSE9VTERfRU5EX1dJVEggPSAiOSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNUSU5BVElPTl9JTlZBTElEID0gIjEwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1JFQURfT05MWSA9ICIxMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9FWElTVFNfRVJST1IgPSAiMTIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OT1RfRVhJU1RTX0VSUk9SID0gIjEzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNfTEVWRUxfTk9UX0ZPVU5EID0gIjE0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRV9FTVBUWSA9ICIxNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0NsT1NFRCA9ICIzMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0VYSVNUU19BVF9MT0NBVElPTl9FUlJPUiA9ICIzMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJfRU1QVFlfTU9EVUxFX05BTUUgPSAiMzQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX0lOVkFMSURfQ0hBUlMgPSAiMzUiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERVUExJQ0FURV9DT01QT05FTlRfTkFNRT0iMzYiOy8vJE5PTi1OTFMtMSQgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05PVF9TVVBQT1JURUQ9IjM3IjsvLyROT04tTkxTLTEkIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9FWElTVFNfRVJST1IgPSAiMzgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFRk9MREVSX0VNUFRZID0gIjM5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkNPTlRFTlRGT0xERVJfRU1QVFkgPSAiNDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9FWElTVFNfU0FNRU5BTUVfRVJST1IgPSAiNDMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9OT05FID0gIjQ0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9wbHVnaW4vV1RQQ29tbW9uUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0YzcyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDI5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBDb21tb25QbHVnaW4gZXh0ZW5kcyBXVFBQbHVnaW4gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQgPSAiZnVuY3Rpb25Hcm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIDAsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkvLwlUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdUUENvbW1vblBsdWdpbiBwbHVnaW47Ci0KLQlwdWJsaWMgV1RQQ29tbW9uUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoInd0cF9jb21tb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXVFBDb21tb25QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVFcnJvclN0YXR1cyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVXYXJuaW5nU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVXYXJuaW5nU3RhdHVzKG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVDYW5jZWxTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZUNhbmNlbFN0YXR1cyhtZXNzYWdlLCBudWxsKTsKLQl9CQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlV2FybmluZ1N0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwgLTEsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAtMSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlQ2FuY2VsU3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuQ0FOQ0VMLCBQTFVHSU5fSUQsIC0xLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0JCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBXVFBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlTdHJpbmcgcGF0dGVybiA9IGdldFJlc291cmNlU3RyaW5nKGtleSk7Ci0JCWlmIChwYXR0ZXJuICE9IG51bGwpCi0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgYXJncyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL3d0cF9jb21tb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy93dHBfY29tbW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjNkYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL3d0cF9jb21tb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotMT1BIHByb2plY3QgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGlzIG5hbWUgYW5kIGxvY2F0aW9uLgotMj1UaGUgc3BlY2lmaWVkIEVBUiBwcm9qZWN0ICJ7MH0iIGlzIG5vdCBhbiBFQVIgcHJvamVjdC4KLTM9VGhlIEVBUiBwcm9qZWN0ICJ7MH0iIGhhcyBhIEoyRUVWZXJzaW9uIG9mIHsxfSB3aGljaCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbW9kdWxlIHZlcnNpb24uCi00PVRoZSBFQVIgcHJvamVjdCBuYW1lLCAiezB9IiwgY2FuIG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJvamVjdCBuYW1lLgotNT17MH0gZmlsZSBuYW1lIG11c3QgYmUgZW50ZXJlZC4KLTY9VGhlIHswfSBkb2VzIG5vdCBleGlzdC4KLTc9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuICBWaWV3IGxvZyBmaWxlcyBmb3IgZGV0YWlscy4KLTg9UHJvamVjdCBuYW1lIGlzIGludmFsaWQuCi05PURlc3RpbmF0aW9uIGFyY2hpdmUgc2hvdWxkIGVuZCB3aXRoIHswfS4KLTEwPURlc3RpbmF0aW9uIGFyY2hpdmUgaXMgaW52YWxpZC4KLTExPURlc3RpbmF0aW9uIGxvY2F0aW9uIGlzIHJlYWQgb25seS4KLTEyPVJlc291cmNlIHswfSBhbHJlYWR5IGV4aXN0cy4gSWYgeW91IHdpc2ggdG8gb3ZlcndyaXRlIHNlbGVjdCB0aGUgIk92ZXJ3cml0ZSBFeGlzdGluZyBmaWxlIiBvcHRpb24uCi0xMz1Qcm9qZWN0IHswfSBkb2VzIG5vdCBleGlzdC4KLTE0PVRoZSBzZWxlY3RlZCB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci4KLTE1PUVudGVyIGEgcHJvamVjdCBuYW1lLgotMTY9U2F2ZSBwcm9ibGVtcwotMTc9U2F2ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkLiAgU29tZSByZWxhdGVkIGZpbGVzIG1heSBoYXZlIGFscmVhZHkgYmVlbiBzYXZlZC5cblxuUmVhc29uCi0xOD17MH0gaGFzIGJlZW4gbG9ja2VkLiBQbGVhc2UgZW5zdXJlIHRoZSBvcGVyYXRpb24gaXMgbm90IGN1cnJlbnRseSBleGVjdXRpbmcuCi0xOT1UaGUgZXh0ZW5kZWRSb290IGlzIG51bGwuIE1ha2Ugc3VyZSB0aGF0IGlzRXh0ZW5kZWQoKSByZXR1cm5zIHRydWUuCi0yMD1Qcm9wZXJ0eSBub3QgbG9jYXRlZDoKLTIxPU5lc3RlZCBtb2RlbCBub3QgbG9jYXRlZDoKLTIyPUNhbm5vdCBtb2RpZnkgaWQgb25jZSBpdCBoYXMgYmVlbiBzZXQuCi0yMz1UaGUgaWQgY2Fubm90IGJlIG51bGwuCi0yND1FUlJPUjoKLTI1PUV4dGVuZGVkIE9wZXJhdGlvbiBmYWlsdXJlOiB7MH0KLTI2PVRoZSBKb2IgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQotMjc9RXhjZXB0aW9uIG9jY3VycmVkIHJ1bm5pbmcgam9iLgotMjg9R3JvdXAgY2Fubm90IGJlIHJlc29sdmVkOgotMjk9Q2xhc3Mgbm90IGZvdW5kIGZvciBhdHRyaWJ1dGUgezB9IDogezF9LCBEZWNsYXJpbmcgcGx1Z2luIGV4dGVuc2lvbjogezJ9Ci0zMD1GdW5jdGlvbiBncm91cCB7MH0gY29udGFpbnMgbm8gcGF0dGVybiBiaW5kaW5ncwotMzE9UHJvamVjdCB7MH0gaXMgY2xvc2VkLgotMzI9QSBwcm9qZWN0IGFscmVhZHkgZXhpc3RzIG9uIHRoZSBmaWxlIHN5c3RlbSBhdCB0aGlzIGxvY2F0aW9uOiB7MH0uICBFaXRoZXIgdXNlICJJbXBvcnQgRXhpc3RpbmcgUHJvamVjdHMgaW50byBXb3Jrc3BhY2UiIHRvIGNyZWF0ZSBhIHByb2plY3QgYXQgdGhpcyBsb2NhdGlvbiBvciBkZWxldGUgdGhlIGNvbnRlbnRzIG9mIHswfSBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLTMzPUEgbW9kZWwgaW5zdGFuY2UgbWF5IG9ubHkgYmUgbmVzdGVkIG9uY2UgdW5kZXIgYW5vdGhlciBtb2RlbCBpbnN0YW5jZS4KLTM0PU1vZHVsZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLTM1PUludmFsaWQgY2hhcmFjdGVycy4KLTM2PVRoZSBtb2R1bGUgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0zNz1UaGUgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBzZXJ2ZXIuCi0zOD1Nb2R1bGUgbmFtZSBpcyBpbnZhbGlkLgotMzk9RW50ZXIgU291cmNlIEZvbGRlcgotNDA9RW50ZXIgV2ViIGNvbnRlbnQgRm9sZGVyCi00MT1Qcm9qZWN0IG5hbWVzIGNhbm5vdCBlbmQgd2l0aCB3aGl0ZSBzcGFjZS4KLTQyPVJlc291cmNlIGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgY2FzZS4KLTQzPUEgcHJvamVjdCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoaXMgbmFtZS4KLTQ0PTxOb25lPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlMDI1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkNjhjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAzOjEyOjQyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzc0ZTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMzoxMjozNiBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzYmZiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9TbmlwcGV0c0NvbnRleHRzLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL1NuaXBwZXRzQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2IwYzQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL1NuaXBwZXRzQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJsaWJ2MTAwMCI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgdmlldyB0byBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBtYXJrdXAsIGFsb25nIHdpdGggY3VzdG9tIHRhZ3MsIHRoYXQgY2FuIGJlIGVtYmVkZGVkIGluIGV4aXN0aW5nIGZpbGVzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJsaWJ2MTEwMCI+Ci08ZGVzY3JpcHRpb24+U3VwcGx5IHZhbHVlcyBpbiB0aGlzIGRpYWxvZyB0byBkZWZpbmUgdGhlIFNuaXBwZXRzIHZpZXcgb2JqZWN0IHRvIGJlIGluc2VydGVkIGluIHRoZSBjdXJyZW50IGZpbGUgYXQgdGhlIGN1cnNvciBwb3NpdGlvbi4gQXNzaWduIGEgdmFsdWUgdG8gdGhlIHZhcmlhYmxlcyBiZWluZyBpbnNlcnRlZC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9Ikluc2VydGluZyBhbmQgZWRpdGluZyBpdGVtcyBpbiB0aGUgYWN0aXZlIGVkaXRvciIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ibGlidjEyMDAiPgotPGRlc2NyaXB0aW9uPkluIHRoZSA8Yj5OYW1lPC9iPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGFzIHlvdSB3YW50IGl0IGJlIGRpc3BsYXllZCBpbiB0aGUgU25pcHBldHMgdmlldy4gIE9wdGlvbmFsbHksIGFkZCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgaW4gdGhlIDxiPkRlc2NyaXB0aW9uPC9iPiBmaWVsZC4KLQotU2VsZWN0IHRoZSA8Yj5IaWRlPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGlzIHNuaXBwZXQgb2JqZWN0IG5vdCB2aXNpYmxlIGluIHRoZSB2aWV3LgotCi1UbyBhZGQgYSBuZXcgdmFyaWFibGUsIGNsaWNrIHRoZSA8Yj5OZXc8L2I+IHB1c2ggYnV0dG9uLCBhbmQgdHlwZSB2YWx1ZXMgaW4gdGhlIGNlbGxzIG9mIHRoZSA8Yj5WYXJpYWJsZXM8L2I+IHRhYmxlLiBUaGUgPGI+TmFtZTwvYj4gZmllbGQgcmVwcmVzZW50cyBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgd2hlbiB5b3UgYWRkIGl0IHRvIGEgZG9jdW1lbnQuIDxiPkRlZmF1bHQgdmFsdWU8L2I+IGlzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBuYW1lZCB2YXJpYWJsZS4gT3B0aW9uYWxseSwgYWRkIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlhYmxlLgotCi1JbnNlcnQgdGhlIHZhcmlhYmxlcyB0aGF0IHlvdSBkZWZpbmUgaW50byB0aGUgPGI+VGVtcGxhdGUgUGF0dGVybjwvYj4gZmllbGQgdXNpbmcgdGhlIDxiPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvYj4gcHVzaCBidXR0b24uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJsaWJ2MTMwMCI+Ci08ZGVzY3JpcHRpb24+VHlwZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGNhdGVnb3J5IGluIHRoZSA8Yj5OYW1lPC9iPiBmaWVsZCBhbmQgb3B0aW9uYWxseSBhZGQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2F0ZWdvcnkgaW4gdGhlIDxiPkRlc2NyaXB0aW9uPC9iPiBmaWVsZC4KLQotU2VsZWN0IDxiPk9wZW4gZHJhd2VyIGF0IHN0YXJ0LXVwPC9iPiB0byBoYXZlIHRoZSBjYXRlZ29yeSBkcmF3ZXIgb3BlbmVkIGluIHRoZSBTbmlwcGV0cyB2aWV3IHdoZW4gdGhlIHdvcmtiZW5jaCBzdGFydHMgdXAuCi0KLVlvdSBjYW4gc3BlY2lmeSBob3cgeW91IHdhbnQgdGhlIGNhdGVnb3J5IGRyYXdlciBkaXNwbGF5ZWQgaW4gdGhlIFNuaXBwZXRzIHZpZXcgYnkgc2VsZWN0aW5nIGEgcmFkaW8gYnV0dG9uIGZvciB0aGUgPGI+U2hvdy9IaWRlIERyYXdlcjwvYj4gZmllbGQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJzbmlwMDAxMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPkltcG9ydDwvYj4gZGlhbG9nLCB3aGljaCBsZXRzIHlvdSBpbXBvcnQgc25pcHBldCBjYXRlZ29yaWVzIGZyb20gdGhlIGZpbGUgc3lzdGVtLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDIwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+RXhwb3J0PC9iPiBkaWFsb2csIHdoaWNoIGxldHMgeW91IGV4cG9ydCBzbmlwcGV0IGNhdGVnb3JpZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDMwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIGNvbnRlbnQgdHlwZXMgdGhhdCBzaG91bGQgYmUgdmlzaWJsZSBpbiB0aGlzIGRyYXdlciBmb3IgaW4gdGhlIFNuaXBwZXRzIHZpZXcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJzbmlwMDA0MCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBtZW51IGl0ZW0gYWRkcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgU25pcHBldHMgdmlldyBhcyBhIG5ldyBpdGVtLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDUwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIG1lbnUgaXRlbSBjdXRzIHRoZSBzZWxlY3RlZCBTbmlwcGV0IGl0ZW0gdG8gdGhlIGNsaXBib2FyZC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNuaXBwZXQgaXRlbXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic25pcDAwNjAiPgotPGRlc2NyaXB0aW9uPlRoaXMgbWVudSBpdGVtIGNvcGllcyB0aGUgc2VsZWN0ZWQgU25pcHBldCBpdGVtIHRvIHRoZSBjbGlwYm9hcmQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBzbmlwcGV0IGl0ZW1zIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDcwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIG1lbnUgaXRlbSBjcmVhdGVzIGEgbmV3IFNuaXBwZXRzIHZpZXcgaXRlbSBjb250YWluaW5nIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbCIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InNuaXAwMDgwIj4KLTxkZXNjcmlwdGlvbj5UeXBlIGEgbmFtZSBmb3IgdGhlIGNhdGVnb3J5LiBUaGUgY2F0ZWdvcnkgYXBwZWFycyBpbiB0aGUgQ3VzdG9taXplIFBhbGV0dGUgZGlhbG9nIGJveC4gT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgY2F0ZWdvcnksIHlvdSBjYW4gYWRkIGl0ZW1zIHRvIHRoZSBjYXRlZ29yeS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkM2RiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgU25pcHBldHNDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGYwMjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wCi1CdW5kbGUtTmFtZS4wID0gQ29tbW9uIFdTVCBpbmZvcG9wcwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlMTc4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IlNuaXBwZXRzQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNuaXBwZXRzIi8+Ci08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3ZmNkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb2R1bGVjb3JlLXNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTc3NTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotbW9kdWxlY29yZS5qYXIKLWRvYwotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2ODE5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9Db21wb25lbnRSZXNvbHZlcj10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkY2QxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZmE0ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIERlYyAwMiAxNDo1NDo1OSBFU1QgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9zY2hlbWEvY29tcG9uZW50Q29yZS54c2Q9VVRGOApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWJiMWU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSNUaHUgTWF5IDEwIDE4OjM4OjA4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4ZmYxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jV2VkIE1hciAxOSAxNzoxODo0MSBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcclxuICogQHJldHVybiB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXHJcbiAqIEBwYXJhbSAke3BhcmFtfSB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldFxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcclxuICogJHt0YWdzfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqXHJcbiAqIFxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiPi8qKlxyXG4gKiBAYXV0aG9yICR7dXNlcn1cclxuICpcclxuICogJHt0YWdzfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXHJcbiAqIFxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxyXG4gKiAke3RhZ3N9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXHJcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZGVsZWdhdGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBkZWxlZ2F0ZSBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmRlbGVnYXRlY29tbWVudCIgbmFtZVw9ImRlbGVnYXRlY29tbWVudCI+LyoqXHJcbiAqICR7dGFnc31cclxuICogJHtzZWVfdG9fdGFyZ2V0fVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7ZmlsZWNvbW1lbnR9XHJcbiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cclxuXHJcbiR7dHlwZWNvbW1lbnR9XHJcbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNsYXNzYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2xhc3MgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5Ij5cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJpbnRlcmZhY2Vib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBpbnRlcmZhY2UgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuaW50ZXJmYWNlYm9keSIgbmFtZVw9ImludGVyZmFjZWJvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImFubm90YXRpb25ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmFubm90YXRpb25ib2R5IiBuYW1lXD0iYW5ub3RhdGlvbmJvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJjYXRjaGJsb2NrX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjYXRjaCBibG9ja3MiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2F0Y2hibG9jayIgbmFtZVw9ImNhdGNoYmxvY2siPm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKCR7ZXhjZXB0aW9uX3Zhcn0pOzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rib2R5IiBuYW1lXD0ibWV0aG9kYm9keSI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YlxyXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxyXG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNTZjMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4yMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjVkM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gbW9kdWxlY29yZS1zcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkYWE5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUiPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9jb21wb25lbnRDb3JlLnhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL2NvbXBvbmVudENvcmUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQ4ODI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL2NvbXBvbmVudENvcmUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL21vZHVsZUNvcmUiIHhtbG5zOnRucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9tb2R1bGVDb3JlIj4NCi0JPGVsZW1lbnQgbmFtZT0icHJvamVjdC1tb2R1bGVzIj4NCi0JCTxjb21wbGV4VHlwZT4NCi0JCQk8c2VxdWVuY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotCQkJCTxlbGVtZW50IG5hbWU9IndiLW1vZHVsZSI+DQotCQkJCQk8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJPGVsZW1lbnQgbmFtZT0ibW9kdWxlLXR5cGUiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCTxhdHRyaWJ1dGUgbmFtZT0ibW9kdWxlLXR5cGUtaWQiDQotICAgICAgICAgICAgICAgICAgICAgICAgCQkJCXR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQkJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8L2VsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCTxlbGVtZW50IG5hbWU9IndiLXJlc291cmNlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0ic291cmNlLXBhdGgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3ktcGF0aCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8L2VsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTwvc2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCTxlbGVtZW50IG5hbWU9ImRlcGVuZGVudC1tb2R1bGUiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPGF0dHJpYnV0ZSBuYW1lPSJoYW5kbGUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3ktcGF0aCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8YXR0cmlidXRlIG5hbWU9ImRlcGVuZGVuY3ktdHlwZSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8L2VsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTwvc2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcGxveS1uYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPjwvYXR0cmlidXRlPg0KLQkJCQkJPC9jb21wbGV4VHlwZT4NCi0JCQkJPC9lbGVtZW50Pg0KLQkJCTwvc2VxdWVuY2U+DQotCQkJPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj48L2F0dHJpYnV0ZT4NCi0JCTwvY29tcGxleFR5cGU+DQotCTwvZWxlbWVudD4NCi0NCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9jb21wb25lbnRjb3JlX21vZGVsLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL2NvbXBvbmVudGNvcmVfbW9kZWwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDhkNjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL2NvbXBvbmVudGNvcmVfbW9kZWwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvY29tcG9uZW50Y29yZV9wYWNrYWdlLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL2NvbXBvbmVudGNvcmVfcGFja2FnZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzA0YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvY29tcG9uZW50Y29yZV9wYWNrYWdlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21hcHBpbmcuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbWFwcGluZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjZlNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbWFwcGluZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9tZXRhbW9kZWxfY29tcG9uZW50cy5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9tZXRhbW9kZWxfY29tcG9uZW50cy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4Y2I4MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbWV0YW1vZGVsX2NvbXBvbmVudHMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbW9kdWxlX3N0cnVjdHVyYWxfbW9kZWwuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbW9kdWxlX3N0cnVjdHVyYWxfbW9kZWwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZlMjk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21vZHVsZV9zdHJ1Y3R1cmFsX21vZGVsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21vZHVsZWNvcmUuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbW9kdWxlY29yZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWE5OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbW9kdWxlY29yZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy92aXJ0dWFsX3BhdGhfYXBpLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL3ZpcnR1YWxfcGF0aF9hcGkuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGEzZTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL3ZpcnR1YWxfcGF0aF9hcGkuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvSmF2YS5lcHggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9KYXZhLmVweApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmZDFjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9KYXZhLmVweAorKysgL2Rldi9udWxsCkBAIC0xLDYxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4KLTx1bWw6UHJvZmlsZSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8xLjAuMC9VTUwiIHhtaTppZD0iXy1ab3l3SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmEiIG1ldGFtb2RlbFJlZmVyZW5jZT0iXy1ab3l3WlNrRWRtamF1U2pHOHFPMkEiPgotICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1ab3l4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgIDxkZXRhaWxzIHhtaTppZD0iXy1ab3l4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0icHJvcGVydHlJZCIgdmFsdWU9IjgwOTEzNTk2NiIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYXNpMVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hc2kxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFzaTE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlUGFja2FnZXMiPgotICAgIDxjb250ZW50cyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIHhtaTppZD0iXy1hNHY4SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfMCIgbnNVUkk9Imh0dHA6Ly8vXy1hc2kySlNrRWRtamF1U2pHOHFPMkEucHJvZmlsZS51bWwyIiBuc1ByZWZpeD0iSmF2YV8wIj4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgeG1pOmlkPSJfLWE0djhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fTW9kdWxlU3BlYyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0djhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJzdGVyZW90eXBlIiByZWZlcmVuY2VzPSJfLWFzaXg1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0djg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ21JZGVudGlmaWNhdGlvbiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0djlKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29weXJpZ2h0Tm90aWNlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgeG1pOmlkPSJfLWE0djlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fUHJvamVjdCI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0djlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJzdGVyZW90eXBlIiByZWZlcmVuY2VzPSJfLWFCMG1aU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0djk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ0FwcGx5MyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0di1KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY1NpbmNlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR2LVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHbG9iYWxJbXBvcnRzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR2LXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHYtNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ikluc3RhbmNlVmFyaWFibGVQcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im1fIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dl9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2hvd0NvZGVnZW5EbGciIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHZfWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vQ2xhc3NDdXN0b21EbGciIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHZfcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ1Byb2plY3ROYW1lIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR2XzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VUYWJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImludCI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdBWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsUHJlZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lSmF2YURvY1RhZ3MiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdBNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsSG9tZVN1ZmZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0JKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ1RleHQyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIb21lU3VmZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWQUphdmFXb3JraW5nRm9sZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0RUpCVmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0NKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWF4TnVtQ2hhcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjgwIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0NaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ05hbWUyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3Q3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RFRETG9jYXRpb24iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdDNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdBcHBseTEiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdESlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlUm9zZUlEIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdEWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0b3BPbkVycm9yIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3RHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhZG9jVmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0Q1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0RlZmF1bHRBdXRob3IiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdFSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik9wZW5CcmFjZU1ldGhvZFN0eWxlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdFWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkFzdGVyaXNrQ29tbWVudFN0eWxlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3RXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcmltYXJ5S2V5U3VmZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3RTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFZGl0b3IiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0d081U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iQnVpbHRJbiIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0ZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ0FwcGx5MiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0ZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0ZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3BhY2luZ0l0ZW1zIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIzIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRFRETG9jYXRpb24iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdHSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3R1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnVGV4dDMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdHcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlbW90ZVN1ZmZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0c1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVmZXJlbmNlQ2xhc3NwYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJPcGVuQnJhY2VDbGFzc1N0eWxlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdIWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsU3VmZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWTSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3UUpTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJTdW4iLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdINVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0lKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlUHJlZml4ZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdJWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW5TdWZmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdJcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW5QcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdJNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ0NvbW1lbnQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdKSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJvb3REaXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdKWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdUZXh0MSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0pwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ05hbWUxIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJBdXRvU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0tKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0F1dGhvciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0taU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUm9zZURlZmF1bHRDb21tZW50U3R5bGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0twU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU0NDUHJvamVjdFNvdXJjZVJvb3QiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdLNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFDb21tZW50U3R5bGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdMSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ2b2lkIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0xaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ05hbWUzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3THBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdMNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vdFNob3dSb3NlSUREbGciIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdNSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlbW90ZVByZWZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d01aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlU3BhY2VzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdNcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNsYXNzVmFyaWFibGVQcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InNfIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d001U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0RlZmF1bHRTaW5jZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d05KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU0NDU2VsZWN0ZWQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdOWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkhvbWVQcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdOcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsSG9tZVByZWZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d041U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ2xhc3NQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3T0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTb3VyY2VDb250cm9sIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3T1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhZG9jTnVtQXN0ZXJpc2tzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d09wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJpbWFyeUtleVByZWZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0d081U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fUHJvamVjdEVkaXRvclR5cGUiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdQSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJ1aWx0SW4iPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d1BaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYUg2ODVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdQcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IldpbmRvd3NTaGVsbCIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d1A1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYUg2OXBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0d1FKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fUHJvamVjdFZNVHlwZSI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d1FaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3VuIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdRcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFCMHBKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3UTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNaWNyb3NvZnQiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdSSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFCMHA1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3UlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJQk0iIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdScFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFCMHFwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR3UjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19DbGFzcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d1NKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJzdGVyZW90eXBlIiByZWZlcmVuY2VzPSJfLVoxbmJaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1NaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCTmFtZUluSkFSIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3U3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Z2V0SW5mbyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1M1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3VEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1RaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEludEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1RwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1Q1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdVSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdVWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZW50VHlwZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1VwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3VTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1ZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdWWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3VnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVyRm9yd2FyZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1dKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1daU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVmZXJlbmNlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1dwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdXNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdYSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1haU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGaW5hbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdYcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25UeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHdmNVNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1g1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1lKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzYWJsZUF1dG9TeW5jIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3WVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCTVBfRXh0ZW5kX0NNUCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1lwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVHJhbnNhY3Rpb25UeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHdocFNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkNvbnRhaW5lciIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1k1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckluY2x1ZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdaSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1paU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1pwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldERhdGVIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdaNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3YUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2FaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2VjdXJpdHlSb2xlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2FwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdhNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3YkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3YlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdicFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckNvb2tpZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2I1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3aTVTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIyLjAiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdjSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlBlcnNpc3RlbmNlVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3a0pTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdjWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cnVjdG9ySXMiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0d2w1U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0icHVibGljIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3Y3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkT25seSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2M1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVfWE1MX0REIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdkSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXROYW1lIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2RwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ254RmFjdG9yeSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2Q1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWVudHJhbnQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdlWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdlNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlQ29kZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2ZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVIVE1MIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0d2Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdnSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3Z1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3R3NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d2dwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVsZXNzIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3ZzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3R4cFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d2hKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVmdWwiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdoWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dHlaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHdocFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d2g1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdpSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDVKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3aVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3aXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3Q1NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR3aTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19DbGFzc0VKQlZlcnNpb25fU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3akpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIyLjAiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d2paU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0NjVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdqcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjEueCIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d2o1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0N3BTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0d2tKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3a1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d2twU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0elpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdrNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdsSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDBKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3bFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdscFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDA1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHdsNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX0NsYXNzQ3Rvcl9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdtSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3bVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3QxNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d21wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJvdGVjdGVkIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3bTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3QycFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d25KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJpdmF0ZSIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d25aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0M1pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHducFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InBhY2thZ2UiIHZhbHVlPSIzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHduNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDRKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR3b0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19Nb2R1bGVCb2R5Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3b1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InN0ZXJlb3R5cGUiIHJlZmVyZW5jZXM9Il8tWm95eHBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3b3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbUlkZW50aWZpY2F0aW9uIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3bzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb3B5cmlnaHROb3RpY2UiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR3cEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19PcGVyYXRpb24iPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1hYU83cFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdwcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlcGxhY2VFeGlzdGluZ0NvZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3A1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdxSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm4iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3cXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOYXRpdmUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdxNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkFic3RyYWN0IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ckpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTeW5jaHJvbml6ZWQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdyWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRpYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iXy1hNHdycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0RlZmF1bHRfRUpCX19DbGFzcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d3I1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJzdGVyZW90eXBlIiByZWZlcmVuY2VzPSJfLWFPQm81U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3NKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCTmFtZUluSkFSIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3c1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdzcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRnZXRJbmZvIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3czVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3RKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEludEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3RaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3RwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd1SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZW50VHlwZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3VaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3dXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3U1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd2SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3dlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVyRm9yd2FyZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3ZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3dKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVmZXJlbmNlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3daU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd3cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd3NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3hKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGaW5hbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd4WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25UeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHc1cFNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3hwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzYWJsZUF1dG9TeW5jIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3eDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3eUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCTVBfRXh0ZW5kX0NNUCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3laU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVHJhbnNhY3Rpb25UeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHc3WlNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkNvbnRhaW5lciIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3lwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckluY2x1ZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd5NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3pKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3paU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldERhdGVIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd6cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ejVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2VjdXJpdHlSb2xlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzBaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcwcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckNvb2tpZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3OHBTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIyLjAiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcxNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlBlcnNpc3RlbmNlVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3OTVTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcySlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cnVjdG9ySXMiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0d19wU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0icHVibGljIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkT25seSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVfWE1MX0REIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXROYW1lIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3M0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzNaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ254RmFjdG9yeSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWVudHJhbnQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHc0SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3NFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHc0cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlQ29kZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3NDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVIVE1MIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3NVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0dzVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3NTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9Cd3BTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHc2WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlbGVzcyIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CeFpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHc2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlZnVsIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3N0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0J5SlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR3N1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3N3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CNDVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHc4SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHc4WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQjVwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHc4cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0VKQlZlcnNpb25fU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3ODVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIyLjAiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CNnBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHc5WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjEueCIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CN1pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0dzk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0dy1KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHctWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQjJaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3LXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3LTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0IzSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d19KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3X1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0IzNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR3X3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NDdG9yX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d181U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHVibGljIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhBSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQnpKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4QVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcm90ZWN0ZWQiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhBcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQno1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4QTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcml2YXRlIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4QkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0IwcFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eEJaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icGFja2FnZSIgdmFsdWU9IjMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eEJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CMVpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iXy1hNHhCNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3MiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhDSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1hZ1ZocFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhDWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQk5hbWVJbkpBUiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eENwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4QzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Z2V0SW5mbyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eERKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhEWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbnRIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhEcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhENVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNtcEZpZWxkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGVudFR5cGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhFWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhFcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRpYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhGSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRTZWN1cml0eVJvbGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckZvcndhcmQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhGNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhHSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb29raWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhHWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZmVyZW5jZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhHcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZXh0UmVmIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SXNTZWN1cmUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhIWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRmluYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4UDVTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhINVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc2FibGVBdXRvU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eElKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eElaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQk1QX0V4dGVuZF9DTVAiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhJcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlRyYW5zYWN0aW9uVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4UnBTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJDb250YWluZXIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhJNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJJbmNsdWRlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0WE1MRmlsZVBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhKcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXREYXRlSGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEtKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblN5bmMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhLWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlY3VyaXR5Um9sZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhLcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IklzU2luZ2xlVGhyZWFkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eExKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eExaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlck5hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4THBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JDb29raWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhMNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlZlcnNpb24iIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eFM1U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMi4wIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJQZXJzaXN0ZW5jZVR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eFVKU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJ1Y3RvcklzIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHhWNVNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InB1YmxpYyIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE1wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZE9ubHkiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhNNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlX1hNTF9ERCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0TmFtZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE5aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCWE1MRmlsZVBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhOcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNueEZhY3RvcnkiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhONVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVlbnRyYW50IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4T1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE9wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUNvZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eFBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhQWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSFRNTCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eFBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhQNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhRSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4UVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1ZwWlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVsZXNzIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4UTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1ZxSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFJKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVmdWwiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhSWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnE1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhScFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4UjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eFNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWdWeHBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhTWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhTcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnlaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhTNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJWZXJzaW9uX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMi4wIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhUWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnpaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4VHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIxLngiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhUNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVjBKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhVSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4VVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eFVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWdWcjVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhVNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhWSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnNwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4VlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhWcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnRaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhWNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NDdG9yX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFdKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHVibGljIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhXWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnVaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4V3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcm90ZWN0ZWQiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhXNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnZKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4WEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcml2YXRlIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4WFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1Z2NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icGFja2FnZSIgdmFsdWU9IjMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eFg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWdWd3BTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iXy1hNHhZSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX1JvbGUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhZWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1hYVBDSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhZcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRXcml0ZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4YkpTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJSZWFkICZhbXA7IFdyaXRlIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4WTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbml0aWFsVmFsdWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhaSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByb3BlcnR5VHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4YzVTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJOb3QgQSBQcm9wZXJ0eSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eFpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4WnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eFo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVHJhbnNpZW50IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4YUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWb2xhdGlsZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGFaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNOYXZpZ2FibGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW5kaXZpZHVhbENoYW5nZU1ndCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyQ2xhc3MiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhiSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX1JvbGVSZWFkV3JpdGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4YlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkICZhbXA7IFdyaXRlIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhicFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFhUEU1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4YjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkIE9ubHkiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhjSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFhUEZwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4Y1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJXcml0ZSBPbmx5IiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4Y3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hYVBHWlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4YzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19Sb2xlQmVhblByb3BlcnR5X1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eGRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTm90IEEgUHJvcGVydHkiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eGRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWFQSFpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhkcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNpbXBsZSIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eGQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWFQSUpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhlSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJvdW5kIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4ZVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hYVBJNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eGVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RyYWluZWQiIHZhbHVlPSIzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhlNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFhUEpwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR4ZkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4ZlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InN0ZXJlb3R5cGUiIHJlZmVyZW5jZXM9Il8tWnU1bEpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4ZnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJOYW1lSW5KQVIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhmNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGdKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldGdldEluZm8iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhnWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4Z3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW50SGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4ZzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4aEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbXBGaWVsZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9ySGVhZGVycyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRlbnRUeXBlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4aDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0aWMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhpSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4aVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGlwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhpNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJGb3J3YXJkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4akpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4alpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29va2llIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4anBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWZlcmVuY2VzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4ajVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGV4dFJlZiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGtKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGtaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldElzU2VjdXJlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4a3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZpbmFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGs1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eHRKU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNhYmxlQXV0b1N5bmMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhsWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhscFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJNUF9FeHRlbmRfQ01QIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJUcmFuc2FjdGlvblR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eHU1U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iQ29udGFpbmVyIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVySW5jbHVkZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG1aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFhNTEZpbGVQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RGF0ZUhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG5KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RyaWN0ZnAiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhuWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25TeW5jIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZWN1cml0eVJvbGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJc1NpbmdsZVRocmVhZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhvWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhvcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yQ29va2llIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4cEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJWZXJzaW9uIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHh3SlNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjIuMCIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHBaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUGVyc2lzdGVuY2VUeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHh4WlNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RydWN0b3JJcyIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4ekpTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJwdWJsaWMiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRPbmx5IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4cUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZV9YTUxfREQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHFaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldE5hbWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhxcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlhNTEZpbGVQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4cTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbnhGYWN0b3J5IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4ckpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhyWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZW50cmFudCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkVudmlyb25tZW50UHJvcGVydGllcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHNKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVDb2RlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4c3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUhUTUwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhzNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4dEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4dFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1czVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlbGVzcyIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1dHBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlZnVsIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4dXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV1WlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4dTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHh2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NTFKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4dnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4djVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTUxNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4d0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh3WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjIuMCI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4d3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTUyNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMS54IiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4eEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTUzcFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4eFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHh4NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NXZaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4eUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4eVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV3SlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHlwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4eTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV3NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4ekpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh6WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4enBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV4NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJvdGVjdGVkIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4MEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV5cFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eDBaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJpdmF0ZSIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eDBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1elpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHgwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InBhY2thZ2UiIHZhbHVlPSIzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHgxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NTBKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR4MVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19BdHRyaWJ1dGUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHgxcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1adTVZWlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHgxNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRXcml0ZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4M3BTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJSZWFkICZhbXA7IFdyaXRlIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4MkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcm9wZXJ0eVR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eDVaU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iTm90IEEgUHJvcGVydHkiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHgyWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eDJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHgyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlRyYW5zaWVudCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eDNKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVm9sYXRpbGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHgzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkluZGl2aWR1YWxDaGFuZ2VNZ3QiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHgzcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZVJlYWRXcml0ZV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHgzNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWQgJmFtcDsgV3JpdGUiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eDRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1Y0pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHg0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWQgT25seSIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eDRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1YzVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHg0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IldyaXRlIE9ubHkiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHg1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NWRwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHg1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZUJlYW5Qcm9wZXJ0eV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHg1cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vdCBBIFByb3BlcnR5Ij4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHg1NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NWVwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4NkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTaW1wbGUiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHg2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NWZaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4NnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCb3VuZCIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eDY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1Z0pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHg3SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cmFpbmVkIiB2YWx1ZT0iMyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4N1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTVnNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8L2NvbnRlbnRzPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplcTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIudmVyc2lvbnMiPgotICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVySlNrRWRtamF1U2pHOHFPMkEiIGtleT0iMCIgdmFsdWU9IjEuMCIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfLVpveXdaU2tFZG1qYXVTakc4cU8yQSIgdmlzaWJpbGl0eT0icHJpdmF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5TUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5TVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOHFiQTY4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfLVpveXdwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5TXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5TTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0VmUlpvSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il8tWm95dzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlOSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlOWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvSmF2YVByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfUmpteW9LODZFZGllYVlneHRWV044USIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1ab3l4cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX01vZHVsZUJvZHkiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVpveXg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVpveXlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWm95eVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5TnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVpveXlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWm95eTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1ab3l6NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQ29tcG9uZW50IiBhc3NvY2lhdGlvbj0iXy1ab3l6SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5TjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlPSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSmpLODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1ab3kwSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNtSWRlbnRpZmljYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5T1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlPcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWm95MFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5TzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWm95MHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb3B5cmlnaHROb3RpY2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5UFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlQcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWnU1WUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5UDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1ab3l6SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbXBvbmVudF9kZWZhdWx0X19Nb2R1bGVCb2R5IiBtZW1iZXJFbmQ9Il8tWm95elpTa0VkbWphdVNqRzhxTzJBIF8tWm95ejVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlRWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlRcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWm95elpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fTW9kdWxlQm9keSIgdHlwZT0iXy1ab3l4cFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVpveXpKU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlRNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVpveXpwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVJaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlScFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1adTVZWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX0F0dHJpYnV0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1WXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1WTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhdGVnb3J5TmFtZSIgdmFsdWU9IkphdmEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTVaSlNrRWRtamF1U2pHOHFPMkEiIGtleT0ic3VwcHJlc3NlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlSNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1WlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTVacFNrRWRtamF1U2pHOHFPMkEiIGtleT0idGFnZ2VkVmFsdWVTZXQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRFbnVtZXJhdGlvbkxpdGVyYWwiIGFzc29jaWF0aW9uPSJfLVp1NVo1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlTSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOWJSZ2E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRQcm9wZXJ0eSIgYXNzb2NpYXRpb249Il8tWnU1YTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5UzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205QzFsYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1aHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkV3JpdGUiIHR5cGU9Il8tWnU1YjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5VFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLVp1NWg1U2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWnU1Y0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5VHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1aUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcm9wZXJ0eVR5cGUiIHR5cGU9Il8tWnU1ZVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5VVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLVp1NWlaU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWnU1ZXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5VXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1aXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5VkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlWWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NWk1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlWNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWpKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5V0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlXWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NWpaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlXNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWpwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVHJhbnNpZW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5WFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTVqNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlYcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5WDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVrSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlZvbGF0aWxlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5WVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTVrWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlZcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5WTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVrcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkluZGl2aWR1YWxDaGFuZ2VNZ3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5WkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlaWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NWs1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlaNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWnU1WjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFbnVtZXJhdGlvbkxpdGVyYWxfZGVmYXVsdF9fQXR0cmlidXRlIiBtZW1iZXJFbmQ9Il8tWnU1YUpTa0VkbWphdVNqRzhxTzJBIF8tWnU1YXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlhSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlhWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWnU1YUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fQXR0cmlidXRlIiB0eXBlPSJfLVp1NVlaU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWnU1WjVTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOWFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5YTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWnU1YVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5YkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOWJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWnU1YTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcm9wZXJ0eV9kZWZhdWx0X19BdHRyaWJ1dGUiIG1lbWJlckVuZD0iXy1adTViSlNrRWRtamF1U2pHOHFPMkEgXy1adTVicFNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOWJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOWI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1adTViSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19BdHRyaWJ1dGUiIHR5cGU9Il8tWnU1WVpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1adTVhNVNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5Y0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTljWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1adTViWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTljcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5YzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVp1NWI1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fQXR0cmlidXRlUmVhZFdyaXRlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5ZEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5ZFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NWNKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZCAmYW1wOyBXcml0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVjWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1Y3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iODEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5ZHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlkNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVjNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWQgT25seSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVkSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1ZFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iODIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5ZUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQwSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVkcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IldyaXRlIE9ubHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1ZDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjgzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEMHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tWnU1ZVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQxSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1ZXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOb3QgQSBQcm9wZXJ0eSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVlNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1ZkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNzEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEMVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVmWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNpbXBsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVmcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1ZjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNzIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEMTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQySlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVnSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJvdW5kIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NWdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTVncFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI3MyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQyWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NWc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RyYWluZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1aEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9Ijc0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEM0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1adTVsSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NWxaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWxwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1bDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEM1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NW1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1bVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVuWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQWN0b3IiIGFzc29jaWF0aW9uPSJfLVp1NW1wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQzcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOW5kY2E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NW9aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRDbGFzcyIgYXNzb2NpYXRpb249Il8tWnU1bnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxENFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX204OHV4cTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1cFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJEVudW1lcmF0aW9uIiBhc3NvY2lhdGlvbj0iXy1adTVvcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxENHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ0NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUmVhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkSW50ZXJmYWNlIiBhc3NvY2lhdGlvbj0iXy1adTVwcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxENUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ1WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSm9xODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVyWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkU2lnbmFsIiBhc3NvY2lhdGlvbj0iXy1adTVxcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxENXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ1NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSnphODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkUHJpbWl0aXZlVHlwZSIgYXNzb2NpYXRpb249Il8tWnU1cnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxENlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205YlJzYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJOYW1lSW5KQVIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxENnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ2NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWnU1NHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEN0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEN3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NTVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NTVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldGdldEluZm8iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEOHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ4NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWnU1NXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEOUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQ5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWnU1NkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxELUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRC1aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW50SGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRC1wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxELTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTU2cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTERfSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEX1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTU2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEX3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTERfNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NTdKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVBWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NTdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFQXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVBNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWnU1N3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFQkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JIZWFkZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFQjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbkVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVDWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRlbnRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFQzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbkVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRURKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVEWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRURwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFRDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5GSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVFSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFRVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5GWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFRTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbkZwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVGWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkY1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFRnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVGNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuR0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFR0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuR1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVHcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5HcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVISlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFSFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5HNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJGb3J3YXJkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFSDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5ISlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVJSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFSVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5IWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFSXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVJNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbkhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVKWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVKcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUo1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuSUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFS0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUtaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuSVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWZlcmVuY2VzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUtwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFSzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbklwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUxKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVMWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFTHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVMNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbkpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRU1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVNWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFTXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVNNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbkpwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVOSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFTlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5KNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVOcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRU41U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuS0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFT0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRU9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuS1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZpbmFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVPcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRU81U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuS3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFUEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVBaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuSzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uVHlwZSIgdHlwZT0iXy1adTVzcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFUHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVQNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tWjFuTEpTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1adTVzNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVRSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFUVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5MWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc2FibGVBdXRvU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVRcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuTHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFUkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuTDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFUjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5NSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVTSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFU1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5NWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJNUF9FeHRlbmRfQ01QIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFUzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5NcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVUSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFVFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5NNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlRyYW5zYWN0aW9uVHlwZSIgdHlwZT0iXy1adTUwNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFVHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVUNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tWjFuTkpTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1adTUxSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVVSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFVVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5OWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJJbmNsdWRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFVTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5OcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVWSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFVlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5ONVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVWcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5PSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVXSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFV1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5PWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFV3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVXNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuT3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFWEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuTzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RGF0ZUhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVYcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuUEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFWUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuUFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVZcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuUHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFWkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuUDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVacFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVo1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuUUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFYUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWFaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuUVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZWN1cml0eVJvbGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFYTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxblFwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEViWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFYnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEViNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblJKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVjWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblJaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFY3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVjNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblJwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVkWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblI1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVkcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5TSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVlSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFZVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5TWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVlcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuU3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFZkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuUzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JDb29raWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFZnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVmNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuVEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFZ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuVFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJWZXJzaW9uIiB0eXBlPSJfLVp1NTJwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVncFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1aMW5UcFNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVp1NTI1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVoWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblQ1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUGVyc2lzdGVuY2VUeXBlIiB0eXBlPSJfLVp1NXZKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVocFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1aMW5VSlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVp1NXZaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVpWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RydWN0b3JJcyIgdHlwZT0iXy1adTV4cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFaXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVpNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tWjFuVXBTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1adTV4NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVqSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFalpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5VNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRPbmx5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFajVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5WSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVrSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFa1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5WWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlX1hNTF9ERCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVrcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWs1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuVnBTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWxKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVsWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblY1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldE5hbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFbHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVsNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuV0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFbUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRW1aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuV1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVtcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRW01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5XcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVuSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFblpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5XNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNueEZhY3RvcnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFbnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVuNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuWEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFb0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRW9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuWFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFb3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVvNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXBKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVlbnRyYW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFcDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5ZSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFcVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5ZWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFcTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbllwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVyWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFcjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxblpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVDb2RlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFczVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5acFNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFdEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuWjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV0cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5hSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFdVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5hWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSFRNTCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV1cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuYXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFdkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuYTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV2cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5iSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV3SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFd1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVp1NW1wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQWN0b3JfRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVp1NW01U2tFZG1qYXVTakc4cU8yQSBfLVp1NW5aU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFd3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFdzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVp1NW01U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tWnU1bEpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1adTVtcFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFeEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1adTVuSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV4cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFeDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1adTVucFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNsYXNzX0RlZmF1bHRfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1adTVuNVNrRWRtamF1U2pHOHFPMkEgXy1adTVvWlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1adTVuNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLVp1NWxKU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWnU1bnBTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFeTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWnU1b0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFekpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWnU1b3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFbnVtZXJhdGlvbl9EZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tWnU1bzVTa0VkbWphdVNqRzhxTzJBIF8tWnU1cFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV6cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV6NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWnU1bzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1adTVsSlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVp1NW9wU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEUwSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTBaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVp1NXBKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEUwNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVp1NXBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW50ZXJmYWNlX0RlZmF1bHRfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1adTVwNVNrRWRtamF1U2pHOHFPMkEgXy1adTVxWlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTFaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1adTVwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLVp1NWxKU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWnU1cHBTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFMTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWnU1cUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFMkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWnU1cXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTaWduYWxfRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVp1NXE1U2tFZG1qYXVTakc4cU8yQSBfLVp1NXJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFMnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFMjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVp1NXE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tWnU1bEpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1adTVxcFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFM0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEUzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1adTVySlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEUzcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFMzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1adTVycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByaW1pdGl2ZVR5cGVfRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVp1NXI1U2tFZG1qYXVTakc4cU8yQSBfLVp1NXNaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFNEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFNFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVp1NXI1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tWnU1bEpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1adTVycFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFNHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEU0NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1adTVzSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFNVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVp1NXNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFNXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFNTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXM1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTV0SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1dFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFNlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1dHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWxlc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1dDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU2cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVmdWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1dXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU3SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVp1NXZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTV2WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1dnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRThaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXdKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTV3WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1d3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRThwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFODVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1dzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1eEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVp1NXhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEU5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1eDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwdWJsaWMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1eUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjYyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRS1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFLVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1eXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcm90ZWN0ZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1eTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjYzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRS1wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFLTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1elpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcml2YXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NXpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTV6NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2NCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVfSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRV9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NTBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icGFja2FnZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTUwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1MHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFX3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVfNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1adTUwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZBSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZBWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1MUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1MVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NTFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZBcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NTE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTUySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1MlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjEyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGQlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tWnU1MnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTUyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjIuMCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTUzSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1M1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGQ1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1M3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIxLngiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1MzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NTRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIzMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZDcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il8tWjFuYlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19DbGFzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjFuYnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjFuYjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhdGVnb3J5TmFtZSIgdmFsdWU9IkphdmEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aMW5jSlNrRWRtamF1U2pHOHFPMkEiIGtleT0ic3VwcHJlc3NlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZESlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjFuY1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aMW5jcFNrRWRtamF1U2pHOHFPMkEiIGtleT0idGFnZ2VkVmFsdWVTZXQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbmRwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRBY3RvciIgYXNzb2NpYXRpb249Il8tWjFuYzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGRHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205bmRjYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd0c1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJENsYXNzIiBhc3NvY2lhdGlvbj0iXy1aMW5kNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGRDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZFSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTg4dXhxODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3R0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkRW51bWVyYXRpb24iIGFzc29jaWF0aW9uPSJfLVo3dHNwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZFWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOWJSZWE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dHVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRJbnRlcmZhY2UiIGFzc29jaWF0aW9uPSJfLVo3dHRwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZFNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOVZKb3E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dHZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRTaWduYWwiIGFzc29jaWF0aW9uPSJfLVo3dHVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZGWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOVZKemE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dHdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRQcmltaXRpdmVUeXBlIiBhc3NvY2lhdGlvbj0iXy1aN3R2cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGRjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZHSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUnNhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3Q4WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQk5hbWVJbkpBUiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZHWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aN3Q4cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZHNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3Q4NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRnZXRJbmZvIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVo3dDlKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZJSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dDlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRklaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aN3Q5cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZJNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3Q5NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aN3QtSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZKNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGS0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3QtWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbnRIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGS1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZLcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVo3dC1wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRks1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZMSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dC01U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZMWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkxwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjd0X0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRk1KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd0X1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbXBGaWVsZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZNWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRk1wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aN3RfcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZNNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGTkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3RfNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZOcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd1QUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRk9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1QVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGVudFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGT1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZPcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd1QXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1QTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0aWMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGUFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZQcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVo3dUJKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZRSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dUJaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGUVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZRcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd1QnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGUTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1QjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZSWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aN3VDSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZSNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGU0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3VDWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGU3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVo3dUNwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZUSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dUM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckZvcndhcmQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGVFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZUcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVo3dURKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZVSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dURaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZVWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjd1RHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGVTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1RDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29va2llIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGVnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aN3VFSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZWNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGV0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3VFWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZmVyZW5jZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGV1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZXcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd1RXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGVzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1RTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGV4dFJlZiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZYWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwVUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGWDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRllKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwVVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZZWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRllwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwVXBTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZaSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldElzU2VjdXJlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGWnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBWSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZaNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGYUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBWWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRmluYWxpemVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGYXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBWcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZhNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGYkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBWNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25UeXBlIiB0eXBlPSJfLVo3dHdwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZiWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hQjBXSlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVo3dHc1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZjSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZjWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwV3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGYzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwVzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNhYmxlQXV0b1N5bmMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGZFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZkcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMFhKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZlSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQk1QX0V4dGVuZF9DTVAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGZVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZlcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMFhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZmSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVHJhbnNhY3Rpb25UeXBlIiB0eXBlPSJfLVo3dDQ1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZmWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hQjBZSlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVo3dDVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZnSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckluY2x1ZGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGZ1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZncFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMFlwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2NKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktjWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFhNTEZpbGVQYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2NwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLYzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMFpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2RKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktkWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktkcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2Q1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBacFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktlSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBaNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXREYXRlSGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2VwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBhSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktmSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBhWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2ZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBhcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktnSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZ1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBhNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25TeW5jIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2dwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBiSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktoSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLaFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBiWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlY3VyaXR5Um9sZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLaHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktoNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUIwYnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLaUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2laU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwYjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJc1NpbmdsZVRocmVhZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktpcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2k1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwY0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLakpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2paU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwY1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktqcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2o1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwY3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLa0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2taU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwYzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2twU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLazVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMGRKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2xKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktsWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGRaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2xwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLbDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBkcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkttSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLbVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBkNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckNvb2tpZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkttcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS201U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBlSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktuSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLblpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBlWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlZlcnNpb24iIHR5cGU9Il8tWjd0NnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS25wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLbjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFCMGVwU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWjd0NjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLb0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS29aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwZTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJQZXJzaXN0ZW5jZVR5cGUiIHR5cGU9Il8tWjd0ekpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS29wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLbzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFCMGZKU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWjd0elpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLcEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3BaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwZlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJ1Y3RvcklzIiB0eXBlPSJfLVo3dDFwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktwcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3A1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hQjBmcFNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVo3dDE1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3FKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktxWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGY1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZE9ubHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLcXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktxNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMGdKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3JKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktyWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVfWE1MX0REIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3JwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLcjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBncFNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLc0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3NaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwZzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0TmFtZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktzcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3M1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBoSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt0SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLdFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBoWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlhNTEZpbGVQYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3RwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLdDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMGhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3VKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt1WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ254RmFjdG9yeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt1cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3U1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBpSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLdlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBpWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt2cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3Y1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwaXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLd0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3daU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwaTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWVudHJhbnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLd3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMGpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3hKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLeHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt4NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUIwanBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLeUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3laU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwajVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLeXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUIwa0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLekpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3paU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwa1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUNvZGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLenBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt6NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMGtwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkswSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBrNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMGxKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUksxWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGxaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVIVE1MIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBscFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUksySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBsNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMG1KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkszWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWjFuYzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJBY3Rvcl9kZWZhdWx0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVoxbmRKU2tFZG1qYXVTakc4cU8yQSBfLVoxbmRwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLM3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVoxbmRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX0NsYXNzIiB0eXBlPSJfLVoxbmJaU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWjFuYzVTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLNFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWjFuZFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLNHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWjFuZDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbGFzc19kZWZhdWx0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVoxbmVKU2tFZG1qYXVTakc4cU8yQSBfLVo3dHNaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLNUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLNVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVoxbmVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX0NsYXNzIiB0eXBlPSJfLVoxbmJaU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWjFuZDVTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLNTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWjd0c0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLNkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWjd0c3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFbnVtZXJhdGlvbl9kZWZhdWx0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVo3dHM1U2tFZG1qYXVTakc4cU8yQSBfLVo3dHRaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLNnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLNjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVo3dHM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX0NsYXNzIiB0eXBlPSJfLVoxbmJaU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWjd0c3BTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLN1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWjd0dEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLN3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWjd0dHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbnRlcmZhY2VfZGVmYXVsdF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1aN3R0NVNrRWRtamF1U2pHOHFPMkEgXy1aN3R1WlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1aN3R0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19DbGFzcyIgdHlwZT0iXy1aMW5iWlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVo3dHRwU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUks4cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVo3dHVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUks5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVo3dHVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2lnbmFsX2RlZmF1bHRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tWjd0dTVTa0VkbWphdVNqRzhxTzJBIF8tWjd0dlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUks5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUks5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWjd0dTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fQ2xhc3MiIHR5cGU9Il8tWjFuYlpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1aN3R1cFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLLUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkstWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1aN3R2SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkstcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLLTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1aN3R2cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByaW1pdGl2ZVR5cGVfZGVmYXVsdF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1aN3R2NVNrRWRtamF1U2pHOHFPMkEgXy1aN3R3WlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS19KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS19aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1aN3R2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19DbGFzcyIgdHlwZT0iXy1aMW5iWlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVo3dHZwU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktfcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS181U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVo3dHdKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxBWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tWjd0d3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMQXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMQTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dHc1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3R4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0eFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMQlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0eHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWxlc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0eDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dHlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxCcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dHlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVmdWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0eXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dHk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxDSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTENaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVo3dHpKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxDcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxDNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0elpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dHpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3R6NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMREpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxEWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3QwSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0MFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxEcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dDA1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dDFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3QxWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMRUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxFWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1aN3QxcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX0NsYXNzQ3Rvcl9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3QxNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3QySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0MlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMRkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxGWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3QycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByb3RlY3RlZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3QyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0M0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMRnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxGNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3QzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByaXZhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0M3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjY0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMR1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0NEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwYWNrYWdlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dDRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3Q0cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2NSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxHcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVo3dDQ1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxISlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxIWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0NUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0NVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxIcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dDU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3Q2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0NlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjEyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTElKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMSVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tWjd0NnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19DbGFzc0VKQlZlcnNpb25fU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxJcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxJNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0NjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIyLjAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0N0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIzMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxKSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dDdwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMS54Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dDc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3Q4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMzEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMSnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxKNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfLWFCMG1aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fUHJvamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYUIwbXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYUIwbTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhdGVnb3J5TmFtZSIgdmFsdWU9IkphdmEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hQjBuSlNrRWRtamF1U2pHOHFPMkEiIGtleT0ic3VwcHJlc3NlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxLSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYUIwblpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hQjBucFNrRWRtamF1U2pHOHFPMkEiIGtleT0idGFnZ2VkVmFsdWVTZXQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMG9wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRNb2RlbCIgYXNzb2NpYXRpb249Il8tYUIwbjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEtaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMS3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205bmRiYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg2LVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnQXBwbHkzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEs1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMTEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFINi1wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTExaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxMcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFINi01U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY1NpbmNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEw1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMTUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDZfSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxNWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMTXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDZfWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ikdsb2JhbEltcG9ydHMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMTTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxOSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg2X3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMTlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTE5wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg2XzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTE41U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMT0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdBSlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMT1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTE9wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3QVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTE81U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMUEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0FwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9Im1fIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMUFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3QTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTaG93Q29kZWdlbkRsZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxQNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3QkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMUVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3QlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOb0NsYXNzQ3VzdG9tRGxnIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMUkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdCcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxSWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMUnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdCNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ1Byb2plY3ROYW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMU0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0NKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxTcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0NaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlVGFicyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxTNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3Q3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMVFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3QzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMVDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxVSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3REpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0iaW50Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMVVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3RFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJMb2NhbFByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxVNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdEcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxWWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMVnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdENVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVKYXZhRG9jVGFncyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxWNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdFSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxXWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMV3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdFWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsSG9tZVN1ZmZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxXNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdFcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxYWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMWHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdFNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdUZXh0MiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxYNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdGSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxZWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMWXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdGWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkhvbWVTdWZmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMWTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxaSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3RnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMWlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3RjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWQUphdmFXb3JraW5nRm9sZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFo1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMYUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0dKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxhcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0daU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdEVKQlZlcnNpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMYTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxiSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3R3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMYlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3RzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNYXhOdW1DaGFycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxiNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYUg3SEpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0iODAiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxjWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMY3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdIWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdOYW1lMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxjNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdIcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxkWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMZHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdINVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXREVERMb2NhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxkNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdJSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxlWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMZXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdJWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdBcHBseTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMZTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxmSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3SXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMZlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3STVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZVJvc2VJRCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxmNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3SkpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxncFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0paU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RvcE9uRXJyb3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMZzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxoSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN0pwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxocFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0o1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY1ZlcnNpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMaDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxpSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN0tKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGlaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxpcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0taU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0RlZmF1bHRBdXRob3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMaTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxqSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3S3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMalpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3SzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJPcGVuQnJhY2VNZXRob2RTdHlsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxqNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGtKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3TEpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGtaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxrcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0xaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQXN0ZXJpc2tDb21tZW50U3R5bGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMazVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxsSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN0xwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGxaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxscFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0w1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJpbWFyeUtleVN1ZmZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxsNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTG1KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdNSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxtWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMbXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdNWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVkaXRvciIgdHlwZT0iXy1hSDY4cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMbTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxuSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYUg3TXBTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hSDY4NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxuWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMbnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdNNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdBcHBseTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMbjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxvSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3TkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMb1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTG9wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3TlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRKMkVFSmF2YWRvYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxvNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3TnBTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxwcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN041U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3BhY2luZ0l0ZW1zIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMcUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOEs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hSDdPSlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSIzIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMcVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3T1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJEVERMb2NhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxxNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdPcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxyWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMcnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdPNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3UEpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxzcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1BaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ1RleHQzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMdEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1BwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx0cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1A1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVtb3RlU3VmZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMdUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1FKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx1cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1FaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVmZXJlbmNlQ2xhc3NwYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMdkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1FwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx2cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1E1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iT3BlbkJyYWNlQ2xhc3NTdHlsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx2NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3UkpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx3cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1JaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTG9jYWxTdWZmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMdzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3UnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMeFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3UjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWTSIgdHlwZT0iXy1hQjBvNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMeDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx5SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYUg3U0pTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hQjBwSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx5WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMeXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdTWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx5NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdTcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx6WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMenBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdTNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZVByZWZpeGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHo1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMMEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdUSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkwwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMMHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdUWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW5TdWZmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMMDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkwxSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3VHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMMVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3VDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuUHJlZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMMkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1VKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDJaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkwycFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1VaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU0NDQ29tbWVudCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkwyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3VXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMM1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3VTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSb290RGlyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMNEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1ZKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw0cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1ZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ1RleHQxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMNUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1ZwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw1cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ05hbWUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMNkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1dKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw2cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1daU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQXV0b1N5bmMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMNjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw3SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN1dwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw3cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1c1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0F1dGhvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3WEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMOFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3WFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw4NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3WHBTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDlaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw5cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1g1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU0NDUHJvamVjdFNvdXJjZVJvb3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMOTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkwtSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3WUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMLVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTC1wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3WVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhQ29tbWVudFN0eWxlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTC01U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMX0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdZcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxfWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMX3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdZNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTF81U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSRUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1pKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InZvaWQiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJFWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSRXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdaWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdOYW1lMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJFNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdacFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJGWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSRnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdaNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NEZWZhdWx0VmVyc2lvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJGNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdhSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJHWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSR3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdhWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vdFNob3dSb3NlSUREbGciPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSRzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJISlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN2FwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJIcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN2E1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVtb3RlUHJlZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSSUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN2JKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUklaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJJcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN2JaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlU3BhY2VzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSSkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0JrSlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSSlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9Ca1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbGFzc1ZhcmlhYmxlUHJlZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUko1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSS0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQmtwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InNfIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSS1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUktwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CazVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhZG9jRGVmYXVsdFNpbmNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUks1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSTEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQmxKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkxaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJMcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQmxaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU0NDU2VsZWN0ZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSTDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJNSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQmxwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUk1aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJNcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQmw1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSG9tZVByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJNNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUk5KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0JtSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJOWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSTnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JtWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsSG9tZVByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJONVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUk9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0JtcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJPWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhST3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JtNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNsYXNzUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJPNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0JuSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJQWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSUHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JuWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNvdXJjZUNvbnRyb2wiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSUDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJRSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQm5wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJRcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQm41U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY051bUFzdGVyaXNrcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJRNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYU9Cb0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSUlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9Cb1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcmltYXJ5S2V5UHJlZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSU0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQm9wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJTcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYUIwbjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNb2RlbF9kZWZhdWx0X19Qcm9qZWN0IiBtZW1iZXJFbmQ9Il8tYUIwb0pTa0VkbWphdVNqRzhxTzJBIF8tYUIwb3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJTNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJUSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYUIwb0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fUHJvamVjdCIgdHlwZT0iXy1hQjBtWlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFCMG41U2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJUWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFCMG9aU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJVSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYUIwbzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19Qcm9qZWN0Vk1UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJVWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJVcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYUIwcEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYUIwcFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFCMHBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJVNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFCMHA1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWljcm9zb2Z0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFCMHFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hQjBxWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSVlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJWcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hQjBxcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IklCTSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hSDY4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYUg2OFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSV0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYUg2OHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19Qcm9qZWN0RWRpdG9yVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSV1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSV3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFINjg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQnVpbHRJbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hSDY5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYUg2OVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMTAwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSWEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYUg2OXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJXaW5kb3dzU2hlbGwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYUg2OTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFINi1KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjEwMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJYWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il8tYU9CbzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X0VKQl9fQ2xhc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQnBKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQnBaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CcHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSWDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQnA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CcUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JySlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQWN0b3IiIGFzc29jaWF0aW9uPSJfLWFPQnFaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJZSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUllaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOW5kY2E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQnNKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRDbGFzcyIgYXNzb2NpYXRpb249Il8tYU9CclpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUllwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSWTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX204OHV4cTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CdEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJEVudW1lcmF0aW9uIiBhc3NvY2lhdGlvbj0iXy1hT0JzWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSWkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJaWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUmVhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0J1SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkSW50ZXJmYWNlIiBhc3NvY2lhdGlvbj0iXy1hT0J0WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSWnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJaNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSm9xODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0J2SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkU2lnbmFsIiBhc3NvY2lhdGlvbj0iXy1hT0J1WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSYUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJhWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSnphODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0J3SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkUHJpbWl0aXZlVHlwZSIgYXNzb2NpYXRpb249Il8tYU9CdlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSYTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205YlJzYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9COEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJOYW1lSW5KQVIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSYkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJiWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9COFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSYnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9COHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSY0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJjWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQjg1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJjNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQjlKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldGdldEluZm8iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSZEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJkWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9COVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSZHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9COXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJlSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9COTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSZXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CLUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW50SGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSZlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0ItWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJmcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSZjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0ItcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSZ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJnWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQi01U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJnNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQl9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSaEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJoWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9CX1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSaHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CX3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JIZWFkZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSaVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQl81U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJpNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0FKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRlbnRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSalpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQ0FaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJqNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0FwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmtKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSa1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0NBNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJrcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSazVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NCSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmxKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSbFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQ0JaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmxwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJsNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0JwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSbUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJtWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9DQjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSbXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUm01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DQ0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJuSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUm5aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0NDWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJucFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSbjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NDcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJGb3J3YXJkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUm9KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSb1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0NDNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJvcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSbzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NESlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhScEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQ0RaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJwNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0RwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnFaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9DRDVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhScXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DRUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWZlcmVuY2VzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSclpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQ0VaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJyNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0VwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSc0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQ0U1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJzNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0ZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSdEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJ0WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQ0ZaU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ0cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSdDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NGcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9DRjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSdXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DR0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZpbmFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9DR1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSdnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DR3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uVHlwZSIgdHlwZT0iXy1hT0J3WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSd0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJ3WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYU9DRzVTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hT0J3cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ3cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSdzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NISlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc2FibGVBdXRvU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9DSFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSeHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUng1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJTUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSeVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hVUlNWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSeTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlNcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJNUF9FeHRlbmRfQ01QIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSelpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hVUlNNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ6cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSejVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlOSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlRyYW5zYWN0aW9uVHlwZSIgdHlwZT0iXy1hT0I0cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSMEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFIwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYVVJTlpTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hT0I0NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFIwcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSMDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlOcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJJbmNsdWRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSMVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hVUlONVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFIxcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSMTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlPSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFIySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hVUlPWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFIycFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSMjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlPcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSM0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFIzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYVVJTzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSM3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJUEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RGF0ZUhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI0SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJUFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSNHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJUHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJUDVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSNXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJUUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJUVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSNnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJUXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZWN1cml0eVJvbGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSN1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFVSVE1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSVJKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSOEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFVSVJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI4NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSVJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hVUlSNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSOTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlTSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUi1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSLVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hVUlTWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFItcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSLTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlTcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJfSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUl9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJUzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSX3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUl81U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJVEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JDb29raWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTQUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNBWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYVVJVFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTQXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0E1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJVHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJWZXJzaW9uIiB0eXBlPSJfLWFPQjZaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNCSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0JaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hVUlUNVNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFPQjZwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0JwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNCNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUGVyc2lzdGVuY2VUeXBlIiB0eXBlPSJfLWFPQjJKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNDSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0NaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hYU8wWlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFPQjJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0NwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNDNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RydWN0b3JJcyIgdHlwZT0iXy1hT0J5NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTREpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNEWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYWFPMDVTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hT0J6SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNEcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTRDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU8xSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRPbmx5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0VKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTRVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU8xWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNFcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTRTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU8xcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlX1hNTF9ERCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNGSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0ZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPMTVTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0ZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNGNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzJKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldE5hbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTR0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNHWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWFPMlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTR3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0c1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPMnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNISlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0haU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hYU8yNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNIcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTSDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU8zSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNueEZhY3RvcnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTSUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNJWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWFPM1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTSXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0k1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPM3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTSkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNKWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFhTzM1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0pwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNKNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVlbnRyYW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0tKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTS1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU80WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNLcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTSzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU80cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0xKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTTFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFhTzQ1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0xwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNMNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU01KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTTVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFhTzVaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU01wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNNNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVDb2RlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU05KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTTlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU81NVNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTTnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU041U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPNkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNPSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU09aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hYU82WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNPcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTTzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU82cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSFRNTCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNQSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1BaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPNjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTUHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1A1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPN0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNRSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1FaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hYU83WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNRcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTUTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFPQnFaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQWN0b3JfRGVmYXVsdF9FSkJfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYU9CcXBTa0VkbWphdVNqRzhxTzJBIF8tYU9CckpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNSSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNSWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYU9CcXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kRGVmYXVsdF9FSkJfX0NsYXNzIiB0eXBlPSJfLWFPQm81U2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tYU9CcVpTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1JwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTUjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYU9CcTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTU0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1NaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYU9CclpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbGFzc19EZWZhdWx0X0VKQl9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hT0JycFNrRWRtamF1U2pHOHFPMkEgXy1hT0JzSlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1NwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1M1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hT0JycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X0VKQl9fQ2xhc3MiIHR5cGU9Il8tYU9CbzVTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hT0JyWlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTVEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNUWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hT0JyNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNUcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTVDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hT0JzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVudW1lcmF0aW9uX0RlZmF1bHRfRUpCX19DbGFzcyIgbWVtYmVyRW5kPSJfLWFPQnNwU2tFZG1qYXVTakc4cU8yQSBfLWFPQnRKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTVUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTVVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFPQnNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfRUpCX19DbGFzcyIgdHlwZT0iXy1hT0JvNVNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFPQnNaU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNVcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1U1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFPQnM1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1ZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNWWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFPQnRaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW50ZXJmYWNlX0RlZmF1bHRfRUpCX19DbGFzcyIgbWVtYmVyRW5kPSJfLWFPQnRwU2tFZG1qYXVTakc4cU8yQSBfLWFPQnVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTVnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTVjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFPQnRwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfRUpCX19DbGFzcyIgdHlwZT0iXy1hT0JvNVNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFPQnRaU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNXSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1daU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFPQnQ1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1dwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNXNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFPQnVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2lnbmFsX0RlZmF1bHRfRUpCX19DbGFzcyIgbWVtYmVyRW5kPSJfLWFPQnVwU2tFZG1qYXVTakc4cU8yQSBfLWFPQnZKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTWEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTWFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFPQnVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfRUpCX19DbGFzcyIgdHlwZT0iXy1hT0JvNVNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFPQnVaU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNYcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1g1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFPQnU1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1lKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNZWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFPQnZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJpbWl0aXZlVHlwZV9EZWZhdWx0X0VKQl9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hT0J2cFNrRWRtamF1U2pHOHFPMkEgXy1hT0J3SlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1lwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1k1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hT0J2cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X0VKQl9fQ2xhc3MiIHR5cGU9Il8tYU9CbzVTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hT0J2WlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTWkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNaWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hT0J2NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNacFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTWjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFPQndaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9FSkJfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNhSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNhWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9Cd3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQnc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0J4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTYXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNhNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0J4WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlbGVzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0J4cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CeDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU2JKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTYlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CeUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWZ1bCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0J5WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CeXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU2JwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTYjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYU9CeTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X0VKQl9fQ2xhc3NDdG9yX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTY0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTY1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQnpKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHVibGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQnpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0J6cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNjcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU2M1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQno1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJvdGVjdGVkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjBKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0IwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2MyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNkSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU2RaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQjBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJpdmF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0IwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CMUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTZHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNkNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0IxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InBhY2thZ2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYU9CMXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQjE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjY1Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU2VKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTZVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYU9CMkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X0VKQl9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNlcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNlNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CMlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0IyNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYc0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFhzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0IzSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYU9CM1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQjNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFhzcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQjM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0I0WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYdEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh0WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1hT0I0cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfRUpCX19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0I0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0I1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CNVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYdVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CNXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0I2SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMTIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYdXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh1NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1hT0I2WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfRUpCX19DbGFzc0VKQlZlcnNpb25fU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh2WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CNnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIyLjAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYU9CNjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQjdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIzMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh2cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQjdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMS54Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0I3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMzEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYd0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh3WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfLWFhTzdwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fT3BlcmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hYU83NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYU84SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2F0ZWdvcnlOYW1lIiB2YWx1ZT0iSmF2YSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhTzhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJzdXBwcmVzc2VkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hYU84cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhTzg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJ0YWdnZWRWYWx1ZVNldCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPOTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJE9wZXJhdGlvbiIgYXNzb2NpYXRpb249Il8tYWFPOUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYeEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205QzJqYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPLUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZXBsYWNlRXhpc3RpbmdDb2RlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYeHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU8tWlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYeDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPLXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh5WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHlwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPLTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYeTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPX0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYenBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU9fWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh6NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYMEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU9fcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYMHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU9fNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFgwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYMUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYVBBSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5hdGl2ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFgxWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFQQVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYMTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFQQXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJBYnN0cmFjdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFgyWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFQQTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYMjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFQQkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTeW5jaHJvbml6ZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYM1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFgzcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFhUEJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg0SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhUEJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYNHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYVBCNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg0NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYNUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFhTzlKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iT3BlcmF0aW9uX2RlZmF1bHRfX09wZXJhdGlvbiIgbWVtYmVyRW5kPSJfLWFhTzlaU2tFZG1qYXVTakc4cU8yQSBfLWFhTzk1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYNVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYNXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFhTzlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX09wZXJhdGlvbiIgdHlwZT0iXy1hYU83cFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFhTzlKU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg1NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFhTzlwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg2cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1hYVBDSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX1JvbGUiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUENaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhUENwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWFQQzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYNjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUERKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWFQRFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYVBFWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkUHJvcGVydHkiIGFzc29jaWF0aW9uPSJfLWFhUERwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg3SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOUMxbGE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZFdyaXRlIiB0eXBlPSJfLWFhUEVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg3cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hZ1ZjNVNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFhUEU1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW5pdGlhbFZhbHVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYODVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFnVmRaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmRwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJvcGVydHlUeXBlIiB0eXBlPSJfLWFhUEhKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hZ1ZkNVNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFhUEhaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWC1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFgtWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWC1wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYLTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1ZlWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFhfSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYX1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZlcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWF9wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYXzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1ZlNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlBSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZQVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZmSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlRyYW5zaWVudCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlBcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWZlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZQkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWZnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWb2xhdGlsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlCcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWZjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZQ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWZ0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJc05hdmlnYWJsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlDcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWZ1pTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWURKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlEWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmdwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW5kaXZpZHVhbENoYW5nZU1ndCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlEcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWZzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZRUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWaEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXJDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlFcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1ZoWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlGSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZRlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFhUERwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJvcGVydHlfZGVmYXVsdF9fUm9sZSIgbWVtYmVyRW5kPSJfLWFhUEQ1U2tFZG1qYXVTakc4cU8yQSBfLWFhUEVaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZRnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZRjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFhUEQ1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX1JvbGUiIHR5cGU9Il8tYWFQQ0pTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hYVBEcFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZR0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlHWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hYVBFSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlHcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZRzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFhUEVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fUm9sZVJlYWRXcml0ZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hYVBFNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWQgJmFtcDsgV3JpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWFQRkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhUEZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjgxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZSDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWFQRnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkIE9ubHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWFQRjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhUEdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjgyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZSVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWFQR1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJXcml0ZSBPbmx5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUEdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYVBHNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI4MyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlJcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFhUEhKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fUm9sZUJlYW5Qcm9wZXJ0eV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hYVBIWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vdCBBIFByb3BlcnR5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUEhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYVBINVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI3MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlKcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUo1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFhUElKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2ltcGxlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUElaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYVBJcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI3MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlLSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUtaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFhUEk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQm91bmQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWFQSkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhUEpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjczIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUtwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZSzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWFQSnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJhaW5lZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1ZjSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWY1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNzQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZTEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlMWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfLWFnVmhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSHR0cF9TZXJ2bGV0X19DbGFzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWaDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWaUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhdGVnb3J5TmFtZSIgdmFsdWU9IkphdmEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1ZpWlNrRWRtamF1U2pHOHFPMkEiIGtleT0ic3VwcHJlc3NlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlMcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWaXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1ZpNVNrRWRtamF1U2pHOHFPMkEiIGtleT0idGFnZ2VkVmFsdWVTZXQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRBY3RvciIgYXNzb2NpYXRpb249Il8tYWdWakpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUw1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZTUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205bmRjYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWazVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJENsYXNzIiBhc3NvY2lhdGlvbj0iXy1hZ1ZrSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZTVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlNcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTg4dXhxODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZsNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkRW51bWVyYXRpb24iIGFzc29jaWF0aW9uPSJfLWFnVmxKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlNNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWU5KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOWJSZWE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVm01U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRJbnRlcmZhY2UiIGFzc29jaWF0aW9uPSJfLWFnVm1KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlOWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWU5wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOVZKb3E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVm41U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRTaWduYWwiIGFzc29jaWF0aW9uPSJfLWFnVm5KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlONVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWU9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOVZKemE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVm81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRQcmltaXRpdmVUeXBlIiBhc3NvY2lhdGlvbj0iXy1hZ1ZvSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZT1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlPcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUnNhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1YwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQk5hbWVJbkpBUiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlPNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1YxSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlQWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZUHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1YxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlQNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWMXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZUVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWMTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Z2V0SW5mbyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlRNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1YySlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlSWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZUnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1YyWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZU0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1YycFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlTWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZU3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1YyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbnRIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZUzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlUSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVjNKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlUcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjNaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlUNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWM3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZVVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWMzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbXBGaWVsZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlVNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1Y0SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlWWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZVnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlWNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1Y0cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlXWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZV3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZVzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlYSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWdWNUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZWFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWNVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0aWMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZWDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlZSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVjVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVlaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlZcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZWTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlaSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWdWNkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZWlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWNlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlaNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1Y2cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlhWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZYXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZYkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFnVjdKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWJaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlicFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckZvcndhcmQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZYjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFljSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVjdwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFljcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFljNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWOEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWOFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29va2llIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZZUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1Y4cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFllWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZZXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y4NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZmVyZW5jZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlmSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYW1jRUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jRVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGV4dFJlZiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlmNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jRXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZ1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jRTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlnNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jRkpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlocFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0ZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldElzU2VjdXJlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZaUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNGcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlpWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZaXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNGNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRmluYWxpemVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZakpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNHSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlqWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZanBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNHWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25UeXBlIiB0eXBlPSJfLWFnVnBKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlqNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWtKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hbWNHcFNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFnVnBaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWtaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlrcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0c1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzYWJsZUF1dG9TeW5jIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWs1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZbEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNISlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlsWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZbHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNIWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZbDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFltSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY0hwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWW1aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFltcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0g1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQk1QX0V4dGVuZF9DTVAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZbTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFluSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY0lKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWW5aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlucFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0laU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVHJhbnNhY3Rpb25UeXBlIiB0eXBlPSJfLWFnVnhaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFluNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWW9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hbWNJcFNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFnVnhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWW9aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlvcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0k1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckluY2x1ZGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZbzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlwSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY0pKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlwcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0paU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hbWNKcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlxWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZcXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNKNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlxNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hbWNLSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlyWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZcnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNLWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXREYXRlSGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZc0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNLcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlzWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZc3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNLNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZdEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNMSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl0WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZdHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNMWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25TeW5jIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZdUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNMcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl1WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZdXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNMNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlY3VyaXR5Um9sZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZdTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFl2SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYW1jTUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZdlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jTVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJc1NpbmdsZVRocmVhZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl2NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jTXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZd1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jTTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jTkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZeFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jTlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZeUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFtY05wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXlaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFl5cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY041U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZekpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNPSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl6WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZenBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNPWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckNvb2tpZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl6NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hbWNPcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFkwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZMHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNPNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlZlcnNpb24iIHR5cGU9Il8tYWdWekpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZMUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFtY1BKU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tYWdWelpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZMVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jUFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJQZXJzaXN0ZW5jZVR5cGUiIHR5cGU9Il8tYWdWcnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZMkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFtY1BwU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tYWdWcjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZMlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jUDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJ1Y3RvcklzIiB0eXBlPSJfLWFnVnVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFkyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hbWNRSlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFnVnVaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFkzcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY1FaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZE9ubHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZMzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk0SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY1FwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk0cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY1E1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVfWE1MX0REIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZNUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hc2lzSlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZNVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpc1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0TmFtZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk1NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hc2lzcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZNnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2lzNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlhNTEZpbGVQYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZN0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFzaXRKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk3cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaXRaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ254RmFjdG9yeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWThKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hc2l0cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk4WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZOHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2l0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk4NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYXNpdUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZOVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTlwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpdVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWVudHJhbnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZOTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFktSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFzaXVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWS1aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFktcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaXU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZLTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlfSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYXNpdkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZX1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWV9wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpdlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZXzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFpBSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYXNpdnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRaQVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWkFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpdjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUNvZGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRaQTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFpCSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFzaXdKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFpCWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaQnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2l3WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaQ0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFzaXdwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFpDcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaXc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVIVE1MIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaREpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hc2l4SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFpEWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaRHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2l4WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaRUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFzaXhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFpFcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYWdWakpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJBY3Rvcl9IdHRwX1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYWdWalpTa0VkbWphdVNqRzhxTzJBIF8tYWdWajVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVVSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVVWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYWdWalpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kSHR0cF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1hZ1ZocFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFnVmpKU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVVcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFnVmpwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVWWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFnVmtKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ2xhc3NfSHR0cF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLWFnVmtaU2tFZG1qYXVTakc4cU8yQSBfLWFnVms1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplVnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplVjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFnVmtaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJEh0dHBfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tYWdWaHBTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hZ1ZrSlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplV0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVXWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hZ1ZrcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVXcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplVzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hZ1ZsSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVudW1lcmF0aW9uX0h0dHBfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hZ1ZsWlNrRWRtamF1U2pHOHFPMkEgXy1hZ1ZsNVNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hZ1ZsWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRIdHRwX1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLWFnVmhwU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tYWdWbEpTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplWDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYWdWbHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplWUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYWdWbUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbnRlcmZhY2VfSHR0cF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLWFnVm1aU2tFZG1qYXVTakc4cU8yQSBfLWFnVm01U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplWXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplWTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFnVm1aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJEh0dHBfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tYWdWaHBTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hZ1ZtSlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplWkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVaWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hZ1ZtcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVacFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplWjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hZ1ZuSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNpZ25hbF9IdHRwX1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYWdWblpTa0VkbWphdVNqRzhxTzJBIF8tYWdWbjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVhSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVhWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYWdWblpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kSHR0cF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1hZ1ZocFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFnVm5KU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVhcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFnVm5wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamViWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFnVm9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJpbWl0aXZlVHlwZV9IdHRwX1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYWdWb1pTa0VkbWphdVNqRzhxTzJBIF8tYWdWbzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVicFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamViNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYWdWb1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kSHR0cF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1hZ1ZocFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFnVm9KU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVjSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFnVm9wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVjNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYWdWcEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIdHRwX1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVkSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVkWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWcFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVnBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1ZwNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplZHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVkNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1ZxSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlbGVzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1ZxWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWcXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWcTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWZ1bCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1ZySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWclpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYWdWcnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIdHRwX1NlcnZsZXRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplZkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFnVnI1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1ZzSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWc1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWc3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVnM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1Z0SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplZ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVnWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z0cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWdDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYWdWdUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIdHRwX1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z1cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWdTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplaHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVoNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z2SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByb3RlY3RlZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWdnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplaUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVpWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByaXZhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWd0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVndaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjY0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplaTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWd3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwYWNrYWdlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVnc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1Z4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2NSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVqSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFnVnhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWo1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z4cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z4NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWeUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWtKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmpla1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWeVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVnlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1Z5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMTIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmpla3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVrNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1hZ1Z6SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ikh0dHBfU2VydmxldF9fQ2xhc3NFSkJWZXJzaW9uX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplbEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplbFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFnVnpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMi4wIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVnpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1Z6NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplbHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVsNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1YwSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjEueCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1YwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWMHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjMxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZW1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplbVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1hc2l4NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX01vZHVsZVNwZWMiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFzaXlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFzaXlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYXNpeXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplbXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFzaXk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYXNpekpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2kwSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQ29tcG9uZW50IiBhc3NvY2lhdGlvbj0iXy1hc2l6WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplbTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVuSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSmpLODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2kwWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNtSWRlbnRpZmljYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplblpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVucFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYXNpMHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplbjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZW9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpMDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb3B5cmlnaHROb3RpY2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplb1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVvcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYXNpMUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplbzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZXBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hc2l6WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbXBvbmVudF9kZWZhdWx0X19Nb2R1bGVTcGVjIiBtZW1iZXJFbmQ9Il8tYXNpenBTa0VkbWphdVNqRzhxTzJBIF8tYXNpMEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVwcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYXNpenBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fTW9kdWxlU3BlYyIgdHlwZT0iXy1hc2l4NVNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFzaXpaU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZXFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFzaXo1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZXFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci08L3VtbDpQcm9maWxlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvSmF2YS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvSmF2YS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjNiNWRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL0phdmEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jTW9uIE1hciAxNCAxMToyMDoyNyBFU1QgMjAwNQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQlJlZmVyZW5jZXM9RUpCUmVmZXJlbmNlcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSmF2YWRvY0RlZmF1bHRWZXJzaW9uPUphdmFkb2NEZWZhdWx0VmVyc2lvbgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyPUdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplcgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcz1TZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0RWRpdG9yVHlwZV9fV2luZG93c1NoZWxsPVdpbmRvd3NTaGVsbAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCU2Vzc2lvblN5bmM9RUpCU2Vzc2lvblN5bmMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RWTVR5cGVfX1N1bj1TdW4KLUphdmFfX2RlZmF1bHRfX1JvbGU9ZGVmYXVsdAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdFZNVHlwZV9fTWljcm9zb2Z0PU1pY3Jvc29mdAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnM9TWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1NDQ0NvbW1lbnQ9U0NDQ29tbWVudAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXM9TWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJQZXJzaXN0ZW5jZVR5cGU9RUpCUGVyc2lzdGVuY2VUeXBlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0lzU2luZ2xlVGhyZWFkPUlzU2luZ2xlVGhyZWFkCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXM9U2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldEluaXRQYXJhbWV0ZXI9U2VydmxldEluaXRQYXJhbWV0ZXIKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlSFRNTD1HZW5lcmF0ZUhUTUwKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1N0b3BPbkVycm9yPVN0b3BPbkVycm9yCi1KYXZhX19kZWZhdWx0X19Sb2xlUmVhZFdyaXRlX1NldF9fUmVhZFwgT25seT1SZWFkIE9ubHkKLUphdmFfX2RlZmF1bHRfX0NsYXNzQ3Rvcl9TZXRfX3B1YmxpYz1wdWJsaWMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRUpCQ21wRmllbGQ9RUpCQ21wRmllbGQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX01ldGhvZEZvckhlYWRlcnM9TWV0aG9kRm9ySGVhZGVycwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fTWV0aG9kRm9ySGVhZGVycz1NZXRob2RGb3JIZWFkZXJzCi1KYXZhX19kZWZhdWx0X19PcGVyYXRpb25fX1N0YXRpYz1TdGF0aWMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NDdG9yX1NldD1DdG9yX1NldAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJSZWZlcmVuY2VzPUVKQlJlZmVyZW5jZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldEludEhlYWRlcj1TZXJ2bGV0SW50SGVhZGVyCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRGlzcGF0Y2hlckZvcndhcmQ9RGlzcGF0Y2hlckZvcndhcmQKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NDdG9yX1NldF9fcHJpdmF0ZT1wcml2YXRlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TQ0NQcm9qZWN0TmFtZT1TQ0NQcm9qZWN0TmFtZQotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldENvb2tpZT1TZXJ2bGV0Q29va2llCi1KYXZhX19kZWZhdWx0X19Sb2xlX19Qcm9wZXJ0eVR5cGU9UHJvcGVydHlUeXBlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRUpCTmFtZUluSkFSPUVKQk5hbWVJbkpBUgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19NZXRob2RGb3JDb29raWU9TWV0aG9kRm9yQ29va2llCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0Q29va2llPVNlcnZsZXRDb29raWUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJDbXBGaWVsZD1FSkJDbXBGaWVsZAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU3RyaWN0ZnA9U3RyaWN0ZnAKLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbj1kZWZhdWx0Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VTcGFjZXM9VXNlU3BhY2VzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRGlzcGF0Y2hlckluY2x1ZGU9RGlzcGF0Y2hlckluY2x1ZGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0TmFtZT1TZXJ2bGV0TmFtZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldElzU2VjdXJlPVNlcnZsZXRJc1NlY3VyZQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19EaXNwYXRjaGVyRm9yd2FyZD1EaXNwYXRjaGVyRm9yd2FyZAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCU2Vzc2lvblR5cGU9RUpCU2Vzc2lvblR5cGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJUcmFuc2FjdGlvblR5cGU9RUpCVHJhbnNhY3Rpb25UeXBlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJWZXJzaW9uPUVKQlZlcnNpb24KLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRYTUxGaWxlUGF0aD1TZXJ2bGV0WE1MRmlsZVBhdGgKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJWZXJzaW9uX1NldD1FSkJWZXJzaW9uX1NldAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19EaXNwYXRjaGVySW5jbHVkZT1EaXNwYXRjaGVySW5jbHVkZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fUHJpbWFyeUtleVN1ZmZpeD1QcmltYXJ5S2V5U3VmZml4Ci1KYXZhX19kZWZhdWx0X19PcGVyYXRpb25fX0dlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm49R2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldFJlcXVlc3RQYXJhbWV0ZXI9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1JlbW90ZVN1ZmZpeD1SZW1vdGVTdWZmaXgKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZV9fVm9sYXRpbGU9Vm9sYXRpbGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJbml0UGFyYW1ldGVyPVNlcnZsZXRJbml0UGFyYW1ldGVyCi1KYXZhX19kZWZhdWx0X19Sb2xlUmVhZFdyaXRlX1NldF9fV3JpdGVcIE9ubHk9V3JpdGUgT25seQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVkFKYXZhV29ya2luZ0ZvbGRlcj1WQUphdmFXb3JraW5nRm9sZGVyCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3ByaXZhdGU9cHJpdmF0ZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzPUVKQkVudmlyb25tZW50UHJvcGVydGllcwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJDbnhGYWN0b3J5PUVKQkNueEZhY3RvcnkKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZVJlYWRXcml0ZV9TZXQ9UmVhZC9Xcml0ZV9TZXQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXM9U2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcwotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlUmVhZFdyaXRlX1NldF9fV3JpdGVcIE9ubHk9V3JpdGUgT25seQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQmVhblN1ZmZpeD1CZWFuU3VmZml4Ci1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldEhlYWRlcj1TZXJ2bGV0SGVhZGVyCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0X19Db25zdHJhaW5lZD1Db25zdHJhaW5lZAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQlZlcnNpb249RUpCVmVyc2lvbgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU3RhdGljPVN0YXRpYwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX01ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzPU1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fR2VuZXJhdGVGaW5hbGl6ZXI9R2VuZXJhdGVGaW5hbGl6ZXIKLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbl9fUmVwbGFjZUV4aXN0aW5nQ29kZT1SZXBsYWNlRXhpc3RpbmdDb2RlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQk5hbWVJbkpBUj1FSkJOYW1lSW5KQVIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0Q29va2llPVNlcnZsZXRDb29raWUKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQ9RUpCU2Vzc2lvblR5cGVfU2V0Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TQ0NQcm9qZWN0U291cmNlUm9vdD1TQ0NQcm9qZWN0U291cmNlUm9vdAotSmF2YV9fZGVmYXVsdF9fT3BlcmF0aW9uX19BYnN0cmFjdD1BYnN0cmFjdAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldD1FSkJTZXNzaW9uVHlwZV9TZXQKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0lzU2luZ2xlVGhyZWFkPUlzU2luZ2xlVGhyZWFkCi1KYXZhX19kZWZhdWx0X19Sb2xlQmVhblByb3BlcnR5X1NldF9fQm91bmQ9Qm91bmQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fQk1QX0V4dGVuZF9DTVA9Qk1QX0V4dGVuZF9DTVAKLUphdmFfX2RlZmF1bHRfX1JvbGVfX1JlYWRXcml0ZT1SZWFkL1dyaXRlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19EZWZhdWx0U2VydmxldFZlcnNpb249RGVmYXVsdFNlcnZsZXRWZXJzaW9uCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19CZWFuPUJlYW4KLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbl9fU3RyaWN0ZnA9U3RyaWN0ZnAKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0xvY2FsUHJlZml4PUxvY2FsUHJlZml4Ci1KYXZhX19kZWZhdWx0X19DbGFzc0N0b3JfU2V0X19wcml2YXRlPXByaXZhdGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0RGF0ZUhlYWRlcj1TZXJ2bGV0RGF0ZUhlYWRlcgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19TZXJ2bGV0Q29va2llPVNlcnZsZXRDb29raWUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0RlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlPURlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3B1YmxpYz1wdWJsaWMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0N0b3JfU2V0X19wdWJsaWM9cHVibGljCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SGVhZGVyTmFtZXM9U2VydmxldEhlYWRlck5hbWVzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Sb290RGlyPVJvb3REaXIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJSZWVudHJhbnQ9RUpCUmVlbnRyYW50Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Ob3RTaG93Um9zZUlERGxnPU5vdFNob3dSb3NlSUREbGcKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0hvbWVTdWZmaXg9SG9tZVN1ZmZpeAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJQZXJzaXN0ZW5jZVR5cGU9RUpCUGVyc2lzdGVuY2VUeXBlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldElzU2VjdXJlPVNlcnZsZXRJc1NlY3VyZQotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzcz1EZWZhdWx0X1NlcnZsZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldERhdGVIZWFkZXI9U2VydmxldERhdGVIZWFkZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0xvY2FsSG9tZVByZWZpeD1Mb2NhbEhvbWVQcmVmaXgKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0Rpc3BhdGNoZXJGb3J3YXJkPURpc3BhdGNoZXJGb3J3YXJkCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0dlbmVyYXRlX1hNTF9ERD1HZW5lcmF0ZV9YTUxfREQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRGlzYWJsZUF1dG9TeW5jPURpc2FibGVBdXRvU3luYwotSmF2YV9fZGVmYXVsdF9fTW9kdWxlU3BlYz1kZWZhdWx0Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VyRGVmaW5lVGFnQXBwbHkzPVVzZXJEZWZpbmVUYWdBcHBseTMKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZV9fSW5kaXZpZHVhbENoYW5nZU1ndD1JbmRpdmlkdWFsQ2hhbmdlTWd0Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0X19CZWFuPUJlYW4KLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdBcHBseTI9VXNlckRlZmluZVRhZ0FwcGx5MgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRGlzcGF0Y2hlckluY2x1ZGU9RGlzcGF0Y2hlckluY2x1ZGUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdBcHBseTE9VXNlckRlZmluZVRhZ0FwcGx5MQotSmF2YV9fZGVmYXVsdF9fTW9kdWxlU3BlY19fQ21JZGVudGlmaWNhdGlvbj1DbUlkZW50aWZpY2F0aW9uCi1KYXZhX19kZWZhdWx0X19Sb2xlQmVhblByb3BlcnR5X1NldD1CZWFuUHJvcGVydHlfU2V0Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19EaXNwYXRjaGVySW5jbHVkZT1EaXNwYXRjaGVySW5jbHVkZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fR2xvYmFsSW1wb3J0cz1HbG9iYWxJbXBvcnRzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fTWV0aG9kRm9ySGVhZGVycz1NZXRob2RGb3JIZWFkZXJzCi1KYXZhX19kZWZhdWx0X19Sb2xlX19Db250YWluZXJDbGFzcz1Db250YWluZXJDbGFzcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQmVhblByZWZpeD1CZWFuUHJlZml4Ci1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVfX1JlYWRXcml0ZT1SZWFkL1dyaXRlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldFJlcXVlc3REaXNwYXRjaGVyPVNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlUHJlZml4ZXM9VXNlUHJlZml4ZXMKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZVJlYWRXcml0ZV9TZXRfX1JlYWRcICZcIFdyaXRlPVJlYWQgJiBXcml0ZQotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fSXNTaW5nbGVUaHJlYWQ9SXNTaW5nbGVUaHJlYWQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXI9R2VuZXJhdGVTdGF0aWNJbml0aWFsaXplcgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NDdG9yX1NldF9fcHJvdGVjdGVkPXByb3RlY3RlZAotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlUmVhZFdyaXRlX1NldF9fUmVhZFwgT25seT1SZWFkIE9ubHkKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX01ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzPU1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQlJlZW50cmFudD1FSkJSZWVudHJhbnQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQlNlY3VyaXR5Um9sZXM9RUpCU2VjdXJpdHlSb2xlcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRmluYWw9RmluYWwKLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbl9fTmF0aXZlPU5hdGl2ZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQlNlc3Npb25TeW5jPUVKQlNlc3Npb25TeW5jCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19NZXRob2RGb3JDb29raWU9TWV0aG9kRm9yQ29va2llCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXQ9Q3Rvcl9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldE5hbWU9U2VydmxldE5hbWUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQlBlcnNpc3RlbmNlVHlwZT1FSkJQZXJzaXN0ZW5jZVR5cGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlSFRNTD1HZW5lcmF0ZUhUTUwKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlcj1TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIKLUphdmFfX2RlZmF1bHRfX1JvbGVfX0ZpbmFsPUZpbmFsCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGg9U2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzQ3Rvcl9TZXRfX3Byb3RlY3RlZD1wcm90ZWN0ZWQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzPUVKQkVudmlyb25tZW50UHJvcGVydGllcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXRfX0JlYW49QmVhbgotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlX19GaW5hbD1GaW5hbAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWZ1bD1TdGF0ZWZ1bAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVGaW5hbGl6ZXI9R2VuZXJhdGVGaW5hbGl6ZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1NwYWNpbmdJdGVtcz1TcGFjaW5nSXRlbXMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJDbnhGYWN0b3J5PUVKQkNueEZhY3RvcnkKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0VKQkRURExvY2F0aW9uPUVKQkRURExvY2F0aW9uCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldD1FSkJUcmFuc2FjdGlvblR5cGVfU2V0Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3B1YmxpYz1wdWJsaWMKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldD1FSkJUcmFuc2FjdGlvblR5cGVfU2V0Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Tb3VyY2VDb250cm9sPVNvdXJjZUNvbnRyb2wKLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbl9fRmluYWw9RmluYWwKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQlRyYW5zYWN0aW9uVHlwZT1FSkJUcmFuc2FjdGlvblR5cGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19HZW5lcmF0ZUhUTUw9R2VuZXJhdGVIVE1MCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TZXJ2bGV0RFRETG9jYXRpb249U2VydmxldERURExvY2F0aW9uCi1KYXZhX19kZWZhdWx0X19Sb2xlX19Jbml0aWFsVmFsdWU9SW5pdGlhbFZhbHVlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXQ9RUpCVmVyc2lvbl9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldEhlYWRlck5hbWVzPVNlcnZsZXRIZWFkZXJOYW1lcwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQlNlc3Npb25UeXBlPUVKQlNlc3Npb25UeXBlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0RGF0ZUhlYWRlcj1TZXJ2bGV0RGF0ZUhlYWRlcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fRGVmYXVsdEVKQlZlcnNpb249RGVmYXVsdEVKQlZlcnNpb24KLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRTZWN1cml0eVJvbGVzPVNlcnZsZXRTZWN1cml0eVJvbGVzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19BdXRvU3luYz1BdXRvU3luYwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQ2xhc3NQYXRoPUNsYXNzUGF0aAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRTZWN1cml0eVJvbGVzPVNlcnZsZXRTZWN1cml0eVJvbGVzCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldF9fQmVhbj1CZWFuCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0RGF0ZUhlYWRlcj1TZXJ2bGV0RGF0ZUhlYWRlcgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19TZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzPVNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0N0b3JfU2V0X19wYWNrYWdlPXBhY2thZ2UKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJWZXJzaW9uX1NldF9fMi4wPTIuMAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQ9RUpCU2Vzc2lvblR5cGVfU2V0Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZUNvZGU9R2VuZXJhdGVDb2RlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Ob0NsYXNzQ3VzdG9tRGxnPU5vQ2xhc3NDdXN0b21EbGcKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1N0YXRpYz1TdGF0aWMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFJlcXVlc3RBdHRyaWJ1dGU9U2VydmxldFJlcXVlc3RBdHRyaWJ1dGUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVKYXZhRG9jVGFncz1Vc2VyRGVmaW5lSmF2YURvY1RhZ3MKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzcz1EZWZhdWx0X0VKQgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRYTUxGaWxlUGF0aD1TZXJ2bGV0WE1MRmlsZVBhdGgKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyPVNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0PWRlZmF1bHQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcz1TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldENvbnRleHRSZWY9U2VydmxldENvbnRleHRSZWYKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlX1hNTF9ERD1HZW5lcmF0ZV9YTUxfREQKLUphdmFfX2RlZmF1bHRfX1JvbGVfX0lzTmF2aWdhYmxlPUlzTmF2aWdhYmxlCi1KYXZhX19kZWZhdWx0X19Sb2xlQmVhblByb3BlcnR5X1NldF9fTm90XCBBXCBQcm9wZXJ0eT1Ob3QgQSBQcm9wZXJ0eQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19GaW5hbD1GaW5hbAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZUZpbmFsaXplcj1HZW5lcmF0ZUZpbmFsaXplcgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19CTVBfRXh0ZW5kX0NNUD1CTVBfRXh0ZW5kX0NNUAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19CZWFuPUJlYW4KLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldENvbnRleHRSZWY9U2VydmxldENvbnRleHRSZWYKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldENvbnRlbnRUeXBlPVNlcnZsZXRDb250ZW50VHlwZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSmF2YWRvY0RlZmF1bHRTaW5jZT1KYXZhZG9jRGVmYXVsdFNpbmNlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19KYXZhZG9jU2luY2U9SmF2YWRvY1NpbmNlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldFJlcXVlc3RBdHRyaWJ1dGU9U2VydmxldFJlcXVlc3RBdHRyaWJ1dGUKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFNlY3VyaXR5Um9sZXM9U2VydmxldFNlY3VyaXR5Um9sZXMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TQ0NTZWxlY3RlZD1TQ0NTZWxlY3RlZAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCVmVyc2lvbj1FSkJWZXJzaW9uCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0dlbmVyYXRlSFRNTD1HZW5lcmF0ZUhUTUwKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yPUdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlZlcnNpb25fU2V0X18yLjA9Mi4wCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19JbnN0YW5jZVZhcmlhYmxlUHJlZml4PUluc3RhbmNlVmFyaWFibGVQcmVmaXgKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXRfX1N0YXRlZnVsPVN0YXRlZnVsCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3Byb3RlY3RlZD1wcm90ZWN0ZWQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRIZWFkZXJOYW1lcz1TZXJ2bGV0SGVhZGVyTmFtZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnM9TWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0Z2V0SW5mbz1TZXJ2bGV0Z2V0SW5mbwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fQ29uc3RydWN0b3JJcz1Db25zdHJ1Y3RvcklzCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZV9YTUxfREQ9R2VuZXJhdGVfWE1MX0RECi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX01ldGhvZEZvckhlYWRlcnM9TWV0aG9kRm9ySGVhZGVycwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRGlzYWJsZUF1dG9TeW5jPURpc2FibGVBdXRvU3luYwotSmF2YV9fZGVmYXVsdF9fUm9sZUJlYW5Qcm9wZXJ0eV9TZXRfX0NvbnN0cmFpbmVkPUNvbnN0cmFpbmVkCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJSZWVudHJhbnQ9RUpCUmVlbnRyYW50Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3Byb3RlY3RlZD1wcm90ZWN0ZWQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJbnRIZWFkZXI9U2VydmxldEludEhlYWRlcgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fQ29uc3RydWN0b3JJcz1Db25zdHJ1Y3RvcklzCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJWZXJzaW9uX1NldF9fMi4wPTIuMAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19TZXJ2bGV0SXNTZWN1cmU9U2VydmxldElzU2VjdXJlCi1KYXZhX19kZWZhdWx0X19Nb2R1bGVCb2R5X19DbUlkZW50aWZpY2F0aW9uPUNtSWRlbnRpZmljYXRpb24KLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlPVNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVfX0dlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcz1HZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldF9fQmVhbj1CZWFuCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJSZWZlcmVuY2VzPUVKQlJlZmVyZW5jZXMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1Nob3dDb2RlZ2VuRGxnPVNob3dDb2RlZ2VuRGxnCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19QcmltYXJ5S2V5UHJlZml4PVByaW1hcnlLZXlQcmVmaXgKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJYTUxGaWxlUGF0aD1FSkJYTUxGaWxlUGF0aAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fUmVtb3RlUHJlZml4PVJlbW90ZVByZWZpeAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSmF2YWRvY051bUFzdGVyaXNrcz1KYXZhZG9jTnVtQXN0ZXJpc2tzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19NZXRob2RGb3JDb29raWU9TWV0aG9kRm9yQ29va2llCi1KYXZhX19kZWZhdWx0X19DbGFzc19fUmVhZE9ubHk9UmVhZE9ubHkKLUphdmFfX2RlZmF1bHRfX1JvbGVfX1RyYW5zaWVudD1UcmFuc2llbnQKLUphdmFfX2RlZmF1bHRfX1JvbGVCZWFuUHJvcGVydHlfU2V0X19TaW1wbGU9U2ltcGxlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1N0YXRpYz1TdGF0aWMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19HZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyPUdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1ZNPVZNCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0U2VjdXJpdHlSb2xlcz1TZXJ2bGV0U2VjdXJpdHlSb2xlcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlZlcnNpb25fU2V0X18xLng9MS54Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VUYWJzPVVzZVRhYnMKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzPVNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU3RhdGljPVN0YXRpYwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJUcmFuc2FjdGlvblR5cGU9RUpCVHJhbnNhY3Rpb25UeXBlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19DbGFzc1ZhcmlhYmxlUHJlZml4PUNsYXNzVmFyaWFibGVQcmVmaXgKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGg9U2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQlNlY3VyaXR5Um9sZXM9RUpCU2VjdXJpdHlSb2xlcwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldENvbnRlbnRUeXBlPVNlcnZsZXRDb250ZW50VHlwZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlckRlZmluZVRhZ1RleHQzPVVzZXJEZWZpbmVUYWdUZXh0MwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlckRlZmluZVRhZ1RleHQyPVVzZXJEZWZpbmVUYWdUZXh0MgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlckRlZmluZVRhZ1RleHQxPVVzZXJEZWZpbmVUYWdUZXh0MQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyPUdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RWTVR5cGVfX0lCTT1JQk0KLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0PUVKQlBlcnNpc3RlbmNlVHlwZV9TZXQKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQlNlY3VyaXR5Um9sZXM9RUpCU2VjdXJpdHlSb2xlcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSmF2YWRvY0RlZmF1bHRBdXRob3I9SmF2YWRvY0RlZmF1bHRBdXRob3IKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldD1FSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19CTVBfRXh0ZW5kX0NNUD1CTVBfRXh0ZW5kX0NNUAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCUGVyc2lzdGVuY2VUeXBlPUVKQlBlcnNpc3RlbmNlVHlwZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0dlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yPUdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWxlc3M9U3RhdGVsZXNzCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldF9fU3RhdGVmdWw9U3RhdGVmdWwKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWxlc3M9U3RhdGVsZXNzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZUZpbmFsaXplcj1HZW5lcmF0ZUZpbmFsaXplcgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0X19wYWNrYWdlPXBhY2thZ2UKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFJlcXVlc3RQYXJhbWV0ZXI9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1Jvc2VEZWZhdWx0Q29tbWVudFN0eWxlPVJvc2VEZWZhdWx0Q29tbWVudFN0eWxlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0dlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yPUdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXI9R2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQlZlcnNpb249RUpCVmVyc2lvbgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0dlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplcj1HZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoPVNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQk5hbWVJbkpBUj1FSkJOYW1lSW5KQVIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRDb250ZXh0UmVmPVNlcnZsZXRDb250ZXh0UmVmCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQ9RUpCU2Vzc2lvblR5cGVfU2V0Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldF9fQmVhbj1CZWFuCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlZlcnNpb25fU2V0X18xLng9MS54Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19SZWZlcmVuY2VDbGFzc3BhdGg9UmVmZXJlbmNlQ2xhc3NwYXRoCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXRfX0NvbnRhaW5lcj1Db250YWluZXIKLUphdmFfX2RlZmF1bHRfX1JvbGVfX0luZGl2aWR1YWxDaGFuZ2VNZ3Q9SW5kaXZpZHVhbENoYW5nZU1ndAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldENvbnRleHRSZWY9U2VydmxldENvbnRleHRSZWYKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQk5hbWVJbkpBUj1FSkJOYW1lSW5KQVIKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX01ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzPU1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19NYXhOdW1DaGFycz1NYXhOdW1DaGFycwotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlX19UcmFuc2llbnQ9VHJhbnNpZW50Ci1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcz1TZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXI9U2VydmxldFJlcXVlc3REaXNwYXRjaGVyCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19SZWFkT25seT1SZWFkT25seQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSG9tZVByZWZpeD1Ib21lUHJlZml4Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0NvbnN0cnVjdG9ySXM9Q29uc3RydWN0b3JJcwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCVmVyc2lvbl9TZXRfXzEueD0xLngKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJUcmFuc2FjdGlvblR5cGU9RUpCVHJhbnNhY3Rpb25UeXBlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldFJlcXVlc3RQYXJhbWV0ZXI9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXM9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldEhlYWRlcj1TZXJ2bGV0SGVhZGVyCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1JlYWRPbmx5PVJlYWRPbmx5Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3BhY2thZ2U9cGFja2FnZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlZlcnNpb25fU2V0X18yLjA9Mi4wCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0PUVKQlBlcnNpc3RlbmNlVHlwZV9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXM9U2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJFbnZpcm9ubWVudFByb3BlcnRpZXM9RUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SGVhZGVyPVNlcnZsZXRIZWFkZXIKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRnZXRJbmZvPVNlcnZsZXRnZXRJbmZvCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRnZXRJbmZvPVNlcnZsZXRnZXRJbmZvCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Mb2NhbFN1ZmZpeD1Mb2NhbFN1ZmZpeAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fT3BlbkJyYWNlTWV0aG9kU3R5bGU9T3BlbkJyYWNlTWV0aG9kU3R5bGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQkNtcEZpZWxkPUVKQkNtcEZpZWxkCi1KYXZhX19kZWZhdWx0X19DbGFzc19fTWV0aG9kRm9yQ29va2llPU1ldGhvZEZvckNvb2tpZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXRfX0JlYW49QmVhbgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWxlc3M9U3RhdGVsZXNzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0TmFtZT1TZXJ2bGV0TmFtZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdEVkaXRvclR5cGU9RWRpdG9yVHlwZQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXI9R2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZUNvZGU9R2VuZXJhdGVDb2RlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19HZW5lcmF0ZVJvc2VJRD1HZW5lcmF0ZVJvc2VJRAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCWE1MRmlsZVBhdGg9RUpCWE1MRmlsZVBhdGgKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXQ9RUpCVHJhbnNhY3Rpb25UeXBlX1NldAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJYTUxGaWxlUGF0aD1FSkJYTUxGaWxlUGF0aAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzPUVKQkVudmlyb25tZW50UHJvcGVydGllcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fTG9jYWxIb21lU3VmZml4PUxvY2FsSG9tZVN1ZmZpeAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRGlzYWJsZUF1dG9TeW5jPURpc2FibGVBdXRvU3luYwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXRfX0NvbnRhaW5lcj1Db250YWluZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdOYW1lMz1Vc2VyRGVmaW5lVGFnTmFtZTMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdOYW1lMj1Vc2VyRGVmaW5lVGFnTmFtZTIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdOYW1lMT1Vc2VyRGVmaW5lVGFnTmFtZTEKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCVmVyc2lvbl9TZXQ9RUpCVmVyc2lvbl9TZXQKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzPVNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3M9SHR0cF9TZXJ2bGV0Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0WE1MRmlsZVBhdGg9U2VydmxldFhNTEZpbGVQYXRoCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NDdG9yX1NldD1DdG9yX1NldAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fRWRpdG9yPUVkaXRvcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fT3BlbkJyYWNlQ2xhc3NTdHlsZT1PcGVuQnJhY2VDbGFzc1N0eWxlCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0X19Cb3VuZD1Cb3VuZAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NDdG9yX1NldD1DdG9yX1NldAotSmF2YV9fZGVmYXVsdF9fTW9kdWxlU3BlY19fQ29weXJpZ2h0Tm90aWNlPUNvcHlyaWdodE5vdGljZQotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlPWRlZmF1bHQKLUphdmFfX2RlZmF1bHRfX1JvbGVSZWFkV3JpdGVfU2V0PVJlYWQvV3JpdGVfU2V0Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19KYXZhZG9jVmVyc2lvbj1KYXZhZG9jVmVyc2lvbgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdFZNVHlwZT1WTVR5cGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0SW50SGVhZGVyPVNlcnZsZXRJbnRIZWFkZXIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0PUVKQlBlcnNpc3RlbmNlVHlwZV9TZXQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGg9U2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fUmVhZE9ubHk9UmVhZE9ubHkKLUphdmFfX2RlZmF1bHRfX1JvbGVSZWFkV3JpdGVfU2V0X19SZWFkXCAmXCBXcml0ZT1SZWFkICYgV3JpdGUKLUphdmFfX2RlZmF1bHRfX01vZHVsZUJvZHk9ZGVmYXVsdAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NDdG9yX1NldF9fcGFja2FnZT1wYWNrYWdlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fSXNTaW5nbGVUaHJlYWQ9SXNTaW5nbGVUaHJlYWQKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0dlbmVyYXRlRGVmYXVsdFJldHVybkxpbmU9R2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0dlbmVyYXRlQ29kZT1HZW5lcmF0ZUNvZGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19NZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycz1NZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycwotSmF2YV9fZGVmYXVsdF9fQ2xhc3M9ZGVmYXVsdAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzQ3Rvcl9TZXRfX3ByaXZhdGU9cHJpdmF0ZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3I9R2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJc1NlY3VyZT1TZXJ2bGV0SXNTZWN1cmUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TdHJpY3RmcD1TdHJpY3RmcAotSmF2YV9fZGVmYXVsdF9fUm9sZV9fVm9sYXRpbGU9Vm9sYXRpbGUKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQlNlc3Npb25TeW5jPUVKQlNlc3Npb25TeW5jCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQlNlY3VyaXR5Um9sZXM9RUpCU2VjdXJpdHlSb2xlcwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJTZXNzaW9uU3luYz1FSkJTZXNzaW9uU3luYwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQXN0ZXJpc2tDb21tZW50U3R5bGU9QXN0ZXJpc2tDb21tZW50U3R5bGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXRfX1N0YXRlZnVsPVN0YXRlZnVsCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SW50SGVhZGVyPVNlcnZsZXRJbnRIZWFkZXIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0PUVKQlRyYW5zYWN0aW9uVHlwZV9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXM9TWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0ZpbmFsPUZpbmFsCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJSZWVudHJhbnQ9RUpCUmVlbnRyYW50Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXRfXzEueD0xLngKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0phdmFDb21tZW50U3R5bGU9SmF2YUNvbW1lbnRTdHlsZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCUmVmZXJlbmNlcz1FSkJSZWZlcmVuY2VzCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0X19TaW1wbGU9U2ltcGxlCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZT1TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplcj1HZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRIZWFkZXI9U2VydmxldEhlYWRlcgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCVmVyc2lvbl9TZXQ9RUpCVmVyc2lvbl9TZXQKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0RlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZT1EZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRnZXRJbmZvPVNlcnZsZXRnZXRJbmZvCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJDbXBGaWVsZD1FSkJDbXBGaWVsZAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRIZWFkZXJOYW1lcz1TZXJ2bGV0SGVhZGVyTmFtZXMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXROYW1lPVNlcnZsZXROYW1lCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcz1TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcwotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlQmVhblByb3BlcnR5X1NldD1CZWFuUHJvcGVydHlfU2V0Ci1KYXZhX19kZWZhdWx0X19PcGVyYXRpb25fX1N5bmNocm9uaXplZD1TeW5jaHJvbml6ZWQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRDb250ZW50VHlwZT1TZXJ2bGV0Q29udGVudFR5cGUKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQlNlc3Npb25UeXBlPUVKQlNlc3Npb25UeXBlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQlNlc3Npb25UeXBlPUVKQlNlc3Npb25UeXBlCi1KYXZhX19kZWZhdWx0X19Nb2R1bGVCb2R5X19Db3B5cmlnaHROb3RpY2U9Q29weXJpZ2h0Tm90aWNlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRmluYWw9RmluYWwKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXM9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZUNvZGU9R2VuZXJhdGVDb2RlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJYTUxGaWxlUGF0aD1FSkJYTUxGaWxlUGF0aAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2M9R2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFJlcXVlc3REaXNwYXRjaGVyPVNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdEVkaXRvclR5cGVfX0J1aWx0SW49QnVpbHRJbgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldEluaXRQYXJhbWV0ZXI9U2VydmxldEluaXRQYXJhbWV0ZXIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19HZW5lcmF0ZV9YTUxfREQ9R2VuZXJhdGVfWE1MX0RECi1KYXZhX19kZWZhdWx0X19DbGFzc19fRGlzYWJsZUF1dG9TeW5jPURpc2FibGVBdXRvU3luYwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRJbml0UGFyYW1ldGVyPVNlcnZsZXRJbml0UGFyYW1ldGVyCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0X19Ob3RcIEFcIFByb3BlcnR5PU5vdCBBIFByb3BlcnR5Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TdHJpY3RmcD1TdHJpY3RmcAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCQ254RmFjdG9yeT1FSkJDbnhGYWN0b3J5Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19DcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXM9Q3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fQ29uc3RydWN0b3JJcz1Db25zdHJ1Y3RvcklzCi1KYXZhX19kZWZhdWx0X19Sb2xlX19HZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXM9R2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19EaXNwYXRjaGVyRm9yd2FyZD1EaXNwYXRjaGVyRm9yd2FyZAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCQ254RmFjdG9yeT1FSkJDbnhGYWN0b3J5Ci1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVfX1Byb3BlcnR5VHlwZT1Qcm9wZXJ0eVR5cGUKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU3RyaWN0ZnA9U3RyaWN0ZnAKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFhNTEZpbGVQYXRoPVNlcnZsZXRYTUxGaWxlUGF0aAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXRfX0NvbnRhaW5lcj1Db250YWluZXIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0Q29udGVudFR5cGU9U2VydmxldENvbnRlbnRUeXBlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWxlc3M9U3RhdGVsZXNzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fQk1QX0V4dGVuZF9DTVA9Qk1QX0V4dGVuZF9DTVAKLT0KLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0phdmFkb2NBdXRob3I9SmF2YWRvY0F1dGhvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvVmlydHVhbFBhdGhBUEkuZW14IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvVmlydHVhbFBhdGhBUEkuZW14CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2UwMjNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL1ZpcnR1YWxQYXRoQVBJLmVteAorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLXh0b29sczJfdW5pdmVyc2FsX3R5cGVfbWFuYWdlci0tPgotPHVtbDpNb2RlbCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmlibS5jb20veHRvb2xzLzEuNS4wL05vdGF0aW9uIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8xLjAuMC9VTUwiIHhtbG5zOnVtbG5vdGF0aW9uPSJodHRwOi8vd3d3LmlibS5jb20veHRvb2xzLzEuNS4wL1VtbG5vdGF0aW9uIiB4bWk6aWQ9Il9YUDJrY0xxdkVkbVR3TGNMa3BBSFB3IiBuYW1lPSJWaXJ0dWFsUGF0aEFQSSIgYXBwbGllZFByb2ZpbGU9Il9YU2lGQUxxdkVkbVR3TGNMa3BBSFB3IF9YVVA4UUxxdkVkbVR3TGNMa3BBSFB3IF9YVTBrQUxxdkVkbVR3TGNMa3BBSFB3IF9YV29oNExxdkVkbVR3TGNMa3BBSFB3IF9YWnNjOExxdkVkbVR3TGNMa3BBSFB3Ij4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9YUDJrY2JxdkVkbVR3TGNMa3BBSFB3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il9YUDJrY3JxdkVkbVR3TGNMa3BBSFB3Ij4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iX1hQMmtjcnF2RWRtVHdMY0xrcEFIUHciIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zTG5LRUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2VFZGdlcz0iX3N4UG1zTHNhRWRtcm1jaWwxQngwNHcgX3N4UG11THNhRWRtcm1jaWwxQngwNHciIHRhcmdldEVkZ2VzPSJfc3hiel9ic2FFZG1ybWNpbDFCeDA0dyBfc3hoNmtyc2FFZG1ybWNpbDFCeDA0dyBfc3hvQk9Mc2FFZG1ybWNpbDFCeDA0dyBfc3gwT2NMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zTUdTUUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9zTUdTUWJzYUVkbXJtY2lsMUJ4MDR3IiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc01HU1Fyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NNR1NRN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zTUdTUkxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc00zSFFMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zTTNIUWJzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NNOU40THNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc005TjRic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zTTlONHJzYUVkbXJtY2lsMUJ4MDR3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zTTlONDdzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il9zTG5LRWJzYUVkbXJtY2lsMUJ4MDR3IiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9zTG5LRXJzYUVkbXJtY2lsMUJ4MDR3IiB4PSIzMTgiIHk9IjI1NDQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1VMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlRWRnZXM9Il9zeFZ0VWJzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXRFZGdlcz0iX3N4dUgwTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1U3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9za0VHVkxzYUVkbXJtY2lsMUJ4MDR3IiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1Zic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1Zyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1Y3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1dMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9za0VHV2JzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1dyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9za0VHVzdzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tLTThMc2FFZG1ybWNpbDFCeDA0dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc2tLTThic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il9za0VHVWJzYUVkbXJtY2lsMUJ4MDR3IiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZvbGRlcltqY3VebmFtZT1JVmlydHVhbEZvbGRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3NrRUdVcnNhRWRtcm1jaWwxQngwNHciIHg9IjgyNjgiIHk9IjE0NjI4Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTBzTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZUVkZ2VzPSJfc3hWdFdMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0RWRnZXM9Il9zeHVINExzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTBzN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfc2t1MHRMc2FFZG1ybWNpbDFCeDA0dyIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB0YnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB0cnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB0N3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB1THNhRWRtcm1jaWwxQngwNHciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc2t1MHVic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB1cnNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc2t1MHU3c2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB2THNhRWRtcm1jaWwxQngwNHciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NrdTB2YnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfc2t1MHNic2FFZG1ybWNpbDFCeDA0dyIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZWZlcmVuY2VbamN1Xm5hbWU9SVZpcnR1YWxSZWZlcmVuY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9za3Uwc3JzYUVkbXJtY2lsMUJ4MDR3IiB4PSIyMDAzNCIgeT0iMjU0NCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbC1LMExzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NsLUswN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfc2wtSzFMc2FFZG1ybWNpbDFCeDA0dyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2wtSzFic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc21FUmNMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc21FUmNic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zbUVSY3JzYUVkbXJtY2lsMUJ4MDR3IiBmaWx0ZXJpbmc9Ik1hbnVhbCI+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9InZpenJlZjovLy8jamZpZWxkXnZjb3JlLnRhcmdldD11bWwyLlByb3BlcnR5Xm5hbWU9bmFtZVtqc3JjdHlwZV5uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpQcm9wZXJ0eSIgaHJlZj0idml6cmVmOi8vLyNqZmllbGRedmNvcmUudGFyZ2V0PXVtbDIuUHJvcGVydHlebmFtZT10b1N0cmluZ1tqc3JjdHlwZV5uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpQcm9wZXJ0eSIgaHJlZj0idml6cmVmOi8vLyNqZmllbGRedmNvcmUudGFyZ2V0PXVtbDIuUHJvcGVydHlebmFtZT1oYXNoQ29kZVtqc3JjdHlwZV5uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L3N0eWxlcz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50SGFuZGxlW2pjdV5uYW1lPUNvbXBvbmVudEhhbmRsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbUVSYzdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NtRVJkTHNhRWRtcm1jaWwxQngwNHciIGZpbHRlcmluZz0iTWFudWFsIj4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1Db21wb25lbnRIYW5kbGVec2lnbj0oUUlQcm9qZWN0JTNiUVN0cmluZyUzYilWW2pzcmN0eXBlXm5hbWU9Q29tcG9uZW50SGFuZGxlW2pjdV5uYW1lPUNvbXBvbmVudEhhbmRsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvc3R5bGVzPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NtRVJkYnNhRWRtcm1jaWwxQngwNHciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NtRVJkcnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50SGFuZGxlW2pjdV5uYW1lPUNvbXBvbmVudEhhbmRsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbk9JQUxzYUVkbXJtY2lsMUJ4MDR3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc25PSUFic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfc2wtSzBic2FFZG1ybWNpbDFCeDA0dyIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc2wtSzByc2FFZG1ybWNpbDFCeDA0dyIgeD0iMTM2NzQiIHk9IjI1NDQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3FMVllMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlRWRnZXM9Il9zeGJ6X2JzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXRFZGdlcz0iX3N4b0JNTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3FMVlk3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3NxTFZaTHNhRWRtcm1jaWwxQngwNHciIHdpZHRoPSI1MzAiIGhlaWdodD0iNTMwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcUxWWmJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NxTFZacnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3FSY0FMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcVJjQWJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NxUmNBcnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NxUmNBN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc3FSY0JMc2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3FSY0Jic2FFZG1ybWNpbDFCeDA0dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc3FSY0Jyc2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDbGFzc2lmaWVyU3R5bGUiIHhtaTppZD0iX3NxTFZZYnNhRWRtcm1jaWwxQngwNHciIHNob3dTdGVyZW90eXBlPSJMYWJlbCIgdXNlQ2xhc3NpZmllclNoYXBlPSJ0cnVlIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9zcUxWWXJzYUVkbXJtY2lsMUJ4MDR3IiB4PSIxNTkwIiB5PSIxNDYyOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2VFZGdlcz0iX3N4aDZrcnNhRWRtcm1jaWwxQngwNHcgX3N4b0JNTHNhRWRtcm1jaWwxQngwNHcgX3N4b0JPTHNhRWRtcm1jaWwxQngwNHcgX3N4dUgwTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldEVkZ2VzPSJfc3hQbXVMc2FFZG1ybWNpbDFCeDA0dyBfc3hWdFVic2FFZG1ybWNpbDFCeDA0dyBfc3gwT2VMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEd0xzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3NxMkR3YnNhRWRtcm1jaWwxQngwNHciIHdpZHRoPSI1MzAiIGhlaWdodD0iNTMwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEd3JzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEdzdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEeExzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEeGJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NxMkR4cnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEeDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NxMkR5THNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEeWJzYUVkbXJtY2lsMUJ4MDR3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zcTJEeXJzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDbGFzc2lmaWVyU3R5bGUiIHhtaTppZD0iX3NxdjlJYnNhRWRtcm1jaWwxQngwNHciIHNob3dTdGVyZW90eXBlPSJMYWJlbCIgdXNlQ2xhc3NpZmllclNoYXBlPSJ0cnVlIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc3F2OUlyc2FFZG1ybWNpbDFCeDA0dyIgeD0iODU4NiIgeT0iMjU0NCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zc2QwWUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2VFZGdlcz0iX3N4dUgyTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3NkMFk3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfc3NkMFpMc2FFZG1ybWNpbDFCeDA0dyIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NzZDBaYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zc2QwWnJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3NkMFo3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NzZDBhTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc3NkMGFic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zc2QwYXJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NzZDBhN3NhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3NkMGJMc2FFZG1ybWNpbDFCeDA0dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc3NkMGJic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfc3NkMFlic2FFZG1ybWNpbDFCeDA0dyIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc3NkMFlyc2FFZG1ybWNpbDFCeDA0dyIgeD0iMjAwMzQiIHk9IjEwODEyIiB3aWR0aD0iNDg3MSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRY0xzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2VFZGdlcz0iX3N4dUg0THNhRWRtcm1jaWwxQngwNHcgX3N4ME9jTHNhRWRtcm1jaWwxQngwNHcgX3N4ME9lTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldEVkZ2VzPSJfc3hQbXNMc2FFZG1ybWNpbDFCeDA0dyBfc3hWdFdMc2FFZG1ybWNpbDFCeDA0dyBfc3h1SDJMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRYzdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3N0UFFkTHNhRWRtcm1jaWwxQngwNHciIHdpZHRoPSI1MzAiIGhlaWdodD0iNTMwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRZGJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRZHJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRZDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRZUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3N0UFFlYnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFZYRUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3N0VlhFYnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFZYRXJzYUVkbXJtY2lsMUJ4MDR3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zdFZYRTdzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDbGFzc2lmaWVyU3R5bGUiIHhtaTppZD0iX3N0UFFjYnNhRWRtcm1jaWwxQngwNHciIHNob3dTdGVyZW90eXBlPSJMYWJlbCIgdXNlQ2xhc3NpZmllclNoYXBlPSJ0cnVlIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc3RQUWNyc2FFZG1ybWNpbDFCeDA0dyIgeD0iMTM2NzQiIHk9IjkyMjIiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX1hQMmtjN3F2RWRtVHdMY0xrcEFIUHciLz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeFBtc0xzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zTG5LRUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zdFBRY0xzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4UG1zN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4UG10YnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeFBtdDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hQbXRyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4UG10THNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4UG1zYnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeFBtc3JzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlszMjU0LCA0NDQ1LCAtOTc2MywgMTAwNV0kWzY3NzMsIDQ0NDUsIC02MjQ0LCAxMDA1XSRbNjc3MywgNDM5MywgLTYyNDQsIDk1M10kWzEwNzE2LCA0MzkzLCAtMjMwMSwgOTUzXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeFBtdUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zTG5LRUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4UG11N3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4UG12YnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeFZ0VUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hQbXZyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4UG12THNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4UG11YnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeFBtdXJzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlszMjU0LCAtMzE0OCwgLTM5OTYsIC01MjldJFs1MzE4LCAtMzE0OCwgLTE5MzIsIC01MjldIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4VnRVYnNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3NrRUdVTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3NxdjlJTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hWdFZMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hWdFZyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZvbGRlcltqY3VebmFtZT1JVmlydHVhbEZvbGRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hWdFY3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZvbGRlcltqY3VebmFtZT1JVmlydHVhbEZvbGRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZvbGRlcltqY3VebmFtZT1JVmlydHVhbEZvbGRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeFZ0VmJzYUVkbXJtY2lsMUJ4MDR3IiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeFZ0VXJzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeFZ0VTdzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlsxMzIsIC0xMDg1LCAtMjY1LCAxMDc5NV0kWzEzMiwgLTg2NzgsIC0yNjUsIDMyMDJdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4VnRXTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3NrdTBzTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3N0UFFjTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hiejhMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hiejhyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hiejlMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hiejg3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeGJ6OGJzYUVkbXJtY2lsMUJ4MDR3IiB4PSItOTgiIHk9IjMzOCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3hWdFdic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfc3hWdFdyc2FFZG1ybWNpbDFCeDA0dyIgcG9pbnRzPSJbLTMxNzUsIDU4MywgMzc1OCwgLTYwMzJdJFstNDE4MSwgNTgzLCAyNzUyLCAtNjAzMl0kWy00MTgxLCA0NTUxLCAyNzUyLCAtMjA2NF0kWy00NjU3LCA0NTUxLCAyMjc2LCAtMjA2NF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3hiel9ic2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc3FMVllMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc0xuS0VMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGIwQUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGg2a0xzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGg2a2JzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4YjBBYnNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4YnpfcnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4YnpfN3NhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWzc0MSwgLTEwNTgsIC0yMTQzLCAxNTIxNF0kWzc0MSwgLTEwNDc4LCAtMjE0MywgNTc5NF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3hoNmtyc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc3F2OUlMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc0xuS0VMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGg2bGJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGg2bDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hoNm1ic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4aDZtTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeGg2bHJzYUVkbXJtY2lsMUJ4MDR3IiB4PSI4MSIgeT0iLTEwNzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4aDZrN3NhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeGg2bExzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlsxNDgxLCAtMzE3NSwgMjM4MSwgNzQ4OF0kWzE0ODEsIC00ODY5LCAyMzgxLCA1Nzk0XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeG9CTUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zcUxWWUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4b0JNN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4b0JOYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hvQk43c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeG9CTnJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeG9CTkxzYUVkbXJtY2lsMUJ4MDR3IiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeG9CTWJzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4b0JNcnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy0xNTg3LCAzMjAyLCA1MzcyLCAtNjc3M10kWy0xNTg3LCA0MTU0LCA1MzcyLCAtNTgyMV0kWy0yOTEwLCA0MTU0LCA0MDQ5LCAtNTgyMV0kWy0yOTEwLCA5OTQ4LCA0MDQ5LCAtMjddJFstNDk3NCwgOTk0OCwgMTk4NSwgLTI3XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeG9CT0xzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zTG5LRUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4b0JPN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4b0JQYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeG9CUHJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3hvQlBMc2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3hvQk9ic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4b0JPcnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy04MCwgLTMxNzUsIDgyMCwgNzQ4OF0kWy04MCwgLTQ4NjksIDgyMCwgNTc5NF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3h1SDBMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc3F2OUlMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc2tFR1VMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIMDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIMWJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIMTdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIMXJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4dUgxTHNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4dUgwYnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4dUgwcnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy05NzksIDMyMDIsIC05MDAsIC02NzczXSRbLTk3OSwgODg5MCwgLTkwMCwgLTEwODVdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4dUgyTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3NzZDBZTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3N0UFFjTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDI3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDNic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4dUgzN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIM3JzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3h1SDNMc2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3h1SDJic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4dUgycnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy0xLCAzMjAxLCAtNzY4LCAtNDE1NV0kWzc2NywgNDc4OSwgMCwgLTI1NjddIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4dUg0THNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3N0UFFjTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3NrdTBzTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDQ3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDVic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDU3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDVyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeHVINUxzYUVkbXJtY2lsMUJ4MDR3IiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeHVINGJzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeHVINHJzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlsyMjc2LCAtMTM0OSwgLTQ2NTcsIDUyNjZdJFszMTI1LCAtMTM0OSwgLTM4MDgsIDUyNjZdJFszMTI1LCAtNTUwMywgLTM4MDgsIDExMTJdJFszMTI1LCAtNTUzMCwgLTM4MDgsIDEwODVdJFszNzU4LCAtNTUzMCwgLTMxNzUsIDEwODVdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4ME9jTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3N0UFFjTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3NMbktFTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3gwT2M3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3gwT2Ric2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4ME9kN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeDBPZHJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3gwT2RMc2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3gwT2Nic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4ME9jcnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy0yMjc1LCAxNzk5LCAxMDc0MiwgNTIzOV0kWy05NzYzLCAxNzk5LCAzMjU0LCA1MjM5XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeDBPZUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zdFBRY0xzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4ME9lN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4ME9mYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4NlZFTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3gwT2ZMc2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3gwT2Vic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfc3gwT2Vyc2FFZG1ybWNpbDFCeDA0dyIgcG9pbnRzPSJbLTIyNzUsIC0xMjE3LCAzNDkyLCA0ODQyXSRbLTQ3MDksIC0xMjE3LCAxMDU4LCA0ODQyXSRbLTQ3MDksIC0yODU3LCAxMDU4LCAzMjAyXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICA8L2NvbnRlbnRzPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX1hTaUZBTHF2RWRtVHdMY0xrcEFIUHciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfWFNpRkFicXZFZG1Ud0xjTGtwQUhQdyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX1hTaUZBcnF2RWRtVHdMY0xrcEFIUHciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQmFzaWMucHJvZmlsZS51bWwyI182bUZSZ0s4NkVkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9CYXNpYy5wcm9maWxlLnVtbDIjXzZtRlJnSzg2RWRpaDktR0c1YWZRMGciLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfWFVQOFFMcXZFZG1Ud0xjTGtwQUhQdyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9YVVA4UWJxdkVkbVR3TGNMa3BBSFB3IiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfWFVvV3dMcXZFZG1Ud0xjTGtwQUhQdyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9JbnRlcm1lZGlhdGUucHJvZmlsZS51bWwyI19Dejdjc0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9JbnRlcm1lZGlhdGUucHJvZmlsZS51bWwyI19Dejdjc0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX1hVMGtBTHF2RWRtVHdMY0xrcEFIUHciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfWFUwa0FicXZFZG1Ud0xjTGtwQUhQdyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX1hVMGtBcnF2RWRtVHdMY0xrcEFIUHciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQ29tcGxldGUucHJvZmlsZS51bWwyI19NN3BUa0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9Db21wbGV0ZS5wcm9maWxlLnVtbDIjX003cFRrSzg3RWRpaDktR0c1YWZRMGciLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfWFdvaDRMcXZFZG1Ud0xjTGtwQUhQdyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9YV29oNGJxdkVkbVR3TGNMa3BBSFB3IiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfWFdvaDRycXZFZG1Ud0xjTGtwQUhQdyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX2FfUzN3TldMRWRpeTRJcVA4d2hqRkE/RGVmYXVsdCIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfWFpzYzhMcXZFZG1Ud0xjTGtwQUhQdyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9YWnNjOGJxdkVkbVR3TGNMa3BBSFB3IiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfWFpzYzhycXZFZG1Ud0xjTGtwQUhQdyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX3ZqYnV3T3ZIRWRpRFg1YmppMGlWU0E/RGVwbG95bWVudCIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9YaVNZUUxxdkVkbVR3TGNMa3BBSFB3Ij4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19FZlJab0s4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iX1dadkhRTHNjRWRtcm1jaWwxQngwNHciIG5hbWU9IkVudW1lcmF0aW9uMSIvPgotPC91bWw6TW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9jb21wb25lbnRDb3JlLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjYWZiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9jb21wb25lbnRDb3JlLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iY29tcG9uZW50Y29yZSIKLSAgICBuc1VSST0iY29tcG9uZW50Y29yZS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtiZW5jaENvbXBvbmVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29tcG9uZW50UmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0NvbXBvbmVudFJlc291cmNlL2NvbXBvbmVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21wb25lbnRUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQ29tcG9uZW50VHlwZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZENvbXBvbmVudHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVmZXJlbmNlZENvbXBvbmVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9wZXJ0eSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRhZGF0YVJlc291cmNlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9JUGF0aCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb25lbnRSZXNvdXJjZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvdXJjZVBhdGgiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9JUGF0aCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJydW50aW1lUGF0aCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0lQYXRoIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1c2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tcG9uZW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vV29ya2JlbmNoQ29tcG9uZW50IiBlT3Bwb3NpdGU9IiMvL1dvcmtiZW5jaENvbXBvbmVudC9yZXNvdXJjZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSVBhdGgiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRhdGF0eXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBvbmVudFR5cGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21wb25lbnRUeXBlSWQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9wZXJ0eSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRhZGF0YVJlc291cmNlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9JUGF0aCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZWRDb21wb25lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYW5kbGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9VUkkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icnVudGltZVBhdGgiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9JUGF0aCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXBlbmRlbmN5VHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RlcGVuZGVuY3lUeXBlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlcGVuZGVudE9iamVjdCIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcmNoaXZlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVUkkiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMga2V5PSJkYXRhdHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRlcGVuZGVuY3lUeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InVzZXMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnN1bWVzIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9qZWN0Q29tcG9uZW50cyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3ROYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tcG9uZW50cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrYmVuY2hDb21wb25lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5lbXggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9jb21wb25lbnRDb3JlLmVteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjNDhjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9jb21wb25lbnRDb3JlLmVteAorKysgL2Rldi9udWxsCkBAIC0xLDYwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLXh0b29sczJfdW5pdmVyc2FsX3R5cGVfbWFuYWdlci0tPgotPHVtbDpNb2RlbCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOkRlZmF1bHRfMD0iaHR0cDovLy9EZWZhdWx0XzAucHJvZmlsZS51bWwyIiB4bWxuczpFY29yZV8wPSJodHRwOi8vL0Vjb3JlXzAucHJvZmlsZS51bWwyIiB4bWxuczpub3RhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tL3h0b29scy8xLjUuMC9Ob3RhdGlvbiIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMS4wLjAvVU1MIiB4bWxuczp1bWxub3RhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tL3h0b29scy8xLjUuMC9VbWxub3RhdGlvbiIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vL0RlZmF1bHRfMC5wcm9maWxlLnVtbDIgcGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19iQTdQYzlXTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQvJTNDRVBhY2thZ2UlM0UgaHR0cDovLy9FY29yZV8wLnByb2ZpbGUudW1sMiBwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbDIjX3Y5VlVzSzg3RWRpNVFwWWVZX3lJcGciIHhtaTppZD0iM0EwQjI0NzQwMjVGIiBuYW1lPSJjb21wb25lbnRjb3JlIiBhcHBsaWVkUHJvZmlsZT0iX2tNREc0WlRZRWRteTJvbkhZS2xBQmcgX2tNREc1SlRZRWRteTJvbkhZS2xBQmcgX2tNREc1NVRZRWRteTJvbkhZS2xBQmcgX2tNREc2cFRZRWRteTJvbkhZS2xBQmcgX2tNREc3WlRZRWRteTJvbkhZS2xBQmcgX2tNSk5nNVRZRWRteTJvbkhZS2xBQmcgX2tOcTNnWlRZRWRteTJvbkhZS2xBQmcgX0gweWU4SlR2RWRtRE5ZNmxuR0FnNUEiPgotICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tNSk5ocFRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXBwbGllZFN0ZXJlb3R5cGVzIj4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9IkVjb3JlXzA6RWNvcmVfX0VQYWNrYWdlIiB4bWk6aWQ9Il94RFpNd0pUWUVkbXkyb25IWUtsQUJnIiBuc1VSST0iY29tcG9uZW50Y29yZS54bWkiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uIiBwcmVmaXg9IkNvbXBvbmVudENvcmUiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa05xM2hKVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhcHBsaWVkU3RlcmVvdHlwZXMiPgotICAgIDxjb250ZW50cyB4bWk6dHlwZT0iRWNvcmVfMDpFY29yZV9fRVBhY2thZ2UiIHhtaTppZD0iX2tOcTNoWlRZRWRteTJvbkhZS2xBQmciIG5zVVJJPSJtb2R1bGVjb3JlLnhtaSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24iIHByZWZpeD0iTW9kdWxlQ29yZSIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rT1ZsOUpUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQTBCMjQ3NDAyNUY0MUUzREYwNjAyMTAiPgotICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0RGMDYwMjEwIiB0eXBlPSJDbGFzcyIgbmFtZT0iQ29tcG9uZW50Q29yZSI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1AzMjhKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTm90ZSIgc291cmNlRWRnZXM9Il9rUWlsWXBUWUVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tQOTlrSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkRpYWdyYW1OYW1lIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUDk5a1pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9rUDMyOFpUWUVkbXkyb25IWUtsQUJnIiBkZXNjcmlwdGlvbj0iVGhlIFJlZmVyZW5jZWRDb21wb25lbnQgaGFuZGxlIG11c3QgYmUgcmVzb2x2YWJsZSB0byBhIFdvcmtiZW5jaENvbXBvbmVudC4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBydW50aW1lUGF0aCBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBSZWZlcmVuY2VkQ29tcG9uZW50IGluIHRoZSBydW50aW1lIHN0cnVjdHVyZSBvZiB0aGUgY29udGFpbmluZyBXb3JrYmVuY2hDb21wb25lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZGVwZW5kZW5jeVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgUmVmZXJlbmNlZENvbXBvbmVudCBpcyBhc3NlbWJsZWQgd2l0aGluIHRoZSBjb250YWluaW5nIFdvcmtiZW5jaENvbXBvbmVudC4iIGZpbGxDb2xvcj0iMTMzNjkzNDMiIGxpbmVDb2xvcj0iNjczNzE1MSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9rUDMyOHBUWUVkbXkyb25IWUtsQUJnIiB4PSIxOTM5OCIgeT0iNjM2IiB3aWR0aD0iNjkzNCIgaGVpZ2h0PSI0MzQzIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVOWlRZRWRteTJvbkhZS2xBQmciIHRhcmdldEVkZ2VzPSJfYk5odjRKVGNFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMyNkRBMDI3QSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFT0pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzI2REEwMjdBIj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfa1FFRU9aVFlFZG15Mm9uSFlLbEFCZyIgd2lkdGg9Ijc5NDEiIGhlaWdodD0iMjA0OCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRU9wVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMyNkRBMDI3QSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRU81VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iS2luZCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMyNkRBMDI3QSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVBKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMyNkRBMDI3QSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVBaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFUHBUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFUDVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMyNkRBMDI3QSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVRSlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfa1FFRU5wVFlFZG15Mm9uSFlLbEFCZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93U3RlcmVvdHlwZT0iSW1hZ2UiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa1FFRU41VFlFZG15Mm9uSFlLbEFCZyIgeD0iMTIyODUiIHk9IjE1NDcyIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVRWlRZRWRteTJvbkhZS2xBQmciIHRhcmdldEVkZ2VzPSJfa1FLSzdwVFlFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjY3MDAzOSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFUkpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNjcwMDM5Ij4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfa1FFRVJaVFlFZG15Mm9uSFlLbEFCZyIgd2lkdGg9IjQ4NTkiIGhlaWdodD0iMjQyMSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVJwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjY3MDAzOSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVI1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjY3MDAzOSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVNKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFU1pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFU3BUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjY3MDAzOSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVTNVRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVUSlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjY3MDAzOSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVUWlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVUcFRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjY3MDAzOSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFVDVUWUVkbXkyb25IWUtsQUJnIiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2tRRUVRcFRZRWRteTJvbkhZS2xBQmciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd1N0ZXJlb3R5cGU9IkltYWdlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2tRRUVRNVRZRWRteTJvbkhZS2xBQmciIHg9IjU5NjkiIHk9IjE2MDk5Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVVSlRZRWRteTJvbkhZS2xBQmciIHNvdXJjZUVkZ2VzPSJfQjRiSTBKVGNFZG15Mm9uSFlLbEFCZyBfYk5odjRKVGNFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0RWRnZXM9Il9rUVdZSHBUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFENTEwM0UyIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVVNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ1MTAzRTIiPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9rUUVFVkpUWUVkbXkyb25IWUtsQUJnIiB3aWR0aD0iNjAyOCIgaGVpZ2h0PSIxOTk4Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVlpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFENTEwM0UyIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVnBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFENTEwM0UyIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVjVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVXSlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVXWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFENTEwM0UyIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRVdwVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVc1VFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFENTEwM0UyIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRVhKVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVhaVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFENTEwM0UyIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVYcFRZRWRteTJvbkhZS2xBQmciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfa1FFRVVaVFlFZG15Mm9uSFlLbEFCZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93U3RlcmVvdHlwZT0iSW1hZ2UiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa1FFRVVwVFlFZG15Mm9uSFlLbEFCZyIgeD0iMTE0NDgiIHk9IjExMTMwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVYNVRZRWRteTJvbkhZS2xBQmciIHNvdXJjZUVkZ2VzPSJfa1FXWVBwVFlFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NkRCMDI1MSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFWXBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY2REIwMjUxIj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfa1FFRVk1VFlFZG15Mm9uSFlLbEFCZyIgd2lkdGg9IjM3NDIiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVpKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NkRCMDI1MSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVpaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NkRCMDI1MSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVpwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFWjVUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFYUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NkRCMDI1MSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVhWlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVhcFRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NkRCMDI1MSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVhNVRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUViSlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NkRCMDI1MSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFYlpUWUVkbXkyb25IWUtsQUJnIiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2tRRUVZSlRZRWRteTJvbkhZS2xBQmciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd1N0ZXJlb3R5cGU9IkltYWdlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2tRRUVZWlRZRWRteTJvbkhZS2xBQmciIHg9IjE2NTEiIHk9IjQ4NzIiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzBKVFlFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0RWRnZXM9Il9rUWNld3BUWUVkbXkyb25IWUtsQUJnIF9rUWlsWXBUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNkMyNEIwMjNEIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0swNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY2QzI0QjAyM0QiPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9rUUtLMUpUWUVkbXkyb25IWUtsQUJnIiB3aWR0aD0iNjE0NiIgaGVpZ2h0PSIyNDIxIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLMVpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNkMyNEIwMjNEIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLMXBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNkMyNEIwMjNEIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLMTVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRS0sySlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0syWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNkMyNEIwMjNEIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FLSzJwVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzI1VFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNkMyNEIwMjNEIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FLSzNKVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzNaVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNkMyNEIwMjNEIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRS0szcFRZRWRteTJvbkhZS2xBQmciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfa1FLSzBaVFlFZG15Mm9uSFlLbEFCZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93U3RlcmVvdHlwZT0iSW1hZ2UiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa1FLSzBwVFlFZG15Mm9uSFlLbEFCZyIgeD0iMTI0MDIiIHk9IjQxMzQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzM1VFlFZG15Mm9uSFlLbEFCZyIgc291cmNlRWRnZXM9Il9rUUtLN3BUWUVkbXkyb25IWUtsQUJnIF9rUVdZSHBUWUVkbXkyb25IWUtsQUJnIF9rUWNld3BUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXRFZGdlcz0iX2tRV1lQcFRZRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzRwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjU4MDFGQSI+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2tRS0s0NVRZRWRteTJvbkhZS2xBQmciIHdpZHRoPSI0MDgwIiBoZWlnaHQ9IjE5OTgiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0s1SlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0s1WlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0s1cFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FLSzU1VFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzZKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUtLNlpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLNnBUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUtLNjVUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLN0pUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FLSzdaVFlFZG15Mm9uSFlLbEFCZyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9rUUtLNEpUWUVkbXkyb25IWUtsQUJnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dTdGVyZW90eXBlPSJJbWFnZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9rUUtLNFpUWUVkbXkyb25IWUtsQUJnIiB4PSI1OTUyIiB5PSI3OTExIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRaWxWSlRZRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FpbFY1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDM5NEY1MDE4NSI+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2tRaWxXSlRZRWRteTJvbkhZS2xBQmciIHdpZHRoPSIzMDgxIiBoZWlnaHQ9IjI0NzIiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRaWxXWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRaWxXcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRaWxXNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRaWxYSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkVudW1lcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUWlsWFpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsWHBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDM5NEY1MDE4NSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRaWxYNVRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRaWxZSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FpbFlaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9rUWlsVlpUWUVkbXkyb25IWUtsQUJnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dTdGVyZW90eXBlPSJJbWFnZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9rUWlsVnBUWUVkbXkyb25IWUtsQUJnIiB4PSIxOTcxNiIgeT0iNzMxNCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il81QlVsUUpUYkVkbXkyb25IWUtsQUJnIiB0YXJnZXRFZGdlcz0iX0I0YkkwSlRjRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzVCVWxRNVRiRWRteTJvbkhZS2xBQmciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfNUJVbFJKVGJFZG15Mm9uSFlLbEFCZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNUJVbFJaVGJFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzVCQ1JZSlRiRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzVCVWxScFRiRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il81QlVsUjVUYkVkbXkyb25IWUtsQUJnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzVCQ1JZSlRiRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il81QlVsU0pUYkVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il81QlVsU1pUYkVkbXkyb25IWUtsQUJnIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzVCQ1JZSlRiRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il81QlVsU3BUYkVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il81QlVsUzVUYkVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfNUJVbFRKVGJFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNUJVbFRaVGJFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il81QlVsVHBUYkVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXzVCVWxRWlRiRWRteTJvbkhZS2xBQmciIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il81QlVsUXBUYkVkbXkyb25IWUtsQUJnIiB4PSIxOTA4MCIgeT0iMTExMzAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVE3UmtLUzNFZG10UTRUY2t2NVMyUSIgZWxlbWVudD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWU1LUzNFZG10UTRUY2t2NVMyUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCIgZWxlbWVudD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9JUkJZTWFTM0VkbXRRNFRja3Y1UzJRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JUkJZTXFTM0VkbXRRNFRja3Y1UzJRIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfSVFRak1LUzNFZG10UTRUY2t2NVMyUSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWU02UzNFZG10UTRUY2t2NVMyUSIgdHlwZT0iS2luZCIgZWxlbWVudD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lSQllOS1MzRWRtdFE0VGNrdjVTMlEiIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JUkJZTmFTM0VkbXRRNFRja3Y1UzJRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSVJCWU5xUzNFZG10UTRUY2t2NVMyUSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWU42UzNFZG10UTRUY2t2NVMyUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50IiBlbGVtZW50PSJfSVFRak1LUzNFZG10UTRUY2t2NVMyUSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0lSQllPS1MzRWRtdFE0VGNrdjVTMlEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lSQllPYVMzRWRtdFE0VGNrdjVTMlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJSZWFsaXphdGlvbkxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JUkJZT3FTM0VkbXRRNFRja3Y1UzJRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JUkJZTzZTM0VkbXRRNFRja3Y1UzJRIiB0eXBlPSJSZXF1aXJlZEludGVyZmFjZUxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JUkJZUEtTM0VkbXRRNFRja3Y1UzJRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JUkJZUGFTM0VkbXRRNFRja3Y1UzJRIiB0eXBlPSJQcm92aWRlZEludGVyZmFjZUxpc3RDb21wYXJ0bWVudCIgZWxlbWVudD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JUkJZUHFTM0VkbXRRNFRja3Y1UzJRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JUkJZUDZTM0VkbXRRNFRja3Y1UzJRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0lSQllRS1MzRWRtdFE0VGNrdjVTMlEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29tcG9uZW50U3R5bGUiIHhtaTppZD0iX0lRN1JrYVMzRWRtdFE0VGNrdjVTMlEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JUTdSa3FTM0VkbXRRNFRja3Y1UzJRIiB4PSIxOTA1MCIgeT0iMTYwMDciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX2tPVmw5cFRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9rUUtLN3BUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIiBzb3VyY2U9Il9rUUtLMzVUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXQ9Il9rUUVFUVpUWUVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0s4WlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWVMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTRCMDFFMyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRUVJjSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0QjAxRTMiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FRUmNaVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0QjAxRTMiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRS0s4cFRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRUVJjcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUYiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVFSZEpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRiIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FRUmM1VFlFZG15Mm9uSFlLbEFCZyIgeD0iLTI1OSIgeT0iLTI2NCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FRUmRaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUYiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVFSZDVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1JvbGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUYiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRUVJkcFRZRWRteTJvbkhZS2xBQmciIHg9IjIxOCIgeT0iLTExNjQiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lFSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lFcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUQiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lFWlRZRWRteTJvbkhZS2xBQmciIHg9IjM0NSIgeT0iLTI2MyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUU1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lGWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFEIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUVdZRkpUWUVkbXkyb25IWUtsQUJnIiB4PSI2NjMiIHk9Ii0xMDE3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZRnBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUdKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUYiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRV1lHWlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWUY1VFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUdwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFEIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUhKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUQiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRV1lIWlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWUc1VFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfa1FLSzc1VFlFZG15Mm9uSFlLbEFCZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2tRS0s4SlRZRWRteTJvbkhZS2xBQmciIHBvaW50cz0iWy0zMywgOTk5LCAtNDQwLCAtNzM5OV0kWy0zMywgNzE4OCwgLTQ0MCwgLTEyMTBdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2tRV1lIcFRZRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5ODAyQzIiIHNvdXJjZT0iX2tRS0szNVRZRWRteTJvbkhZS2xBQmciIHRhcmdldD0iX2tRRUVVSlRZRWRteTJvbkhZS2xBQmciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUlaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTgwMkMyIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUk1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk4MDJDMiIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZSkpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk4MDJDMiIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWUlwVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUpaVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDMiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZSjVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWUpwVFlFZG15Mm9uSFlLbEFCZyIgeT0iMzk3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZS0pUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDMiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZS3BUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1JvbGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDMiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lLWlRZRWRteTJvbkhZS2xBQmciIHk9Ii0zOTciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lLNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lMWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDEiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lMSlRZRWRteTJvbkhZS2xBQmciIHg9Ii0xMCIgeT0iLTMwMSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUxwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lNSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQxIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUVdZTDVUWUVkbXkyb25IWUtsQUJnIiB4PSI0OTQiIHk9Ii0xNTcxIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZTVpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWU01VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDMiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRV1lOSlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWU1wVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWU5aVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQxIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWU41VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDEiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRV1lPSlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWU5wVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfa1FXWUg1VFlFZG15Mm9uSFlLbEFCZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2tRV1lJSlRZRWRteTJvbkhZS2xBQmciIHBvaW50cz0iWzIwNDAsIDMzMCwgLTU2ODEsIC0yOTIxXSRbNzczMCwgMzMwLCA4LCAtMjkyMV0kWzc3MzAsIDIyNTIsIDgsIC05OTldIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2tRV1lQcFRZRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMDAwRTgiIHNvdXJjZT0iX2tRRUVYNVRZRWRteTJvbkhZS2xBQmciIHRhcmdldD0iX2tRS0szNVRZRWRteTJvbkhZS2xBQmciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWVFaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjAwMEU4Ij4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWVE1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIwMDBFOCIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZUkpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIwMDBFOCIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWVFwVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWVJaVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTMiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlc0pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWVJwVFlFZG15Mm9uSFlLbEFCZyIgeT0iMzk3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlc1pUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTMiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlczVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1JvbGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTMiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2VzcFRZRWRteTJvbkhZS2xBQmciIHk9Ii0zOTciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V0SlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V0cFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTEiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2V0WlRZRWRteTJvbkhZS2xBQmciIHg9Ii0xNTY4IiB5PSI1MTYiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V0NVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNldVpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZXVKVFlFZG15Mm9uSFlLbEFCZyIgeD0iLTYwMiIgeT0iODM0Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNldXBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXZKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTMiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRY2V2WlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZXU1VFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXZwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTExIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXdKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTEiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRY2V3WlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZXY1VFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfa1FXWVA1VFlFZG15Mm9uSFlLbEFCZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2tRV1lRSlRZRWRteTJvbkhZS2xBQmciIHBvaW50cz0iWy03NzAsIDc4NywgLTUyNDAsIC0yNDYzXSRbLTc3MCwgMjczNCwgLTUyNDAsIC01MTZdJFsyNDI5LCAyNzM0LCAtMjA0MCwgLTUxNl0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfa1FjZXdwVFlFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE1MDJFMiIgc291cmNlPSJfa1FLSzM1VFlFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0PSJfa1FLSzBKVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNleFpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNTAyRTIiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNleDVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTUwMkUyIi8+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V5SlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTUwMkUyIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUWNleHBUWUVkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNleVpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI4MSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V5NVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvTXVsdGlwbGljaXR5IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjgxIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUWNleXBUWUVkbXkyb25IWUtsQUJnIiB5PSIzOTciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V6SlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI4MSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V6cFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvUm9sZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI4MSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZXpaVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXo1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjdGIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZTBaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI3RiIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZTBKVFlFZG15Mm9uSFlLbEFCZyIgeD0iNDE2IiB5PSI1OTMiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2UwcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyN0YiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlMUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI3RiIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZTA1VFlFZG15Mm9uSFlLbEFCZyIgeD0iLTYiIHk9IjI0MjYiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2UxWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlMTVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI4MSI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FjZTJKVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUWNlMXBUWUVkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsVUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyN0YiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsVXBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI3RiI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FpbFU1VFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUWlsVVpUWUVkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9rUWNldzVUWUVkbXkyb25IWUtsQUJnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfa1FjZXhKVFlFZG15Mm9uSFlLbEFCZyIgcG9pbnRzPSJbMjQwOCwgMjgsIC00NzYyLCAzNTczXSRbNjQ1NiwgMjgsIC03MTQsIDM1NzNdJFs2NDU2LCAtMjQzNCwgLTcxNCwgMTExMV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfa1FpbFlwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX2tQMzI4SlRZRWRteTJvbkhZS2xBQmciIHRhcmdldD0iX2tRS0swSlRZRWRteTJvbkhZS2xBQmciPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfa1FpbFk1VFlFZG15Mm9uSFlLbEFCZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfa1FpbFpKVFlFZG15Mm9uSFlLbEFCZyIgcG9pbnRzPSJbLTM0OTMsIC03OSwgMzg2MywgLTI0ODddJFstNTA4MCwgLTc5LCAyMjc2LCAtMjQ4N10kWy01MDgwLCAxMjk3LCAyMjc2LCAtMTExMV0iLz4KLSAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2tRaWxaWlRZRWRteTJvbkhZS2xBQmciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfa1FpbFpwVFlFZG15Mm9uSFlLbEFCZyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX0I0YkkwSlRjRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il9CM3dhY0pUY0VkbXkyb25IWUtsQUJnIiBzb3VyY2U9Il9rUUVFVUpUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXQ9Il81QlVsUUpUYkVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0YkkwNVRjRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWVMYWJlbCIgZWxlbWVudD0iX0Izd2FjSlRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJMVpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfQjN3YWNKVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJMXBUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfQjN3YWNKVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQjRiSTFKVGNFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTE1VGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX0Izd2FjcFRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJMlpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIgZWxlbWVudD0iX0Izd2FjcFRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0I0YkkySlRjRWRteTJvbkhZS2xBQmciIHk9IjM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTJwVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9CM3dhY3BUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTNKVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlIiBlbGVtZW50PSJfQjN3YWNwVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQjRiSTI1VGNFZG15Mm9uSFlLbEFCZyIgeT0iLTM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTNaVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0YkkzNVRjRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il9CM3dhY1pUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9CNGJJM3BUY0VkbXkyb25IWUtsQUJnIiB4PSItMTI4MCIgeT0iNTc1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJNEpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0Ykk0cFRjRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlIiBlbGVtZW50PSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQjRiSTRaVGNFZG15Mm9uSFlLbEFCZyIgeD0iLTQ4NiIgeT0iODkzIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJNDVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfQjN3YWNwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0Ykk1WlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfQjN3YWNwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfQjRiSTVwVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9CNGJJNUpUY0VkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJNTVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9CM3dhY1pUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTZaVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9CM3dhY1pUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9CNGJJNnBUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0I0Ykk2SlRjRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0I0YkkwWlRjRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9CNGJJMHBUY0VkbXkyb25IWUtsQUJnIiBwb2ludHM9IlsyMDY0LCAyNywgLTQyODYsIDI3XSRbNDk3NCwgMjcsIC0xMzc2LCAyN10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfYk5odjRKVGNFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iX2JORE93SlRjRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iX2tRRUVVSlRZRWRteTJvbkhZS2xBQmciIHRhcmdldD0iX2tRRUVOWlRZRWRteTJvbkhZS2xBQmciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjQ1VGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZUxhYmVsIiBlbGVtZW50PSJfYk5ET3dKVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY1WlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il9iTkRPd0pUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY1cFRjRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il9iTkRPd0pUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9iTmh2NUpUY0VkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2NTVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY2WlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvTXVsdGlwbGljaXR5IiBlbGVtZW50PSJfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYk5odjZKVGNFZG15Mm9uSFlLbEFCZyIgeT0iMzk3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2NnBUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2JORE93cFRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2N0pUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1JvbGUiIGVsZW1lbnQ9Il9iTkRPd3BUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9iTmh2NjVUY0VkbXkyb25IWUtsQUJnIiB5PSItMzk3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2N1pUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9iTkRPd1pUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjc1VGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIgZWxlbWVudD0iX2JORE93WlRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2JOaHY3cFRjRWRteTJvbkhZS2xBQmciIHg9Ii0yNTciIHk9Ii0zNTMiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY4SlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9iTkRPd1pUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjhwVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVJvbGUiIGVsZW1lbnQ9Il9iTkRPd1pUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9iTmh2OFpUY0VkbXkyb25IWUtsQUJnIiB4PSI2MSIgeT0iLTE3ODIiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY4NVRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9iTkRPd3BUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjlaVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9iTkRPd3BUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9iTmh2OXBUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2JOaHY5SlRjRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY5NVRjRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2JORE93WlRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2LVpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCIgZWxlbWVudD0iX2JORE93WlRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2JOaHYtcFRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYk5odi1KVGNFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfYk5odjRaVGNFZG15Mm9uSFlLbEFCZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2JOaHY0cFRjRWRteTJvbkhZS2xBQmciIHBvaW50cz0iWzUsIDQyLCAtMTgsIC0xMTFdJFs1LCAxMjMsIC0xOCwgLTMwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICA8L2NvbnRlbnRzPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX2tNREc0WlRZRWRteTJvbkhZS2xBQmciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa01ERzRwVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tNREc0NVRZRWRteTJvbkhZS2xBQmciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQmFzaWMucHJvZmlsZS51bWwyI182bUZSZ0s4NkVkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9CYXNpYy5wcm9maWxlLnVtbDIjXzZtRlJnSzg2RWRpaDktR0c1YWZRMGciLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfa01ERzVKVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTURHNVpUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfa01ERzVwVFlFZG15Mm9uSFlLbEFCZyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9JbnRlcm1lZGlhdGUucHJvZmlsZS51bWwyI19Dejdjc0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9JbnRlcm1lZGlhdGUucHJvZmlsZS51bWwyI19Dejdjc0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX2tNREc1NVRZRWRteTJvbkhZS2xBQmciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa01ERzZKVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tNREc2WlRZRWRteTJvbkhZS2xBQmciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQ29tcGxldGUucHJvZmlsZS51bWwyI19NN3BUa0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9Db21wbGV0ZS5wcm9maWxlLnVtbDIjX003cFRrSzg3RWRpaDktR0c1YWZRMGciLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfa01ERzZwVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTURHNjVUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfa01ERzdKVFlFZG15Mm9uSFlLbEFCZyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX2FfUzN3TldMRWRpeTRJcVA4d2hqRkE/RGVmYXVsdCIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfa01ERzdaVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTURHN3BUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfa01ERzc1VFlFZG15Mm9uSFlLbEFCZyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX3ZqYnV3T3ZIRWRpRFg1YmppMGlWU0E/RGVwbG95bWVudCIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9rTURHOEpUWUVkbXkyb25IWUtsQUJnIj4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19FZlJab0s4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX2tNSk5nNVRZRWRteTJvbkhZS2xBQmciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa01KTmhKVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tNSk5oWlRZRWRteTJvbkhZS2xBQmciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1JPU0VfUFJPRklMRVMvUm9zZS5lcHgjXzh5UG1nRU80RWRtWkZaazd6alotZUE/Um9zZSIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1JPU0VfUFJPRklMRVMvUm9zZS5lcHgjXzh5UG1nRU80RWRtWkZaazd6alotZUE/Um9zZSIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9rTnEzZ1pUWUVkbXkyb25IWUtsQUJnIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tOcTNncFRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9rTnEzZzVUWUVkbXkyb25IWUtsQUJnIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sMiNfc2lQdDRLODdFZGk1UXBZZVlfeUlwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwyI19zaVB0NEs4N0VkaTVRcFllWV95SXBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX0gweWU4SlR2RWRtRE5ZNmxuR0FnNUEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfSDB5ZThaVHZFZG1ETlk2bG5HQWc1QSIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX0gweWU4cFR2RWRtRE5ZNmxuR0FnNUEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0iSmF2YS5lcHgjXy1ab3l3SlNrRWRtamF1U2pHOHFPMkE/SmF2YSIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0iSmF2YS5lcHgjXy1ab3l3SlNrRWRtamF1U2pHOHFPMkE/SmF2YSIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiIG5hbWU9IldvcmtiZW5jaENvbXBvbmVudCI+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQyMDE0NzFEMDIwOCIgbmFtZT0ibmFtZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFEIiBuYW1lPSJyZXNvdXJjZXMiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQTBCMjQ3NDAyNUY0MUUzRTE0QjAxRTMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfa09WbDRaVFlFZG15Mm9uSFlLbEFCZyIgdmFsdWU9Ii0xIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9rT1ZsNEpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQxIiBuYW1lPSJjb21wb25lbnRUeXBlIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFQzFENTEwM0UyIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDFFQzFEOTgwMkMyIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tPVmw2SlRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSIxIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9rT1ZsNTVUWUVkbXkyb25IWUtsQUJnIiB2YWx1ZT0iMSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI3RiIgbmFtZT0icmVmZXJlbmNlZENvbXBvbmVudHMiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUY2QzI0QjAyM0QiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNTAyRTIiPgotICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfa09WbDhwVFlFZG15Mm9uSFlLbEFCZyIgdmFsdWU9Ii0xIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9rT1ZsOFpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRTNERjY3MDAzOSIgbmFtZT0iQ29tcG9uZW50UmVzb3VyY2UiPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY5NzAxMjgiIG5hbWU9InNvdXJjZVBhdGgiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiLz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFRUM2NDAwMjVCIiBuYW1lPSJydW50aW1lUGF0aCIgdHlwZT0iXzNBMEIyNDc0MDI1RjQxRUMyNkRBMDI3QSIvPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY5RTAxMUUiIG5hbWU9ImV4Y2x1c2lvbnMiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfa04zRXhwVFlFZG15Mm9uSFlLbEFCZyIgdmFsdWU9Ii0xIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9rTjNFeFpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIiBuYW1lPSJjb21wb25lbnQiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQTBCMjQ3NDAyNUY0MUUzRTE0QjAxRTMiPgotICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfa09WbDVKVFlFZG15Mm9uSFlLbEFCZyIgdmFsdWU9IjEiLz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2tPVmw0NVRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSIxIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfanc1R1FLVi1FZG1vWWVPLVdSOWFEZyIgbmFtZT0icmVzb3VyY2VUeXBlIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFQzFENTEwM0UyIiBuYW1lPSJDb21wb25lbnRUeXBlIj4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFQzIxMzQwMzU3IiBuYW1lPSJjb21wb25lbnRUeXBlSWQiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX1VEa2dFSlRiRWRteTJvbkhZS2xBQmciIG5hbWU9InZlcnNpb24iPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX0Izd2FjWlRjRWRteTJvbkhZS2xBQmciIG5hbWU9InByb3BlcnRpZXMiIHR5cGU9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIiBhc3NvY2lhdGlvbj0iX0Izd2FjSlRjRWRteTJvbkhZS2xBQmciIGFnZ3JlZ2F0aW9uPSJzaGFyZWQiPgotICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfQjN3YWRKVGNFZG15Mm9uSFlLbEFCZyIgdmFsdWU9Ii0xIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9CM3dhYzVUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfYk5ET3daVGNFZG15Mm9uSFlLbEFCZyIgbmFtZT0ibWV0YWRhdGFSZXNvdXJjZXMiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiIGFzc29jaWF0aW9uPSJfYk5ET3dKVGNFZG15Mm9uSFlLbEFCZyIgYWdncmVnYXRpb249InNoYXJlZCI+Ci0gICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9iTkRPeEpUY0VkbXkyb25IWUtsQUJnIiB2YWx1ZT0iLTEiLz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2JORE93NVRjRWRteTJvbkhZS2xBQmciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiIG5hbWU9IklQYXRoIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tOOUxacFRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXBwbGllZFN0ZXJlb3R5cGVzIj4KLSAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0iRWNvcmVfMDpFY29yZV9fRURhdGFUeXBlIiB4bWk6aWQ9Il9rTjlMWjVUWUVkbXkyb25IWUtsQUJnIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTjlMYUpUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tOOUxhWlRZRWRteTJvbkhZS2xBQmciIGtleT0iZGF0YXR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRjU2NkRCMDI1MSIgbmFtZT0iUHJvamVjdENvbXBvbmVudHMiPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjdGRDAyM0EiIG5hbWU9InByb2plY3ROYW1lIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTEiIG5hbWU9ImNvbXBvbmVudHMiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMDAwRTgiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfa09WbDdaVFlFZG15Mm9uSFlLbEFCZyIgdmFsdWU9Ii0xIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9rT1ZsN0pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCIgbmFtZT0iUmVmZXJlbmNlZENvbXBvbmVudCI+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQyMDE0NUYwMDFDOSIgbmFtZT0iaGFuZGxlIiB0eXBlPSJfSVFRak1LUzNFZG10UTRUY2t2NVMyUSIvPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDVGQTAwMTUiIG5hbWU9InJ1bnRpbWVQYXRoIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFQzI2REEwMjdBIi8+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQyMDM5MjQzMDE2RSIgbmFtZT0iZGVwZW5kZW5jeVR5cGUiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiLz4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQyMDM5NEY1MDE4NSIgbmFtZT0iRGVwZW5kZW5jeVR5cGUiPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfa045TGNaVFlFZG15Mm9uSFlLbEFCZyIgYm9keT0idXNlcz0wJiN4QTtjb25zdW1lcz0xJiN4QTsiIGFubm90YXRlZEVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rT0pZb0pUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImFwcGxpZWRTdGVyZW90eXBlcyI+Ci0gICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0iRGVmYXVsdF8wOkRlZmF1bHRfX0RvY3VtZW50YXRpb24iIHhtaTppZD0iX2tPSllvWlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDIwMzk5MzgwMThEIiBuYW1lPSJ1c2VzIi8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAzOUE2RTAxMzkiIG5hbWU9ImNvbnN1bWVzIi8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0QjAxRTMiIG1lbWJlckVuZD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRCBfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIi8+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5ODAyQzIiIG1lbWJlckVuZD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MSBfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIj4KLSAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIiBuYW1lPSJfd29ya2JlbmNoTW9kdWxlIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDFFQzFEOTgwMkMyIi8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMDAwRTgiIG1lbWJlckVuZD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMSBfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIj4KLSAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIiBuYW1lPSJfcHJvamVjdE1vZHVsZXMiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMDAwRTgiLz4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE1MDJFMiIgbWVtYmVyRW5kPSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjdGIF8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiPgotICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiIG5hbWU9Il93b3JrYmVuY2hNb2R1bGUiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNTAyRTIiLz4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzVCQ1JZSlRiRWRteTJvbkhZS2xBQmciIG5hbWU9IlByb3BlcnR5Ij4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfN1hvOFlKVGJFZG15Mm9uSFlLbEFCZyIgbmFtZT0ibmFtZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfOGVPSjhKVGJFZG15Mm9uSFlLbEFCZyIgbmFtZT0idmFsdWUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9CM3dhY0pUY0VkbXkyb25IWUtsQUJnIiBtZW1iZXJFbmQ9Il9CM3dhY1pUY0VkbXkyb25IWUtsQUJnIF9CM3dhY3BUY0VkbXkyb25IWUtsQUJnIj4KLSAgICA8b3duZWRFbmQgeG1pOmlkPSJfQjN3YWNwVGNFZG15Mm9uSFlLbEFCZyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiIgYXNzb2NpYXRpb249Il9CM3dhY0pUY0VkbXkyb25IWUtsQUJnIi8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9iTkRPd0pUY0VkbXkyb25IWUtsQUJnIiBtZW1iZXJFbmQ9Il9iTkRPd1pUY0VkbXkyb25IWUtsQUJnIF9iTkRPd3BUY0VkbXkyb25IWUtsQUJnIj4KLSAgICA8b3duZWRFbmQgeG1pOmlkPSJfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiIgYXNzb2NpYXRpb249Il9iTkRPd0pUY0VkbXkyb25IWUtsQUJnIi8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiIG5hbWU9IlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTjlMWnBUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImFwcGxpZWRTdGVyZW90eXBlcyI+Ci0gICAgICA8Y29udGVudHMgeG1pOnR5cGU9IkVjb3JlXzA6RWNvcmVfX0VEYXRhVHlwZSIgeG1pOmlkPSJfa045TFo1VFlFZG15Mm9uSFlLbEFCZyIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tOOUxhSlRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfa045TGFaVFlFZG15Mm9uSFlLbEFCZyIga2V5PSJkYXRhdHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L293bmVkTWVtYmVyPgotPC91bWw6TW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9jb21wb25lbnRDb3JlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1NTUyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9jb21wb25lbnRDb3JlLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgcnVudGltZUphcj0idHJ1ZSIgbW9kZWxOYW1lPSJDb21wb25lbnRDb3JlIgotICAgIGVkaXRQbHVnaW5DbGFzcz0iY29tcG9uZW50Y29yZS5wcm92aWRlci5Db21wb25lbnRDb3JlRWRpdFBsdWdpbiIgZWRpdG9yUGx1Z2luQ2xhc3M9ImNvbXBvbmVudGNvcmUucHJlc2VudGF0aW9uLkNvbXBvbmVudENvcmVFZGl0b3JQbHVnaW4iPgotICA8Zm9yZWlnbk1vZGVsPmNvbXBvbmVudENvcmUuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iQ29tcG9uZW50Y29yZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24iIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBpbnRlcmZhY2VQYWNrYWdlU3VmZml4PSJpbnRlcm5hbCIgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIKLSAgICAgIGVjb3JlUGFja2FnZT0iY29tcG9uZW50Q29yZS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJjb21wb25lbnRDb3JlLmVjb3JlIy8vRGVwZW5kZW5jeVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21wb25lbnRDb3JlLmVjb3JlIy8vRGVwZW5kZW5jeVR5cGUvdXNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21wb25lbnRDb3JlLmVjb3JlIy8vRGVwZW5kZW5jeVR5cGUvY29uc3VtZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iY29tcG9uZW50Q29yZS5lY29yZSMvL0lQYXRoIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJjb21wb25lbnRDb3JlLmVjb3JlIy8vVVJJIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcG9uZW50Q29yZS5lY29yZSMvL1dvcmtiZW5jaENvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcG9uZW50Q29yZS5lY29yZSMvL1dvcmtiZW5jaENvbXBvbmVudC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Xb3JrYmVuY2hDb21wb25lbnQvcmVzb3VyY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcG9uZW50Q29yZS5lY29yZSMvL1dvcmtiZW5jaENvbXBvbmVudC9jb21wb25lbnRUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcG9uZW50Q29yZS5lY29yZSMvL1dvcmtiZW5jaENvbXBvbmVudC9yZWZlcmVuY2VkQ29tcG9uZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21wb25lbnRDb3JlLmVjb3JlIy8vQ29tcG9uZW50UmVzb3VyY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRSZXNvdXJjZS9zb3VyY2VQYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcG9uZW50Q29yZS5lY29yZSMvL0NvbXBvbmVudFJlc291cmNlL3J1bnRpbWVQYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcG9uZW50Q29yZS5lY29yZSMvL0NvbXBvbmVudFJlc291cmNlL2V4Y2x1c2lvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcG9uZW50Q29yZS5lY29yZSMvL0NvbXBvbmVudFJlc291cmNlL2NvbXBvbmVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRSZXNvdXJjZS9yZXNvdXJjZVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcG9uZW50Q29yZS5lY29yZSMvL0NvbXBvbmVudFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRUeXBlL2NvbXBvbmVudFR5cGVJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRUeXBlL3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vQ29tcG9uZW50VHlwZS9wcm9wZXJ0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcG9uZW50Q29yZS5lY29yZSMvL0NvbXBvbmVudFR5cGUvbWV0YWRhdGFSZXNvdXJjZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcG9uZW50Q29yZS5lY29yZSMvL1Byb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vUHJvcGVydHkvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Qcm9wZXJ0eS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21wb25lbnRDb3JlLmVjb3JlIy8vUmVmZXJlbmNlZENvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcG9uZW50Q29yZS5lY29yZSMvL1JlZmVyZW5jZWRDb21wb25lbnQvaGFuZGxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcG9uZW50Q29yZS5lY29yZSMvL1JlZmVyZW5jZWRDb21wb25lbnQvcnVudGltZVBhdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vUmVmZXJlbmNlZENvbXBvbmVudC9kZXBlbmRlbmN5VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9SZWZlcmVuY2VkQ29tcG9uZW50L2RlcGVuZGVudE9iamVjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21wb25lbnRDb3JlLmVjb3JlIy8vUHJvamVjdENvbXBvbmVudHMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Qcm9qZWN0Q29tcG9uZW50cy9wcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vUHJvamVjdENvbXBvbmVudHMvY29tcG9uZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9jb21wb25lbnRDb3JlUGFja2FnZS5lbXggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9jb21wb25lbnRDb3JlUGFja2FnZS5lbXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDNkZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZVBhY2thZ2UuZW14CisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0teHRvb2xzMl91bml2ZXJzYWxfdHlwZV9tYW5hZ2VyLS0+Ci08dW1sOk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbS94dG9vbHMvMS41LjAvTm90YXRpb24iIHhtbG5zOnVtbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzEuMC4wL1VNTCIgeG1sbnM6dW1sbm90YXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbS94dG9vbHMvMS41LjAvVW1sbm90YXRpb24iIHhtaTppZD0iX3dVQ0h3TU84RWRtbUViS0VCblcwQVEiIG5hbWU9ImNvbXBvbmVudENvcmVQYWNrYWdlIiBhcHBsaWVkUHJvZmlsZT0iX3dVQ0h4TU84RWRtbUViS0VCblcwQVEgX3dVQ0h4OE84RWRtbUViS0VCblcwQVEgX3dVQ0h5c084RWRtbUViS0VCblcwQVEgX3dVSU9Zc084RWRtbUViS0VCblcwQVEgX3dVSU9aY084RWRtbUViS0VCblcwQVEiPgotICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3dVQ0h3Y084RWRtbUViS0VCblcwQVEiIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iX3dVQ0h3c084RWRtbUViS0VCblcwQVEiPgotICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfd1VDSHdzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJyMVhVTU84RWRtbUViS0VCblcwQVEiIHNvdXJjZUVkZ2VzPSJfM0laWGdNTzhFZG1tRWJLRUJuVzBBUSBfM0lmZUlNTzhFZG1tRWJLRUJuVzBBUSBfM0lmZUo4TzhFZG1tRWJLRUJuVzBBUSIgdGFyZ2V0RWRnZXM9Il8zSVpYZ01POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJ2RmZvTU84RWRtbUViS0VCblcwQVEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il8ydkZmb2NPOEVkbW1FYktFQm5XMEFRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ydkZmb3NPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJ2RmZvOE84RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMnZGZnBNTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8ydkZmcGNPOEVkbW1FYktFQm5XMEFRIiBmaWx0ZXJpbmc9Ik1hbnVhbCI+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9InZpenJlZjovLy8jamZpZWxkXnZjb3JlLnRhcmdldD11bWwyLlByb3BlcnR5Xm5hbWU9YXJ0aWZhY3RFZGl0TW9kZWxbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpQcm9wZXJ0eSIgaHJlZj0idml6cmVmOi8vLyNqZmllbGRedmNvcmUudGFyZ2V0PXVtbDIuUHJvcGVydHlebmFtZT1pc1JlYWRPbmx5W2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9InZpenJlZjovLy8jamZpZWxkXnZjb3JlLnRhcmdldD11bWwyLlByb3BlcnR5Xm5hbWU9aXNBcnRpZmFjdEVkaXRNb2RlbFNlbGZNYW5hZ2VkW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9zdHlsZXM+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ydkZmcHNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJ2RmZwOE84RWRtbUViS0VCblcwQVEiIGZpbHRlcmluZz0iQXV0b21hdGljIiBmaWx0ZXJpbmdLZXlzPSJwcml2YXRlLHBhY2thZ2UscHJvdGVjdGVkIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ydkZmcU1POEVkbW1FYktFQm5XMEFRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8ydkZmcWNPOEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ydkZmcXNPOEVkbW1FYktFQm5XMEFRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMnZGZnE4TzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8ycjFYVWNPOEVkbW1FYktFQm5XMEFRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzJyMVhVc084RWRtbUViS0VCblcwQVEiIHg9IjE1NTgyIiB5PSIyMTk0MiIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yNVRMa01POEVkbW1FYktFQm5XMEFRIiBzb3VyY2VFZGdlcz0iXzNJbGt3TU84RWRtbUViS0VCblcwQVEgXzNJbGt5TU84RWRtbUViS0VCblcwQVEiIHRhcmdldEVkZ2VzPSJfM0lmZUo4TzhFZG1tRWJLRUJuVzBBUSBfM0lsa3dNTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yNVRMazhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il8yNVRMbE1POEVkbW1FYktFQm5XMEFRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yNVRMbGNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjVUTGxzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI1VExsOE84RWRtbUViS0VCblcwQVEiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMjVUTG1NTzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yNVRMbWNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI1VExtc084RWRtbUViS0VCblcwQVEiIGZpbHRlcmluZz0iQXV0b21hdGljIiBmaWx0ZXJpbmdLZXlzPSJwcml2YXRlLHBhY2thZ2UscHJvdGVjdGVkIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI1VExtOE84RWRtbUViS0VCblcwQVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI1VExuTU84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjVUTG5jTzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI1VExuc084RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8yNVRMa2NPOEVkbW1FYktFQm5XMEFRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMjVUTGtzTzhFZG1tRWJLRUJuVzBBUSIgeD0iNzAwOSIgeT0iMTc0ODciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjlCMUFNTzhFZG1tRWJLRUJuVzBBUSIgdGFyZ2V0RWRnZXM9Il8zSWZlSU1POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5QjFBOE84RWRtbUViS0VCblcwQVEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyW2pjdV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il8yOUIxQk1POEVkbW1FYktFQm5XMEFRIiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjlCMUJjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOUIxQnNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5QjFCOE84RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyW2pjdV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjlCMUNNTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yOUIxQ2NPOEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOUg3b01POEVkbW1FYktFQm5XMEFRIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI5SDdvY084RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5SDdvc084RWRtbUViS0VCblcwQVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI5SDdvOE84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il8yOUIxQWNPOEVkbW1FYktFQm5XMEFRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMjlCMUFzTzhFZG1tRWJLRUJuVzBBUSIgeD0iMTYyMTgiIHk9IjE3NDkwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5NHdvTU84RWRtbUViS0VCblcwQVEiIHRhcmdldEVkZ2VzPSJfM0lsa3lNTzhFZG1tRWJLRUJuVzBBUSBfM0lyclk4TzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOTR3bzhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il8yOTR3cE1POEVkbW1FYktFQm5XMEFRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOTR3cGNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjk0d3BzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5NHdwOE84RWRtbUViS0VCblcwQVEiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMjk0d3FNTzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOTR3cWNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI5NHdxc084RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjk0d3E4TzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMjk0d3JNTzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOTR3cmNPOEVkbW1FYktFQm5XMEFRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMjk0d3JzTzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXzI5NHdvY084RWRtbUViS0VCblcwQVEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8yOTR3b3NPOEVkbW1FYktFQm5XMEFRIiB4PSIzODk0IiB5PSIyNTYxMSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yLVJMSU1POEVkbW1FYktFQm5XMEFRIiBzb3VyY2VFZGdlcz0iXzNJcnJZOE84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMi1STEk4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMi1STEpNTzhFZG1tRWJLRUJuVzBBUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMi1STEpjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzItUkxKc084RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yLVJMSjhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzItUkxLTU84RWRtbUViS0VCblcwQVEiIGZpbHRlcmluZz0iQXV0b21hdGljIiBmaWx0ZXJpbmdLZXlzPSJwcm90ZWN0ZWQscHJpdmF0ZSxwYWNrYWdlIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzItWFJ3TU84RWRtbUViS0VCblcwQVEiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMi1YUndjTzhFZG1tRWJLRUJuVzBBUSIgZmlsdGVyaW5nPSJBdXRvbWF0aWMiIGZpbHRlcmluZ0tleXM9InByb3RlY3RlZCxwcml2YXRlLHBhY2thZ2UiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50Q29yZVtqY3VebmFtZT1Db21wb25lbnRDb3JlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMi1YUndzTzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMi1YUnc4TzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yLVhSeE1POEVkbW1FYktFQm5XMEFRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMi1YUnhjTzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXzItUkxJY084RWRtbUViS0VCblcwQVEiIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50Q29yZVtqY3VebmFtZT1Db21wb25lbnRDb3JlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8yLVJMSXNPOEVkbW1FYktFQm5XMEFRIiB4PSIxOTA4IiB5PSIxNzQ5MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfd1VDSHc4TzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgPGVkZ2VzIHhtaTppZD0iXzNJWlhnTU84RWRtbUViS0VCblcwQVEiIHNvdXJjZT0iXzJyMVhVTU84RWRtbUViS0VCblcwQVEiIHRhcmdldD0iXzJyMVhVTU84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0laWGc4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0laWGhjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSVpYaDhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJWlhoc084RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzNJWlhoTU84RWRtbUViS0VCblcwQVEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzNJWlhnY084RWRtbUViS0VCblcwQVEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfM0laWGdzTzhFZG1tRWJLRUJuVzBBUSIgcG9pbnRzPSJbMjY3MywgNDMxMiwgMjY3MywgNDMxMl0kWzMyMjgsIDQzMTIsIDMyMjgsIDQzMTJdJFszMjI4LCA1NTU2LCAzMjI4LCA1NTU2XSRbMTkzMiwgNTU1NiwgMTkzMiwgNTU1Nl0kWzE5MzIsIDQ5NDcsIDE5MzIsIDQ5NDddIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iXzNJZmVJTU84RWRtbUViS0VCblcwQVEiIHNvdXJjZT0iXzJyMVhVTU84RWRtbUViS0VCblcwQVEiIHRhcmdldD0iXzI5QjFBTU84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lmZUk4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lmZUpjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkltcGxlbWVudGF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2ppbXBsXnZjb3JlLnRhcmdldD11bWwyLkltcGxlbWVudGF0aW9uW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJZmVKc084RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbXBsZW1lbnRhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqaW1wbF52Y29yZS50YXJnZXQ9dW1sMi5JbXBsZW1lbnRhdGlvbltqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyW2pjdV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW1wbGVtZW50YXRpb24iIGhyZWY9InZpenJlZjovLy8jamltcGxedmNvcmUudGFyZ2V0PXVtbDIuSW1wbGVtZW50YXRpb25banNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8zSWZlSk1POEVkbW1FYktFQm5XMEFRIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8zSWZlSWNPOEVkbW1FYktFQm5XMEFRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbXBsZW1lbnRhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqaW1wbF52Y29yZS50YXJnZXQ9dW1sMi5JbXBsZW1lbnRhdGlvbltqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyW2pjdV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfM0lmZUlzTzhFZG1tRWJLRUJuVzBBUSIgcG9pbnRzPSJbMjcsIC00OTQ4LCA1MywgMzE3NV0kWzI3LCAtNjgyNywgNTMsIDEyOTZdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iXzNJZmVKOE84RWRtbUViS0VCblcwQVEiIHNvdXJjZT0iXzJyMVhVTU84RWRtbUViS0VCblcwQVEiIHRhcmdldD0iXzI1VExrTU84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lmZUtzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lmZUxNTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJZmVMc084RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSWZlTGNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfM0lmZUs4TzhFZG1tRWJLRUJuVzBBUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfM0lmZUtNTzhFZG1tRWJLRUJuVzBBUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzNJZmVLY084RWRtbUViS0VCblcwQVEiIHBvaW50cz0iWy0xMywgNzA3NywgMjgzMSwgLTU2MzZdJFstMjg0NCwgODY2NCwgMCwgLTQwNDldIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iXzNJbGt3TU84RWRtbUViS0VCblcwQVEiIHNvdXJjZT0iXzI1VExrTU84RWRtbUViS0VCblcwQVEiIHRhcmdldD0iXzI1VExrTU84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lsa3c4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lsa3hjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lsa3g4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lsa3hzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8zSWxreE1POEVkbW1FYktFQm5XMEFRIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8zSWxrd2NPOEVkbW1FYktFQm5XMEFRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8zSWxrd3NPOEVkbW1FYktFQm5XMEFRIiBwb2ludHM9IlsyODMxLCAyOTY0LCAyODMxLCAyOTY0XSRbMjgzMSwgMzgzNywgMjgzMSwgMzgzN10kWzEzMjIsIDM4MzcsIDEzMjIsIDM4MzddJFsxMzIyLCAyOTY0LCAxMzIyLCAyOTY0XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il8zSWxreU1POEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9Il8yNVRMa01POEVkbW1FYktFQm5XMEFRIiB0YXJnZXQ9Il8yOTR3b01POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJbGt5OE84RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJcnJZTU84RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJcnJZc084RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJcnJZY084RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfM0lsa3pNTzhFZG1tRWJLRUJuVzBBUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfM0lsa3ljTzhFZG1tRWJLRUJuVzBBUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfM0lsa3lzTzhFZG1tRWJLRUJuVzBBUSIgcG9pbnRzPSJbMCwgNDA0OCwgMzMwNywgLTI0NjBdJFstMzMwNywgNTYzNSwgMCwgLTg3M10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfM0lyclk4TzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJfMi1STElNTzhFZG1tRWJLRUJuVzBBUSIgdGFyZ2V0PSJfMjk0d29NTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSXJyWnNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSXJyYU1POEVkbW1FYktFQm5XMEFRIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSXJyYXNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSXJyYWNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzNJcnJaOE84RWRtbUViS0VCblcwQVEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzNJcnJaTU84RWRtbUViS0VCblcwQVEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzNJcnJaY084RWRtbUViS0VCblcwQVEiIHBvaW50cz0iWy0xLCA0MDQ4LCAtMzMwOCwgLTI0NjBdJFszMzA3LCA1NjM1LCAwLCAtODczXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICA8L2NvbnRlbnRzPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX3dVQ0h4TU84RWRtbUViS0VCblcwQVEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfd1VDSHhjTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX3dVQ0h4c084RWRtbUViS0VCblcwQVEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQmFzaWMucHJvZmlsZS51bWwyI182bUZSZ0s4NkVkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9CYXNpYy5wcm9maWxlLnVtbDIjXzZtRlJnSzg2RWRpaDktR0c1YWZRMGciLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfd1VDSHg4TzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il93VUNIeU1POEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfd1VDSHljTzhFZG1tRWJLRUJuVzBBUSIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9JbnRlcm1lZGlhdGUucHJvZmlsZS51bWwyI19Dejdjc0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9JbnRlcm1lZGlhdGUucHJvZmlsZS51bWwyI19Dejdjc0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX3dVQ0h5c084RWRtbUViS0VCblcwQVEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfd1VJT1lNTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX3dVSU9ZY084RWRtbUViS0VCblcwQVEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQ29tcGxldGUucHJvZmlsZS51bWwyI19NN3BUa0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9Db21wbGV0ZS5wcm9maWxlLnVtbDIjX003cFRrSzg3RWRpaDktR0c1YWZRMGciLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfd1VJT1lzTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il93VUlPWThPOEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfd1VJT1pNTzhFZG1tRWJLRUJuVzBBUSIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX2FfUzN3TldMRWRpeTRJcVA4d2hqRkE/RGVmYXVsdCIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfd1VJT1pjTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il93VUlPWnNPOEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfd1VJT1o4TzhFZG1tRWJLRUJuVzBBUSIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX3ZqYnV3T3ZIRWRpRFg1YmppMGlWU0E/RGVwbG95bWVudCIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il93VUlPYU1POEVkbW1FYktFQm5XMEFRIj4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19FZlJab0s4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLTwvdW1sOk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvbW9kdWxlY29yZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvbW9kdWxlY29yZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWI2MjhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL21vZHVsZWNvcmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTkVFRFNNSUdSQVRJTkc9VGhpcyBwcm9qZWN0IG5lZWRzIHRvIG1pZ3JhdGUgV1RQIG1ldGFkYXRhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvbW9kdWxlY29yZU5MUy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvbW9kdWxlY29yZU5MUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzZiMmRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL21vZHVsZWNvcmVOTFMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfUmVhZF9FeGNlcHRpb249RXhjZXB0aW9uIHdoaWxlIGFjcXVpcmluZyBhcnRpZmFjdCBlZGl0IGZvciByZWFkLgotQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfV3JpdGVfRXhjZXB0aW9uPUV4Y2VwdGlvbiB3aGlsZSBhY3F1aXJpbmcgYXJ0aWZhY3QgZWRpdCBmb3Igd3JpdGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL0FydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL0FydGlmYWN0RWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmM1NDFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9BcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LklWYWxpZGF0ZUVkaXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIFByb3ZpZGVzIGEgRmFjYWRlIHBhdHRlcm4gZm9yIGFjY2Vzc2luZyBNb2R1bGUgQ29udGVudCBNZXRhbW9kZWxzIGZvciBXZWIgVG9vbHMgUGxhdGZvcm0gZmxleGlibGUKLSAqIG1vZHVsZXMuCi0gKiA8cD4KLSAqIEFydGlmYWN0RWRpdCBoaWRlcyB0aGUgbWFuYWdlbWVudCBvZiBhY2Nlc3NpbmcgZWRpdCBtb2RlbHMgKHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfSkKLSAqIGNvcnJlY3RseS4gRWFjaCBwcm9qZWN0IG1heSBoYXZlIG11bHRpcGxlICh7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0pcyBkZXBlbmRpbmcgb24gdGhlIG51bWJlcgotICogb2YgbW9kdWxlcyBjb250YWluZWQgYnkgdGhlIHByb2plY3QuIENsaWVudHMgc2hvdWxkIHVzZSBBcnRpZmFjdEVkaXQgb3IgYW4gYXBwcm9wcmlhdGUgc3ViY2xhc3MKLSAqIHdoZW4gd29ya2luZyB3aXRoIHRoZSBjb250ZW50IG1vZGVscyBvZiBXVFAgbW9kdWxlcy4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBFYWNoIEFydGlmYWN0RWRpdCBmYWNhZGUgaXMgZGVzaWduZWQgdG8gbWFuYWdlIHRoZSBFZGl0TW9kZWwgbGlmZWN5Y2xlIGZvciBjbGllbnRzLiBIb3dldmVyLAotICogd2hpbGUgZWFjaCBBcnRpZmFjdEVkaXQgaXMgZGVzaWduZWQgdG8gYmUgcGFzc2VkIGFyb3VuZCBhcyBuZWVkZWQsIGNsaWVudHMgbXVzdCBlbmZvcmNlIHRoZQotICogQXJ0aWZhY3RFZGl0IGxpZmVjeWNsZS4gVGhlIG1vc3QgY29tbW9uIG1ldGhvZCBvZiBhY3F1aXJpbmcgYSBBcnRpZmFjdEVkaXQgaW5zdGFuY2UgZmFjYWRlIGlzIHRvCi0gKiB1c2Uge0BzZWUgI2dldEFydGlmYWN0RWRpdEZvclJlYWQoV29ya2JlbmNoQ29tcG9uZW50KX0mbmJzcDtvcgotICoge0BzZWUgI2dldEFydGlmYWN0RWRpdEZvcldyaXRlKFdvcmtiZW5jaENvbXBvbmVudCl9LgotICogPC9wPgotICogPHA+Ci0gKiBXaGVuIGNsaWVudHMgaGF2ZSBjb25jbHVkZWQgdGhlaXIgdXNlIG9mIHRoZSBpbnN0YW5jZSwgPGI+Y2xpZW50cyBtdXN0IGNhbGwge0BzZWUgI2Rpc3Bvc2UoKX0KLSAqIDwvYj4uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgTW9kdWxlQ29yZU5hdHVyZQotICogQHNlZSBBcnRpZmFjdEVkaXRNb2RlbAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEVkaXQgaW1wbGVtZW50cyBJRWRpdE1vZGVsSGFuZGxlciwgSUFkYXB0YWJsZXsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gQXJ0aWZhY3RFZGl0LmNsYXNzOwotCXByaXZhdGUgZmluYWwgQXJ0aWZhY3RFZGl0TW9kZWwgYXJ0aWZhY3RFZGl0TW9kZWw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzUmVhZE9ubHk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZDsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0JpbmFyeTsKLQlwcml2YXRlIEJpbmFyeUNvbXBvbmVudEhlbHBlciBiaW5hcnlDb21wb25lbnRIZWxwZXI7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdE1vZGVsID0gbnVsbDsKLQkJcHJvamVjdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbQotCSAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcgY29udGVudAotCSAqICAgICAgICAgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYoYU1vZHVsZS5pc0JpbmFyeSgpKXsKLQkJCXJldHVybiBuZXcgQXJ0aWZhY3RFZGl0KGFNb2R1bGUpOwotCQl9Ci0JCWlmIChpc1ZhbGlkRWRpdGFibGVNb2R1bGUoYU1vZHVsZSkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQkJcmV0dXJuIG5ldyBBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCB0cnVlKTsKLQkJfSAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCWlmICghYU1vZHVsZS5pc0JpbmFyeSgpICYmIGlzVmFsaWRFZGl0YWJsZU1vZHVsZShhTW9kdWxlKSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCQlyZXR1cm4gbmV3IEFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCB0cnVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogICAgICAgICAgICBBIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZSBoYXMgYSBtb2R1bGVUeXBlSWQgd2hpY2ggaGFzIGEgZGVmaW5lZAotCSAqICAgICAgICAge0BzZWUgSUVkaXRNb2RlbEZhY3Rvcnl9Jm5ic3A7YW5kIGlzIGNvbnRhaW5lZCBieSBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYgKGFNb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKGFNb2R1bGUuZ2V0UHJvamVjdCgpKSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8qIGFuZCB0aGUgY29udGFpbmluZyBwcm9qZWN0IG11c3QgYmUgcmVzb2x2ZWFibGUgYW5kIGFjY2Vzc2libGUgKi8KLQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5BcnRpZmFjdEVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwgYW5BcnRpZmFjdEVkaXRNb2RlbCkgewotCQlhcnRpZmFjdEVkaXRNb2RlbCA9IGFuQXJ0aWZhY3RFZGl0TW9kZWw7Ci0JCWlzUmVhZE9ubHkgPSBhcnRpZmFjdEVkaXRNb2RlbC5pc1JlYWRPbmx5KCk7Ci0JCWlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZCA9IGZhbHNlOwotCQkKLQkJcHJvamVjdCA9IGFuQXJ0aWZhY3RFZGl0TW9kZWwuZ2V0UHJvamVjdCgpOwotCX0KLQotCQotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQoSVZpcnR1YWxDb21wb25lbnQgYUJpbmFyeU1vZHVsZSl7Ci0JCWlmKCFhQmluYXJ5TW9kdWxlLmlzQmluYXJ5KCkpewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgY29uc3RydWN0b3IgaXMgb25seSBmb3IgYmluYXJ5IGNvbXBvbmVudHMuIik7Ci0JCX0KLQkJYmluYXJ5Q29tcG9uZW50SGVscGVyID0gaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihhQmluYXJ5TW9kdWxlKTsKLQkJYXJ0aWZhY3RFZGl0TW9kZWwgPSBudWxsOwotCQlpc1JlYWRPbmx5ID0gdHJ1ZTsKLQkJaXNCaW5hcnkgPSB0cnVlOwotCQlpc0FydGlmYWN0RWRpdE1vZGVsU2VsZk1hbmFnZWQgPSB0cnVlOwotCQlwcm9qZWN0ID0gbnVsbDsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBCaW5hcnlDb21wb25lbnRIZWxwZXIgaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBiaW5hcnlNb2R1bGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LgotCSAqIDwvcD4KLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfSZuYnNwO2ZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbSB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgICAgIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlIGFOYXR1cmUsIElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB7Ci0JCWlmICh0b0FjY2Vzc0FzUmVhZE9ubHkpCi0JCQlhcnRpZmFjdEVkaXRNb2RlbCA9IGFOYXR1cmUuZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKGFNb2R1bGUuZ2V0UHJvamVjdCgpKSwgdGhpcyk7Ci0JCWVsc2UKLQkJCWFydGlmYWN0RWRpdE1vZGVsID0gYU5hdHVyZS5nZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKGFNb2R1bGUuZ2V0UHJvamVjdCgpKSwgdGhpcyk7Ci0JCWlzUmVhZE9ubHkgPSB0b0FjY2Vzc0FzUmVhZE9ubHk7Ci0JCWlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZCA9IHRydWU7Ci0JCXByb2plY3QgPSBhTmF0dXJlLmdldFByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Jm5ic3A7Zm9yIGFuIGFjY2Vzc2libGUgcHJvamVjdAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtwb2ludGluZyB0byBhIG1vZHVsZSBmcm9tIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0KLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRoaXMoYVByb2plY3QsdG9BY2Nlc3NBc1JlYWRPbmx5LGZhbHNlLG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAcGFyYW0gZm9yQ3JlYXRlCi0JICogQHBhcmFtIHByb2plY3RUeXBlCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSwgYm9vbGVhbiBmb3JDcmVhdGUsIFN0cmluZyBwcm9qZWN0VHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQotCQl0aGlzKGFQcm9qZWN0LHRvQWNjZXNzQXNSZWFkT25seSxmb3JDcmVhdGUscHJvamVjdFR5cGUsbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpIHsKLQkJaWYoIXZhbGlkQXJ0aWZhY3RFZGl0KXsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIEFydGlmYWN0IEVkaXQgYWNjZXNzIChtb2RlbCB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQpIik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkQXJ0aWZhY3RFZGl0ID0gdHJ1ZTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdmFsaWRBcnRpZmFjdEVkaXQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1hcmtJbnZhbGlkKCl7Ci0JCUxvZ2dlci5nbG9iYWwubG9nKExldmVsLldBUk5JTkcsICJJbnZhbGlkIEFydGlmYWN0IEVkaXQgYWNjZXNzIChtb2RlbCB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQpIik7Ci0JCXZhbGlkQXJ0aWZhY3RFZGl0ID0gZmFsc2U7Ci0JfQotCQotCQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEBwYXJhbSBmb3JDcmVhdGUKLQkgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSBVc2VkIHRvIHBhc3Mgc3BlY2lmaWMgZWRpdE1vZGVsIGVkaXQgKFVzZWQgdG8gbG9va3VwIGZhY3RvcnkpCi0JICogQHBhcmFtIGVkaXRNb2RlbFBhcmFtcyAtIFByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgY2FjaGVLZXkgb24gZWRpdE1vZGVsRmFjdG9yeQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdChJUHJvamVjdCBhUHJvamVjdCwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHksIGJvb2xlYW4gZm9yQ3JlYXRlLCBTdHJpbmcgcHJvamVjdFR5cGUsIE1hcCBlZGl0TW9kZWxQYXJhbXMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCi0JCWlmIChhUHJvamVjdCA9PSBudWxsIHx8ICFhUHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcHJvamVjdDogIiArIGFQcm9qZWN0KTsKLQotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShhUHJvamVjdCk7Ci0KLQkJaWYgKG5hdHVyZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdCBkb2VzIG5vdCBoYXZlIE1vZHVsZUNvcmVOYXR1cmU6ICIgKyBhUHJvamVjdCk7Ci0JCWlmICghdmFsaWRQcm9qZWN0VmVyc2lvbihhUHJvamVjdCkpewotCQkJbWFya0ludmFsaWQoKTsKLQkJfQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCk7Ci0JCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgY29tcG9uZW50IGhhbmRsZTogIiArIGFQcm9qZWN0KTsKLQkJaWYgKCFmb3JDcmVhdGUgJiYgIWlzVmFsaWRFZGl0YWJsZU1vZHVsZShjb21wb25lbnQpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjb21wb25lbnQgaGFuZGxlOiAiICsgYVByb2plY3QpOwotCQlwcm9qZWN0ID0gYVByb2plY3Q7Ci0JCVVSSSBjb21wb25lbnRVUkkgPSBNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShhUHJvamVjdCk7Ci0JCWlmIChnZXRDb250ZW50VHlwZURlc2NyaWJlcigpICE9IG51bGwpIHsKLQkJCWlmIChlZGl0TW9kZWxQYXJhbXMgPT0gbnVsbCkKLQkJCQllZGl0TW9kZWxQYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJZWRpdE1vZGVsUGFyYW1zLnB1dChBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuUEFSQU1fUk9PVF9VUkksIGdldFJvb3RVUkkoKSk7Ci0JCQllZGl0TW9kZWxQYXJhbXMucHV0KEFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5QQVJBTV9ST09UX0NPTlRFTlRfVFlQRSwgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSk7Ci0JCX0KLQkJaWYgKHRvQWNjZXNzQXNSZWFkT25seSkgCi0JCQlhcnRpZmFjdEVkaXRNb2RlbCA9IG5hdHVyZS5nZXRBcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQoY29tcG9uZW50VVJJLCB0aGlzLCBwcm9qZWN0VHlwZSwgZWRpdE1vZGVsUGFyYW1zKTsKLQkJZWxzZSAKLQkJCWFydGlmYWN0RWRpdE1vZGVsID0gbmF0dXJlLmdldEFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGUoY29tcG9uZW50VVJJLCB0aGlzLCBwcm9qZWN0VHlwZSwgZWRpdE1vZGVsUGFyYW1zKTsKLQkJCi0JCQkKLQkJaXNSZWFkT25seSA9IHRvQWNjZXNzQXNSZWFkT25seTsKLQkJaXNBcnRpZmFjdEVkaXRNb2RlbFNlbGZNYW5hZ2VkID0gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQcm9qZWN0T2ZUeXBlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSUQpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQodHlwZUlEKSkgewotCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZUlEKTsKLQkJCXJldHVybiBwcm9qZWN0RmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFVzZWQgdG8gb3B0aW9uYWxseSBkZWZpbmUgYW4gYXNzb2NpYXRlZCBjb250ZW50IHR5cGUgZm9yIFhNTCBmaWxlIGNyZWF0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSB7Ci0JCQotCQlpZiAoaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUpKQotCQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamJERCI7Ci0JCWlmIChpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkpCi0JCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYkREIjsKLQkJaWYgKGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKSkKLQkJCXJldHVybiAib3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyREQiOwotCQlpZiAoaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIElNb2R1bGVDb25zdGFudHMuSlNUX0FQUENMSUVOVF9NT0RVTEUpKQotCQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBjbGllbnRERCI7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIHRvIG9wdGlvbmFsbHkgZGVmaW5lIGFuIHJvb3QgVVJJIGZvciB0aGUgcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgVVJJIGdldFJvb3RVUkkoKSB7Ci0JCQotCQlpZiAoaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUpKQotCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoIk1FVEEtSU5GL2VqYi1qYXIueG1sIik7Ci0JCWlmIChpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkpCi0JCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSgiV0VCLUlORi93ZWIueG1sIik7Ci0JCWlmIChpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSkpCi0JCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSgiTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIik7Ci0JCWlmIChpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSkpCi0JCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSgiTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZFByb2plY3RWZXJzaW9uKElQcm9qZWN0IHByb2plY3QyKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEZvcmNlIGEgc2F2ZSBvZiB0aGUgdW5kZXJseWluZyBtb2RlbC4gVGhlIGZvbGxvd2luZyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLiBVbmxlc3MKLQkgKiByZXF1aXJlZCwgdXNlIHtAc2VlICNzYXZlSWZOZWNlc3NhcnkoSVByb2dyZXNzTW9uaXRvcil9Jm5ic3A7IGluc3RlYWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLklFZGl0TW9kZWxIYW5kbGVyI3NhdmUoKQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIE1vZHVsZUNvcmUgb2JqZWN0IHdhcyBjcmVhdGVkIGFzIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQlpZiAoaXNSZWFkT25seSgpKQotCQkJdGhyb3dBdHRlbXB0ZWRSZWFkT25seU1vZGlmaWNhdGlvbigpOwotCQllbHNlIGlmICh2YWxpZGF0ZUVkaXQoKS5pc09LKCkpCi0JCQlhcnRpZmFjdEVkaXRNb2RlbC5zYXZlKGFNb25pdG9yLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTYXZlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIG9ubHkgaWYgbm8gb3RoZXIgY2xpZW50cyBhcmUgY3VycmVudGx5IHVzaW5nIHRoZSBtb2RlbC4gSWYgdGhlCi0JICogbW9kZWwgaXMgbm90IHNoYXJlZCwgaXQgd2lsbCBiZSBzYXZlZC4gSWYgaXQgaXMgc2hhcmVkLCB0aGUgc2F2ZSB3aWxsIGJlIGRlZmVycmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5JRWRpdE1vZGVsSGFuZGxlciNzYXZlSWZOZWNlc3NhcnkoKQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIE1vZHVsZUNvcmUgb2JqZWN0IHdhcyBjcmVhdGVkIGFzIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCWlmIChpc1JlYWRPbmx5KCkpCi0JCQl0aHJvd0F0dGVtcHRlZFJlYWRPbmx5TW9kaWZpY2F0aW9uKCk7Ci0JCWVsc2UgaWYgKHZhbGlkYXRlRWRpdCgpLmlzT0soKSkKLQkJCWFydGlmYWN0RWRpdE1vZGVsLnNhdmVJZk5lY2Vzc2FyeShhTW9uaXRvciwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIGVkaXQgZm9yIHJlc291cmNlIHN0YXRlCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVFZGl0KCkgewotCQlJVmFsaWRhdGVFZGl0Q29udGV4dCB2YWxpZGF0b3IgPSAoSVZhbGlkYXRlRWRpdENvbnRleHQpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoSVZhbGlkYXRlRWRpdENvbnRleHQuQ0xBU1NfS0VZKTsKLQkJcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0ZVN0YXRlKGdldEFydGlmYWN0RWRpdE1vZGVsKCkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgb25seSBpZiBuZWNlc3NhcnkuIElmIHR5cGljYWxseSBhIHNhdmUgd291bGQgbm90IG9jY3VyIGJlY2F1c2UgdGhpcyBlZGl0IG1vZGVsIGlzCi0JICogc2hhcmVkLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHVzaW5nIHRoZSBAb3BlcmF0aW9uSGFuZGxlci4gCi0JICogSWYgdGhlIHByb21wdCByZXR1cm5zIHRydWUgKHRoZSB1c2VyIHdhbnRzIHRvIHNhdmUpIGFuZCB0aGUgbW9kZWwgaXMgbm90IHNoYXJlZCwgCi0JICogdGhlIGVudGlyZSBlZGl0IG1vZGVsIHdpbGwgYmUgc2F2ZWQuIFlvdSBtYXkgcGFzcyBpbiBhIGJvb2xlYW4gPGNvZGU+d2FzRGlydHk8L2NvZGU+IHRvCi0JICogaW5kaWNhdGUgd2hldGhlciB0aGlzIGVkaXQgbW9kZWwgd2FzIGRpcnR5IHByaW9yIHRvIG1ha2luZyBhbnkgY2hhbmdlcyBhbmQKLQkgKiBjYWxsaW5nIHRoaXMgbWV0aG9kLiB7QGxpbmsgRWRpdE1vZGVsI2lzRGlydHkoKX0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgYm9vbGVhbiB3YXNEaXJ0eSkgewotCi0JCWlmIChzaG91bGRTYXZlKG9wZXJhdGlvbkhhbmRsZXIsIHdhc0RpcnR5KSkKLQkJCXNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKLQkJZWxzZQotCQkJaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiBhIHNhdmVJZk5lY2Vzc2FyeSBvcgotCSAqIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQgZGV0ZXJtaW5lcyBub3QgdG8gc2F2ZS4gVGhpcyBwcm92aWRlcyBzdWJjbGFzc2VzIHdpdGggYW4KLQkgKiBvcHBvcnR1bml0eSB0byBkbyBzb21lIG90aGVyIGFjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgcmVzb3VyY2VzIGJlIHNhdmVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIGJvb2xlYW4gd2FzRGlydHkpIHsKLQkJcmV0dXJuICF3YXNEaXJ0eSA/IHNob3VsZFNhdmUoKSA6IHNob3VsZFNhdmUob3BlcmF0aW9uSGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0IGZvciBhIHNhdmUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHByb21wdFRvU2F2ZShJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyKSB7Ci0JCWlmIChvcGVyYXRpb25IYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvcGVyYXRpb25IYW5kbGVyLmNhbkNvbnRpbnVlKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9mb2xsb3dpbmdfcmVzb3VyY2VzX25lX1VJXyIpLCBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlVVJJcyh0cnVlKSk7IC8vJE5PTi1OTFMtMSQgPSAiVGhlIGZvbGxvd2luZyByZXNvdXJjZXMgbmVlZCB0byBiZSBzYXZlZCBidXQgYXJlIGN1cnJlbnRseSBzaGFyZWQsIGRvIHlvdSB3YW50IHRvIHNhdmUgbm93PyIKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIHJlc291cmNlcyBiZSBzYXZlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkU2F2ZShJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyKSB7Ci0JCXJldHVybiBzaG91bGRTYXZlKCkgfHwgcHJvbXB0VG9TYXZlKG9wZXJhdGlvbkhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgcmVzb3VyY2VzIGJlIHNhdmVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRTYXZlKCkgewotCQlyZXR1cm4gIWlzUmVhZE9ubHkoKSAmJiBpc0FydGlmYWN0RWRpdE1vZGVsU2VsZk1hbmFnZWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ2xpZW50cyBtdXN0IGNhbGwgdGhlIGZvbGxvd2luZyBtZXRob2Qgd2hlbiB0aGV5IGhhdmUgZmluaXNoZWQgdXNpbmcgdGhlIG1vZGVsLCBldmVuIGlmIHRoZQotCSAqIEFydGlmYWN0RWRpdCBpbnN0YW5jZSBmYWNhZGUgd2FzIGNyZWF0ZWQgYXMgcmVhZC1vbmx5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5JRWRpdE1vZGVsSGFuZGxlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihpc0JpbmFyeSgpKXsKLQkJCWJpbmFyeUNvbXBvbmVudEhlbHBlci5kaXNwb3NlKCk7Ci0JCX0gZWxzZSBpZiAoaXNBcnRpZmFjdEVkaXRNb2RlbFNlbGZNYW5hZ2VkICYmIGFydGlmYWN0RWRpdE1vZGVsICE9IG51bGwpCi0JCQlhcnRpZmFjdEVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHJvb3Qgb2JqZWN0IGZvciByZWFkIG9yIHdyaXRlIGFjY2VzcyAoZGVwZW5kaW5nIG9uIGhvdyB0aGUgY3VycmVudCBBcnRpZmFjdEVkaXQKLQkgKiB3YXMgbG9hZGVkKS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBUaGUgcm9vdCBvYmplY3Qgb2YgdGhlIHVuZGVybHlpbmcgbW9kZWwKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb250ZW50TW9kZWxSb290KCkgewotCQlpZihpc0JpbmFyeSgpKQotCQkgICByZXR1cm4gYmluYXJ5Q29tcG9uZW50SGVscGVyLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCWlmIChhcnRpZmFjdEVkaXRNb2RlbCE9bnVsbCkKLQkJCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbC5nZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGQgYSBsaXN0ZW5lciB0byB0cmFjayBsaWZlY3lsY2UgZXZlbnRzIGZyb20gdGhlIHVuZGVybHlpbmcgRWRpdE1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgRWRpdE1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZihpc0JpbmFyeSgpKXsKLQkJCQotCQl9IGVsc2UgewotCQkJaWYgKGFydGlmYWN0RWRpdE1vZGVsIT1udWxsICYmIGxpc3RlbmVyIT1udWxsKQotCQkJCWFydGlmYWN0RWRpdE1vZGVsLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3VwcGxpZWQgbGlzdGVuZXIKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIEVkaXRNb2RlbExpc3RlbmVyCi0JICogICAgICAgICAgIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKEVkaXRNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQl9IGVsc2UgaWYgKGFydGlmYWN0RWRpdE1vZGVsIT1udWxsICYmICFhcnRpZmFjdEVkaXRNb2RlbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWFydGlmYWN0RWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG1heSBiZSByZW1vdmVkIHNvb24uIEF2b2lkIGFkZGluZyBkZXBlbmRlbmNpZXMgdG8gaXQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyZWQgaW50ZXJuYWwgYW5kIG5vdCBwdWJsaXNoZWQgYXMgQVBJLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VkaXRNb2RlbChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbCA9PSBlZGl0TW9kZWw7Ci0JfQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gSVByb2plY3QgLSByZXR1cm5zIHRoZSBwcm9qZWN0IG9mIHRoZSB1bmRlcmx5aW5nIHdvcmtiZW5jaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gSVZpcnR1YWxDb21wb25lbnQgLSByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHdvcmtiZW5jaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJaWYoaXNCaW5hcnkoKSl7Ci0JCQlyZXR1cm4gYmluYXJ5Q29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudCgpOwotCQl9Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFZpcnR1YWxDb21wb25lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSB1bmRlcmx5aW5nIG1hbmFnZWQgZWRpdCBtb2RlbAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpIHsKLQkJaWYoaXNCaW5hcnkoKSl7Ci0JCQl0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJpbmFyeUNvbXBvbmVudEhlbHBlciBnZXRCaW5hcnlDb21wb25lbnRIZWxwZXIoKSB7Ci0JCXJldHVybiBiaW5hcnlDb21wb25lbnRIZWxwZXI7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gVGhlIEVNRiBjb21tYW5kIHN0YWNrIG1hbmFnZWQgYnkgdGhlIHVuZGVybHlpbmcgZWRpdG1vZGVsCi0JICovCi0JcHVibGljIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbC5nZXRDb21tYW5kU3RhY2soKTsKLQl9Ci0JLyoqCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVXNlICgoQXJ0aWZhY3RFZGl0TW9kZWwpZ2V0QWRhcHRlcihBcnRpZmFjdEVkaXRNb2RlbC5BREFQVEVSX1RZUEUpKS5kZWxldGVSZXNvdXJjZShhUmVzb3VyY2UpOwotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZihpc0JpbmFyeSgpKXsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJYXJ0aWZhY3RFZGl0TW9kZWwuZGVsZXRlUmVzb3VyY2UoYVJlc291cmNlKTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBUaGUgaXNEaXJ0eSBmbGFnIGJhc2VkIHRoZSB1bmRlcmx5aW5nIGVkaXRtb2RlbCdzIGxpc3Qgb2YgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbC5pc0RpcnR5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRocm93QXR0ZW1wdGVkUmVhZE9ubHlNb2RpZmljYXRpb24oKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dGVtcHQgdG8gbW9kaWZ5IGFuIEFydGlmYWN0RWRpdCBpbnN0YW5jZSBmYWNhZGUgdGhhdCB3YXMgbG9hZGVkIGFzIHJlYWQtb25seS4iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byBtb2RpZnkgYW4gQXJ0aWZhY3RFZGl0IGluc3RhbmNlIGZhY2FkZSB0aGF0IHdhcyBsb2FkZWQgYXMgYmluYXJ5LiIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNSZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKLQkJcmV0dXJuIGlzQmluYXJ5OwotCX0KLQkKLQkvKioKLQkgKiBGb3JjZSBhbGwgb2YgdGhlIGtub3duIHJlc291cmNlIFVSSXMgdG8gYmUgbG9hZGVkCi0JICogaWYgdGhleSBhcmUgbm90IGFscmVhZHkuCi0JICovCi0JcHVibGljIHZvaWQgZm9yY2VMb2FkS25vd25SZXNvdXJjZXMoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkKLQkJfSBlbHNlIHsKLQkJCUxpc3QgdXJpcyA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKLQkJCVVSSSB1cmkgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLnNpemUoKTsgaSsrKSB7Ci0JCQkJdXJpID0gKFVSSSkgdXJpcy5nZXQoaSk7Ci0JCQkJZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZSh1cmkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlIGZvciBAYVVyaS4KLQkgKiBAZGVwcmVjYXRlZCBVc2UgKChBcnRpZmFjdEVkaXRNb2RlbClnZXRBZGFwdGVyKEFydGlmYWN0RWRpdE1vZGVsLkFEQVBURVJfVFlQRSkpLmdldFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSBhVXJpKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIGJpbmFyeUNvbXBvbmVudEhlbHBlci5nZXRSZXNvdXJjZShhVXJpKTsKLQkJfQotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShhVXJpKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdE1vZGVsLmNsYXNzKQotCQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCk7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlclR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5jb21tYW5kU3RhY2tDaGFuZ2VkKGV2ZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvQ29tcG9uZW50Q29yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL0NvbXBvbmVudENvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjMWUzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvQ29tcG9uZW50Q29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudEltcGxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiBQcm92aWRlcyBhIGhhbmRsZSBjcmVhdGlvbiBmYWN0b3J5IGZvciB0aGUgVmlydHVhbCBQYXRoIEFQSS4gQ2xpZW50cyBtYXkgdXNlCi0gKiB0aGlzIGNsYXNzIHRvIGNvbnZlcnQgUGxhdGZvcm0gSVJlc291cmNlIG1vZGVsIGVsZW1lbnRzIHRvIElWaXJ0dWFsUmVzb3VyY2UKLSAqIG1vZGVsIGVsZW1lbnRzLgotICogPHA+Ci0gKiBDb21wb25lbnRDb3JlIHByb3ZpZGVzIGEgY29uc2lzdGVudCBlbnRyeSBwb2ludCB0byB0aGUgSVZpcnR1YWwgUGF0aCBtb2RlbAotICogdGhhdCBhbGxvd3MgY2xpZW50cyB0byBncm91cCByZXNvdXJjZXMgdG9nZXRoZXIgaW4gbG9naWNhbCBjb2xsZWN0aW9ucyB3aXRoIGEKLSAqIHBhdGggc3RydWN0dXJlIHRoYXQgdmFyaWVzIGZyb20gdGhlaXIgYWN0dWFsIHNvdXJjZSBsb2NhdGlvbiBzdHJ1Y3R1cmVzLgotICogPC9wPgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudENvcmUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVZpcnR1YWxSZXNvdXJjZVtdIE5PX1JFU09VUkNFUyA9IG5ldyBWaXJ0dWFsUmVzb3VyY2VbMF07Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxDb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoYUNvbXBvbmVudE5hbWUpCi0JICogY29udGFpbmVkIGJ5IHRoZSBnaXZlbiBwcm9qZWN0IChhUHJvamVjdCkuIENvbXBvbmVudCBuYW1lcyBzaG91bGQgYmUKLQkgKiB1bmlxdWUgYWNyb3NzIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGFjY2Vzc2libGUgcHJvamVjdCB0byBjb250YWluIHRoZSBjb21wb25lbnQKLQkgKiBAcmV0dXJuIEEgaGFuZGxlIHRvIGFuIElWaXJ0dWFsQ29tcG9uZW50IHRoYXQgbWF5IG9yIG1heSBub3QgZXhpc3Qgb3IKLQkgKiAgICAgICAgIG51bGwgaWYgcGFzc2VkIHByb2plY3QgZG9lcyBub3QgY29udGFpbiBNb2R1bGVDb3JlTmF0dXJlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjY3JlYXRlKGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwgfHwgIWFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBDb21wb25lbnRJbXBsTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIElWaXJ0dWFsQ29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgKGFDb21wb25lbnROYW1lKQotCSAqIGNvbnRhaW5lZCBieSB0aGUgZ2l2ZW4gcHJvamVjdCAoYVByb2plY3QpLiBDb21wb25lbnQgbmFtZXMgc2hvdWxkIGJlCi0JICogdW5pcXVlIGFjcm9zcyBhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBBIHZhbGlkLCBhY2Nlc3NpYmxlIHByb2plY3QgdG8gY29udGFpbiB0aGUgY29tcG9uZW50Ci0JICogQHJldHVybiBBIGhhbmRsZSB0byBhbiBJVmlydHVhbENvbXBvbmVudCB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0IG9yCi0JICogICAgICAgICBudWxsIGlmIHBhc3NlZCBwcm9qZWN0IGRvZXMgbm90IGNvbnRhaW4gTW9kdWxlQ29yZU5hdHVyZS4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjY3JlYXRlKGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBhTmFtZSkgewotCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxDb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoYUNvbXBvbmVudE5hbWUpCi0JICogCi0JICogQHBhcmFtIGFDb21wb25lbnROYW1lCi0JICogICAgICAgICAgICBBIG5hbWUgdG8gaWRlbnRpZnkgdGhlIGNvbXBvbmVudCwgdGhlIG5hbWUgY2FuIGJlCi0JICogICAgICAgICAgICBsaWIvJmx0O0Fic29sdXRlIHBhdGggb2YgYSBqYXImZ3Q7IG9yCi0JICogICAgICAgICAgICB2YXIvJmx0O0NMQVNTUEFUSF9WQVJJQUJMRS9saWJyYXJ5IG5hbWVyJmd0OwotCSAqIEByZXR1cm4gQSBoYW5kbGUgdG8gYW4gSVZpcnR1YWxDb21wb25lbnQgdGhhdCBtYXkgb3IgbWF5IG5vdCBleGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2NyZWF0ZShpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIGFDb21wb25lbnROYW1lKSB7Ci0JCXJldHVybiBDb21wb25lbnRJbXBsTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQoYVByb2plY3QsIGFDb21wb25lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxGb2xkZXIgd2l0aCBhIHJ1bnRpbWUgcGF0aCBzcGVjaWZpZWQgYnkgYVJ1bnRpbWVQYXRoCi0JICogY29udGFpbmVkIGJ5IGFQcm9qZWN0LCBpbiBhIGNvbXBvbmVudCBuYW1lZCBhQ29tcG9uZW50TmFtZS4gVGhlIHJlc3VsdGFudAotCSAqIElWaXJ0dWFsRm9sZGVyIG1heSBvciBtYXkgbm90IGV4aXN0LgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqICAgICAgICAgICAgQSB2YWxpZCwgYWNjZXNzaWJsZSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIGNvbXBvbmVudAotCSAqIEBwYXJhbSBhUnVudGltZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBydW50aW1lIHBhdGggb2YgdGhlIElWaXJ0dWFsRm9sZGVyIHRvIHJldHVybi4KLQkgKiBAcmV0dXJuIEFuIElWaXJ0dWFsRm9sZGVyIGNvbnRhaW5lZCBieSB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCB3aXRoIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gcnVudGltZSBwYXRoCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNjcmVhdGUoaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjY3JlYXRlTGluayhJUGF0aCwgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsRm9sZGVyIGNyZWF0ZUZvbGRlcihJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBDb21wb25lbnRJbXBsTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZUZvbGRlcihhUHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxGaWxlIHdpdGggYSBydW50aW1lIHBhdGggc3BlY2lmaWVkIGJ5IGFSdW50aW1lUGF0aAotCSAqIGNvbnRhaW5lZCBieSBhUHJvamVjdCwgaW4gYSBjb21wb25lbnQgbmFtZWQgYUNvbXBvbmVudE5hbWUuIElWaXJ0dWFsRmlsZXMKLQkgKiBjYW4gb25seSBiZSBjcmVhdGVkIGFzIGxpbmtzLiBVc2UKLQkgKiB7QGxpbmsgSVZpcnR1YWxSZXNvdXJjZSNnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKX0gb3IKLQkgKiB7QGxpbmsgSVZpcnR1YWxGaWxlI2dldFVuZGVybHlpbmdGaWxlKCl9IHRvIGNyZWF0ZSBhIHJlc291cmNlIHdpdGggcmVhbAotCSAqIGNvbnRlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqICAgICAgICAgICAgQSB2YWxpZCwgYWNjZXNzaWJsZSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIGNvbXBvbmVudAotCSAqIEBwYXJhbSBhUnVudGltZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBydW50aW1lIHBhdGggb2YgdGhlIElWaXJ0dWFsRm9sZGVyIHRvIHJldHVybi4KLQkgKiBAcmV0dXJuIEFuIElWaXJ0dWFsRmlsZSBjb250YWluZWQgYnkgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgd2l0aCB0aGUKLQkgKiAgICAgICAgIGdpdmVuIHJ1bnRpbWUgcGF0aAotCSAqIEBzZWUgSVZpcnR1YWxSZXNvdXJjZSNjcmVhdGVMaW5rKElQYXRoLCBpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxGaWxlIGNyZWF0ZUZpbGUoSVByb2plY3QgYVByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxGaWxlKGFQcm9qZWN0LCBhUnVudGltZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBJVmlydHVhbFJlZmVyZW5jZSB0aGF0IGNhcHR1cmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4KLQkgKiBhQ29tcG9uZW50IGFuZCBhUmVmZXJlbmNlZENvbXBvbmVudC4gVGhlIElWaXJ0dWFsUmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0JICogd2l0aCBhQ29tcG9uZW50IGFuZCB0YXJnZXQgYVJlZmVyZW5jZWRDb21wb25lbnQuIElWaXJ0dWFsUmVmZXJlbmNlcyBtYXkKLQkgKiBzcGFuIHByb2plY3RzLgotCSAqIAotCSAqIEBwYXJhbSBhQ29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHZhbGlkLCBleGlzdGluZyBJVmlydHVhbENvbXBvbmVudAotCSAqIEBwYXJhbSBhUmVmZXJlbmNlZENvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZXhpc3RpbmcgSVZpcnR1YWxDb21wb25lbnQKLQkgKiBAcmV0dXJuIEFuIElWaXJ0dWFsUmVmZXJlbmNlIHRoYXQgY2FwdHVyZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuCi0JICogICAgICAgICBhQ29tcG9uZW50IGFuZCBhUmVmZXJlbmNlZENvbXBvbmVudC4KLQkgKiBAc2VlIElWaXJ0dWFsUmVmZXJlbmNlI2NyZWF0ZShpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2UgY3JlYXRlUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQsIElWaXJ0dWFsQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50KSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbFJlZmVyZW5jZShhQ29tcG9uZW50LCBhUmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZSBjcmVhdGVSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCwgSVZpcnR1YWxDb21wb25lbnQgYVJlZmVyZW5jZWRDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbFJlZmVyZW5jZShhQ29tcG9uZW50LCBhUmVmZXJlbmNlZENvbXBvbmVudCwgcnVudGltZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBJVmlydHVhbFJlc291cmNlcyB0aGF0IHJlcHJlc2VudCB0aGUgZ2l2ZW4gSVJlc291cmNlLgotCSAqIEVhY2ggSVJlc291cmNlIGNvdWxkIGJlIG1hcHBlZCB0byBtdWx0aXBsZSBjb21wb25lbnRzLCBhbmQgdGh1cyBhbiBhcnJheQotCSAqIG9mIGVhY2ggSVZpcnR1YWxSZXNvdXJjZSB0aGF0IHJlcHJlc2VudHMgdGhlIElSZXNvdXJjZSB3aWxsIGJlIHJldHVybmVkLgotCSAqIEVhY2ggSVZpcnR1YWxSZXNvdXJjZSBtYXkgYWxzbyBtYXAgdG8gb3RoZXIgZXhpc3RpbmcgSVJlc291cmNlcywgc28gdGhlCi0JICogbWFwcGluZyBpcyBub3QgMToxLgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2UKLQkgKiAgICAgICAgICAgIEFuIGFjY2Vzc2libGUgSVJlc291cmNlCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBJVmlydHVhbFJlc291cmNlcyBmcm9tIHRoZSBtb2RlbCB0aGF0IHJlcHJlc2VudCB0aGUKLQkgKiAgICAgICAgIElSZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVzb3VyY2VbXSBjcmVhdGVSZXNvdXJjZXMoSVJlc291cmNlIGFSZXNvdXJjZSkgewotCQlJUHJvamVjdCBwcm9qID0gYVJlc291cmNlLmdldFByb2plY3QoKTsKLQkJU3RydWN0dXJlRWRpdCBzZSA9IG51bGw7Ci0JCUxpc3QgZm91bmRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlzZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvaik7Ci0JCQlpZiAoc2UgIT0gbnVsbCkgewotCQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gc2UuZmluZFJlc291cmNlc0J5U291cmNlUGF0aChhUmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLCBhUmVzb3VyY2UuZXhpc3RzKCkgPyBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FIDogUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfUkVTT1VSQ0VfQUxXQVlTKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoYVJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJCWZvdW5kUmVzb3VyY2VzLmFkZChuZXcgVmlydHVhbEZpbGUocHJvaiwgcmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCkpKTsKLQkJCQkJZWxzZQotCQkJCQkJZm91bmRSZXNvdXJjZXMuYWRkKENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKHByb2osIHJlc291cmNlc1tpXS5nZXRSdW50aW1lUGF0aCgpKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc2UgIT0gbnVsbCkgewotCQkJCXNlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlpZiAoZm91bmRSZXNvdXJjZXMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoSVZpcnR1YWxSZXNvdXJjZVtdKSBmb3VuZFJlc291cmNlcy50b0FycmF5KG5ldyBWaXJ0dWFsUmVzb3VyY2VbZm91bmRSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JCXJldHVybiBOT19SRVNPVVJDRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL0lFZGl0TW9kZWxIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvSUVkaXRNb2RlbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4OWIxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvSUVkaXRNb2RlbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiA8cD4KLSAqIFByb3ZpZGVzIGEgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciBtYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIGFuIEVkaXQgTW9kZWwuIENsaWVudHMgd2hpY2ggdXNlCi0gKiBpbnN0YW5jZXMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIDxiPnJlcXVpcmVkIHRvIGludm9rZSB7QHNlZSAjZGlzcG9zZSgpfTwvYj4gd2hlbiB0aGV5IGhhdmUKLSAqIGNvbXBsZXRlZCB0aGVpciB1c2FnZS4gT25jZSBjbGllbnRzIGhhdmUgZGlzcG9zZWQgdGhhdCBpbnN0YW5jZSwgdGhleSB3aWxsIG5vdCBiZSBhYmxlIHRvIGludm9rZQotICoge0BzZWUgI3NhdmUoSVByb2dyZXNzTW9uaXRvcil9b3Ige0BzZWUgI3NhdmVJZk5lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yKX0mbmJzcDthbmQgc2hvdWxkIGJlIHdhcnkgb2YKLSAqIHVzaW5nIGFueSBtb2RlbCBvYmplY3RzIGFjcXVpcmVkIGZyb20gdGhlIGhhbmRsZXIsIGFzIHRoZXkgbWF5IGJlIG9yIGJlY29tZSBzdGFsZS4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRNb2RlbEhhbmRsZXIgewotCi0JLyoqCi0JICogPHA+Ci0JICogRm9yY2UgYSBzYXZlIG9mIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgYW5kIGtlZXAgdHJhY2sgb2YgcHJvZ3Jlc3MgdXNpbmcgdGhlIHN1cHBsaWVkCi0JICogcHJvZ3Jlc3MgbW9uaXRvci4gQ2xpZW50cyBzaG91bGQgYXZvaWQgY2FsbGluZyB0aGlzIHZlcnNpb24gb2Ygc2F2ZSB1bmxlc3MgdGhleSBhcmUgY2VydGFpbgotCSAqIHRoZXkgcmVxdWlyZSB0aGUgbW9kZWwgdG8gYmUgc2F2ZWQuIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlCi0JICoge0BzZWUgI3NhdmVJZk5lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yKX0mbmJzcDtpbnN0ZWFkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgcHJvZ3Jlc3MgbW9uaXRvciBvciBudWxsCi0JICovCi0Jdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpOwotCi0JLyoqCi0JICogPHA+Ci0JICogU2F2ZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsLCBpZiBubyBvdGhlciBjb25zdW1lcnMgYXJlIHVzaW5nIHRoZSBlZGl0IG1vZGVsLCBhbmQga2VlcAotCSAqIHRyYWNrIG9mIHByb2dyZXNzIHVzaW5nIHRoZSBzdXBwbGllZCBwcm9ncmVzcyBtb25pdG9yLiBUaGlzIHZlcnNpb24gb2Ygc2F2ZSB3aWxsIG9ubHkgc2F2ZSBpZgotCSAqIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgaXMgbm90IHNoYXJlZCB3aXRoIG90aGVyIGNvbnN1bWVycy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb25pdG9yCi0JICogICAgICAgICAgICBBIHZhbGlkIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqLwotCXZvaWQgc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQ2xpZW50cyBtdXN0IGludm9rZSB0aGlzIG1ldGhvZCB3aGVuIHRoZXkgaGF2ZSBmaW5pc2hlZCB1c2luZyB0aGUgaGFuZGxlci4KLQkgKiA8L3A+Ci0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvTW9kdWxlQ29yZU5hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL01vZHVsZUNvcmVOYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5MzU2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvTW9kdWxlQ29yZU5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZVN0cnVjdHVyYWxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5BcnRpZmFjdEVkaXRNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuTW9kdWxlQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRWRpdE1vZGVsUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiA8cD4KLSAqIEFsbG93cyBwcm9qZWN0cyB0byBzdXBwb3J0IGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlcy4gVGhlIE1vZHVsZUNvcmVOYXR1cmUgbWFuYWdlcyB0aGUKLSAqIGNvbmZpZ3VyYXRpb24gb2YgYSBtb2R1bGUgc3RydWN0dXJhbCBidWlsZGVyIHRoYXQgcHJlcGFyZXMgV29ya2JlbmNoTW9kdWxlcyBmb3IgZGVwbG95bWVudC4KLSAqIDwvcD4KLSAqIDxwPgotICogVG8gZGV0ZXJtaW5lIGlmIGEgcHJvamVjdCBzdXBwb3J0cyBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZXMsIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZQotICogTW9kdWxlQ29yZU5hdHVyZToKLSAqIDxwPgotICogPGNvZGU+KE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KSAhPSBudWxsKTwvY29kZT4KLSAqIDwvcD4KLSAqIDxwPgotICogSWYgdGhlIHByb2plY3QgaGFzIGEgTW9kdWxlQ29yZU5hdHVyZSwgdGhlbiB0aGUgcHJvamVjdCBzdXBwb3J0cyBmbGV4aWJsZSBtb2R1bGUgc3RydWN0dXJlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogSW4gZ2VuZXJhbCwgY2xpZW50cyBhcmUgZXhwZWN0ZWQgdG8gdXNlIHRoZSB1dGlsaXR5IG1ldGhvZHMgYXZhaWxhYmxlIG9uIHRoaXMgY2xhc3MgdG8gYWNxdWlyZQotICogdGhlIE1vZHVsZUNvcmVOYXR1cmUgaW5zdGFuY2UgZnJvbSBhIGdpdmVuIHByb2plY3QgKHtAc2VlICNnZXRNb2R1bGVDb3JlTmF0dXJlKElQcm9qZWN0KX0KLSAqICZuYnNwO29yIHRvIG1ha2UgYSBmbGV4aWJsZSBwcm9qZWN0IGZsZXhpYmxlIGJ5IGFkZGluZyBhIE1vZHVsZUNvcmVOYXR1cmUgKAotICoge0BzZWUgI2FkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShJUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvcil9KS4KLSAqIDwvcD4gCi0gKiA8YSBuYW1lPSJtb2RlbC1kaXNjdXNzaW9uIi8+Ci0qIDxhIG5hbWU9Im1vZHVsZS1zdHJ1Y3R1cmFsLW1vZGVsIi8+Ci0qIDxwPgotKiBFYWNoIE1vZHVsZUNvcmVOYXR1cmUgZnJvbSBhIGdpdmVuIHByb2plY3QgY2FuIHByb3ZpZGUgYWNjZXNzIHRvIHRoZQotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwOyBvZiB0aGUgcHJvamVjdC4KLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0mbmJzcDsgaXMgYSBzdWJjbGFzcyBvZgotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWx9Jm5ic3A7dGhhdCBtYW5hZ2VzCi0qIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4gQXMgYW4gRWRpdE1vZGVsLCB0aGUKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0mbmJzcDsgcmVmZXJlbmNlcyBFTUYgcmVzb3VyY2VzLAotKiB0aGF0IGNvbnRhaW4gRU1GIG1vZGVscyAtLSBpbiB0aGlzIGNhc2UsIHRoZSBFTUYgbW9kZWwgb2YgPGk+LmNvbXBvbmVudCA8L2k+IGZpbGUuCi0qIDwvcD4KLSogPHA+Ci0qIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBFZGl0IEZhY2FkZSBwYXR0ZXJuICh2aWEKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdH0mbmJzcDsgb3Igb25lIGlmIGl0cyByZWxldmFudCBzdWJjbGFzc2VzKQotKiB0byB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4KLSogPC9wPgotKiA8YSBuYW1lPSJhcnRpZmFjdC1lZGl0bW9kZWwiLz4KLSogPHA+Ci0qIEVhY2ggTW9kdWxlQ29yZU5hdHVyZSBmcm9tIGEgZ2l2ZW4gcHJvamVjdCBjYW4gYWxzbyBwcm92aWRlIGFjY2VzcyB0byB0aGUKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfSZuYnNwOyBmb3IgZWFjaAotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwOyBjb250YWluZWQgYnkgdGhlIHByb2plY3QuIExpa2UKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0sCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5BcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDsgaXMgYSBzdWJjbGFzcyBvZgotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWx9Jm5ic3A7IHRoYXQgY29udGFpbnMKLSogRU1GIHJlc291cmNlcywgd2hpY2ggaW4gdHVybiBjb250YWluIHRoZSBFTUYgbW9kZWxzIG9mIG1vZHVsZSBtZXRhZGF0YSBmaWxlcyAoc3VjaCBhcyBKMkVFCi0qIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMpLgotKiA8L3A+Ci0qIDxwPgotKiBUaGUgZm9sbG93aW5nIGRpYWdyYW0gaGlnaGxpZ2h0cyB0aGUgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBzdWJjbGFzc2VzIG9mIEVkaXRNb2RlbCwgYW5kIHRoZQotKiByZWxhdGlvbnNoaXAgb2YgdGhlIEVkaXRNb2RlbCB0byB0aGUgRU1GIHJlc291cmNlcy4gSW4gdGhlIGRpYWdyYW0sICJNZXRhbW9kZWxSZXNvdXJjZSIgYW5kCi0qICJNZXRhbW9kZWxPYmplY3QiIGFyZSB1c2VkIGFzIHBsYWNlaG9sZGVycyBmb3IgdGhlIHNwZWNpZmljIHN1YmNsYXNzZXMgb2YKLSoge0BzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlfSZuYnNwO2FuZCB7QHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdH0mbmJzcDsKLSogcmVzcGVjdGl2ZWx5LgotKiA8L3A+Ci0qIDx0YWJsZSBjZWxsc3BhY2luZz0iMTAiIGNlbGxwYWRkaW5nPSIxMCI+Ci0qIDx0cj4KLSogPHRkPgotKiA8cD4KLSogPGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L21ldGFtb2RlbF9jb21wb25lbnRzLmpwZyIgLz4KLSogPC9wPgotKiA8L3RkPgotKiA8L3RyPgotKiA8dHI+Ci0qIDx0ZD4KLSogPHA+Ci0qIDxpPkZpZ3VyZSAxOiBBIGNvbXBvbmVudCBkaWFncmFtIG9mIHRoZSBNb2R1bGUgRWRpdCBNb2RlbHMuIDwvaT4KLSogPC9wPgotKiA8L3RkPgotKiA8L3RyPgotKiA8L3RhYmxlPgotKiA8cD4KLSogQ2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIEVkaXQgRmFjYWRlIHBhdHRlcm4gKHZpYQotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQXJ0aWZhY3RFZGl0fSZuYnNwOyBvciB3aGF0IGlmIGl0cyByZWxldmFudCBzdWJjbGFzc2VzKQotKiB0byB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4KLSogPC9wPgotKiA8YSBuYW1lPSJhY2Nlc3Nvci1rZXkiLz4KLSogPHA+Ci0qIEFsbCBFZGl0TW9kZWxzIGhhdmUgYSBsaWZlY3ljbGUgdGhhdCBtdXN0IGJlIGVuZm9yY2VkIHRvIGtlZXAgdGhlIHJlc291cmNlcyBsb2FkZWQgdGhhdCBhcmUgaW4KLSogdXNlLCBhbmQgdG8gdW5sb2FkIHJlc291cmNlcyB0aGF0IGFyZSBub3QgaW4gdXNlLiBUbyBhY2Nlc3MgYW4gRWRpdE1vZGVsLCBjbGllbnRzIGFyZSByZXF1aXJlZCB0bwotKiBzdXBwbHkgYW4gb2JqZWN0IHRva2VuIHJlZmVycmVkIHRvIGFzIGFuIGFjY2Vzc29yIGtleS4gVGhlIGFjY2Vzc29yIGtleSBhbGxvd3MgdGhlIGZyYW1ld29yayB0bwotKiBiZXR0ZXIgdHJhY2sgd2hpY2ggY2xpZW50cyBhcmUgdXNpbmcgdGhlIEVkaXRNb2RlbCwgYW5kIHRvIGVuc3VyZSB0aGF0IG9ubHkgYSBjbGllbnQgd2hpY2ggaGFzCi0qIGFjY2Vzc2VkIHRoZSBFZGl0TW9kZWwgd2l0aCBhbiBhY2Nlc3NvciBrZXkgbWF5IGludm9rZSBzYXZlKigpcyBvbiB0aGF0IEVkaXRNb2RlbC4KLSogPC9wPiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQjZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoSVByb2plY3QpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0I2dldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShJUHJvamVjdCkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0I2dldEFydGlmYWN0RWRpdEZvclJlYWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdCNnZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50KQotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlTmF0dXJlIGV4dGVuZHMgRWRpdE1vZGVsTmF0dXJlIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUsIElNb2R1bGVDb25zdGFudHMsIElTeW5jaHJvbml6ZXJFeHRlbmRlciB7Ci0JCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9CVUlMREVSX0lEID0gVmFsaWRhdGlvblBsdWdpbi5WQUxJREFUSU9OX0JVSUxERVJfSUQ7Ci0gICAgcHJpdmF0ZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgY2FjaGVkTW9kZWw7Ci0JLyoqCi0JICogPHA+Ci0JICogRmluZCBhbmQgcmV0dXJuIHRoZSBNb2R1bGVDb3JlTmF0dXJlIG9mIGFQcm9qZWN0LCBpZiBhdmFpbGFibGUuCi0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqICAgICAgICAgICAgQW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHJldHVybiBUaGUgTW9kdWxlQ29yZU5hdHVyZSBvZiBhUHJvamVjdCwgaWYgaXQgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVDb3JlTmF0dXJlIGdldE1vZHVsZUNvcmVOYXR1cmUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmIChhUHJvamVjdCAhPSBudWxsICYmIGFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJCXJldHVybiAoTW9kdWxlQ29yZU5hdHVyZSkgYVByb2plY3QuZ2V0TmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmxleGlibGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgYSBNb2R1bGVDb3JlTmF0dXJlIHRvIHRoZSBwcm9qZWN0LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBBIGFjY2Vzc2libGUgcHJvamVjdC4KLQkgKiBAcGFyYW0gYU1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvciB0byB0cmFjayB0aGUgdGltZSB0byBjb21wbGV0aW9uCi0JICogQHJldHVybiBUaGUgTW9kdWxlQ29yZU5hdHVyZSBvZiBhUHJvamVjdCwgaWYgaXQgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVDb3JlTmF0dXJlIGFkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShmaW5hbCBJUHJvamVjdCBhUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKGFQcm9qZWN0Lmhhc05hdHVyZShJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQpKQotCQkJCXJldHVybiBnZXRNb2R1bGVDb3JlTmF0dXJlKGFQcm9qZWN0KTsKLQotCQkJSUpvYk1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKTsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwkKLQkJCWlmIChhTW9uaXRvciAhPSBudWxsKQotCQkJCWFNb25pdG9yLmJlZ2luVGFzaygiQWRkIE1vZHVsZUNvcmUgTmF0dXJlIiwgNSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1hbmFnZXIuYmVnaW5SdWxlKHJvb3QsIGFNb25pdG9yKTsKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGFQcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJU3RyaW5nW10gY3VycmVudE5hdHVyZUlkcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJCVN0cmluZ1tdIG5ld05hdHVyZUlkcyA9IG5ldyBTdHJpbmdbY3VycmVudE5hdHVyZUlkcy5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnROYXR1cmVJZHMsIDAsIG5ld05hdHVyZUlkcywgMCwgY3VycmVudE5hdHVyZUlkcy5sZW5ndGgpOwotCQkJCW5ld05hdHVyZUlkc1tjdXJyZW50TmF0dXJlSWRzLmxlbmd0aF0gPSBJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQ7Ci0JCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZUlkcyk7Ci0JCQkJYVByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIGFNb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7IAkJCQkKLQkJCX0gZmluYWxseSB7Ci0JCQkJbWFuYWdlci5lbmRSdWxlKHJvb3QpOwotCQkJfSAJCQkKLQkJCWlmIChhTW9uaXRvciAhPSBudWxsKQotCQkJCWFNb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCS8qIFJldHVybiB0aGUgbmV3IG5hdHVyZSAqLwotCQlyZXR1cm4gZ2V0TW9kdWxlQ29yZU5hdHVyZShhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIGEge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwO2ZvciByZWFkLW9ubHkgYWNjZXNzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB7QHNlZSBNb2R1bGVDb3JlI2dldE1vZHVsZUNvcmVGb3JSZWFkKElQcm9qZWN0KX0mbmJzcDt0byB3b3JrCi0JICogd2l0aCB0aGUgTW9kdWxlIFN0cnVjdHVyYWwgTWV0YW1vZGVscyBvZiBmbGV4aWJsZSBwcm9qZWN0cy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogU2VlIHRoZSBkaXNjdXNzaW9uIHdoYXQgYSB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Jm5ic3A7IGlzIGFuZCA8YQotCSAqIGhyZWY9IiNtb2R1bGUtc3RydWN0dXJhbC1tb2RlbCI+aG93IGl0IHJlbGF0ZXMgdG8gdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbCA8L2E+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbHNvIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZiA8YSBocmVmPSIjYWNjZXNzb3Ita2V5Ij50aGUgcHVycG9zZSBvZiBhbiBhY2Nlc3NvciBrZXkgPC9hPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQWNjZXNzb3JLZXkKLQkgKiAgICAgICAgICAgIFR5cGljYWxseSBjbGllbnQgc3VwcGxpZXMgdGhlIG9iamVjdCB0aGF0IGludm9rZWQgdGhpcyBtZXRob2QsIG9yIGEgcHJveHkgKAotCSAqICAgICAgICAgICAgPGNvZGU+bmV3IE9iamVjdCgpPC9jb2RlPikgaW4gdGhlIGNhc2Ugb2Ygb3RoZXIgc3RhdGljIG1ldGhvZHMgcmVxdWVzdGluZyBhCi0JICogICAgICAgICAgICB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9LgotCSAqIEByZXR1cm4gQSB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Zm9yIHRoZSBwcm9qZWN0IG9mIHRoZSBjdXJyZW50IG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlU3RydWN0dXJhbE1vZGVsIGdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbEZvclJlYWQoT2JqZWN0IGFuQWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIChNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwpIGdldEVkaXRNb2RlbEZvclJlYWQoTW9kdWxlU3RydWN0dXJhbE1vZGVsRmFjdG9yeS5NT0RVTEVfU1RSVUNUVVJBTF9NT0RFTF9JRCwgYW5BY2Nlc3NvcktleSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIGEge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwO2ZvciB3cml0ZSBhY2Nlc3MuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHtAc2VlIE1vZHVsZUNvcmUjZ2V0TW9kdWxlQ29yZUZvcldyaXRlKElQcm9qZWN0KX0mbmJzcDt0byB3b3JrCi0JICogd2l0aCB0aGUgTW9kdWxlIFN0cnVjdHVyYWwgTWV0YW1vZGVscyBvZiBmbGV4aWJsZSBwcm9qZWN0cy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogU2VlIHRoZSBkaXNjdXNzaW9uIHdoYXQgYSB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Jm5ic3A7IGlzIGFuZCA8YQotCSAqIGhyZWY9IiNtb2R1bGUtc3RydWN0dXJhbC1tb2RlbCI+aG93IGl0IHJlbGF0ZXMgdG8gdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbCA8L2E+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbHNvIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZiA8YSBocmVmPSIjYWNjZXNzb3Ita2V5Ij50aGUgcHVycG9zZSBvZiBhbiBhY2Nlc3NvciBrZXkgPC9hPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQWNjZXNzb3JLZXkKLQkgKiAgICAgICAgICAgIFR5cGljYWxseSBjbGllbnQgc3VwcGxpZXMgdGhlIG9iamVjdCB0aGF0IGludm9rZWQgdGhpcyBtZXRob2QsIG9yIGEgcHJveHkgKAotCSAqICAgICAgICAgICAgPGNvZGU+bmV3IE9iamVjdCgpPC9jb2RlPikgaW4gdGhlIGNhc2Ugb2Ygb3RoZXIgc3RhdGljIG1ldGhvZHMgcmVxdWVzdGluZyBhCi0JICogICAgICAgICAgICB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9LgotCSAqIEByZXR1cm4gQSB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Zm9yIHRoZSBwcm9qZWN0IG9mIHRoZSBjdXJyZW50IG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlU3RydWN0dXJhbE1vZGVsIGdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbEZvcldyaXRlKE9iamVjdCBhbkFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiAoTW9kdWxlU3RydWN0dXJhbE1vZGVsKSBnZXRFZGl0TW9kZWxGb3JXcml0ZShNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGYWN0b3J5Lk1PRFVMRV9TVFJVQ1RVUkFMX01PREVMX0lELCBhbkFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfSZuYnNwOyB0byB3b3JrIHdpdGggdGhlIHVuZGVybHlpbmcgY29udGVudCBvZiBhbgotCSAqIGluZGl2aWR1YWwge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH0mbmJzcDsgY29udGFpbmVkIGluIHRoZSBwcm9qZWN0LiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH1zCi0JICogYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgY29udGVudCBtb2RlbHMgZm9yIGluZGl2aWR1YWwge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH1zLiBJbgotCSAqIGdlbmVyYWwsIGEgY29udGVudCBtb2RlbCB3aWxsIGNvbnRhaW4gYW4gRU1GIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2R1bGUncyByZWxldmFudAotCSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHBvc3NpYmx5IG90aGVyIEVNRiByZXNvdXJjZXMgYXMgd2VsbC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICoge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9cyB0aGF0IGFyZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIG1heSBub3QgYmUgdXNlZCB0byBtb2RpZnkgYW5kCi0JICogcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIE1vZHVsZSBDb250ZW50IE1ldGFtb2RlbC4gQ2xpZW50cyB0aGF0IG5lZWQgdG8gbWFrZSBjaGFuZ2VzCi0JICogdG8gdGhlIHVuZGVybHlpbmcgTW9kdWxlIENvbnRlbnQgTW9kdWxlLCBhbmQgdGhhdCBjaG9vc2UgdG8gd29yayBkaXJlY3RseSB3aXRoIHRoZQotCSAqIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfSZuYnNwOyBzaG91bGQgdXNlIHtAc2VlICNnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKFVSSSwgT2JqZWN0KX0uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHtAc2VlIEFydGlmYWN0RWRpdH0mbmJzcDtvciBvbmUgb2YgaXRzIHJlbGV2YW50IHN1YmNsYXNzZXMgdG8KLQkgKiB3b3JrIHdpdGggdGhlIG1vZHVsZSBjb250ZW50IG1vZGVsLCBpbnN0ZWFkIG9mIHdvcmtpbmcgd2l0aCBkaXJlY3RseSB3aXRoIHRoZSBFZGl0TW9kZWw6Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPkFydGlmYWN0RWRpdCBlZGl0RmFjYWRlID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQoYVdvcmtiZW5jaE1vZHVsZSk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBXaGVuIGEgY2xpZW50IGlzIGF3YXJlIG9mIHRoZSB1bmRlcmx5aW5nIHR5cGUgb2YgbW9kdWxlLCBtb3JlIHNwZWNpZmljIEVkaXQgRmFjYWRlcyBtYXkgYmUKLQkgKiBhY3F1aXJlZDoKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+V2ViRWRpdCBlZGl0RmFjYWRlID0gV2ViRWRpdC5nZXRXZWJFZGl0Rm9yUmVhZChhV29ya2JlbmNoTW9kdWxlKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIGEgcGFydGljdWxhciBFZGl0IEZhY2FkZSBpcyBub3QgYXBwbGljYWJsZSB0byB0aGUgc3VwcGxpZWQge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH0sIHRoZW4KLQkgKiA8Yj5udWxsIDwvYj4gd2lsbCBiZSByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogU2VlIHRoZSBkaXNjdXNzaW9uIHdoYXQgYSB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDsgaXMgYW5kIDxhCi0JICogaHJlZj0iI2FydGlmYWN0LWVkaXRtb2RlbCI+aG93IGl0IHJlbGF0ZXMgdG8gdGhlIE1vZHVsZSBDb250ZW50IE1ldGFtb2RlbCA8L2E+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbHNvIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZiA8YSBocmVmPSIjYWNjZXNzb3Ita2V5Ij50aGUgcHVycG9zZSBvZiBhbiBhY2Nlc3NvciBrZXkgPC9hPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIFVSSSBvZiB0aGUgZm9ybSAibW9kdWxlOi9yZXNvdXJjZS8gPHByb2plY3QtbmFtZT4vCi0JICogICAgICAgICAgICA8bW9kdWxlLWRlcGxveWVkLW5hbWU+IgotCSAqIEBwYXJhbSBhbkFjY2Vzc29yS2V5Ci0JICogICAgICAgICAgICBUeXBpY2FsbHkgY2xpZW50IHN1cHBsaWVzIHRoZSBvYmplY3QgdGhhdCBpbnZva2VkIHRoaXMgbWV0aG9kLCBvciBhIHByb3h5ICgKLQkgKiAgICAgICAgICAgIDxjb2RlPm5ldyBPYmplY3QoKTwvY29kZT4pIGluIHRoZSBjYXNlIG9mIG90aGVyIHN0YXRpYyBtZXRob2RzIHJlcXVlc3RpbmcgYQotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfS4KLQkgKiBAcmV0dXJuCi0JICogQHNlZSBBcnRpZmFjdEVkaXQKLQkgKiBAc2VlIEFydGlmYWN0RWRpdCNnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQpCi0JICovCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZChVUkkgYU1vZHVsZVVSSSwgT2JqZWN0IGFuQWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZChhTW9kdWxlVVJJLCBhbkFjY2Vzc29yS2V5LCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFNb2R1bGVVUkkgLSB1c2VkIHRvIGxvb2t1cCBwcm9qZWN0Ci0JICogQHBhcmFtIGFuQWNjZXNzb3JLZXkgLSB1c2VkIHRvIHNldCBjbGllbnQgYWNjZXNzb3IKLQkgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSB1c2VkIHRvIGRldGVybWluZSBlZGl0bW9kZWwgZmFjdG9yeQotCSAqIEBwYXJhbSBwYXJhbXMgLSBwYXNzZWQgZm9yIHNwZWNpYWxpemVkIHByb2Nlc3NpbmcgaW4gZmFjdG9yeQotCSAqIEByZXR1cm4gQXJ0aWZhY3RFZGl0TW9kZWwgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwgZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKFVSSSBhTW9kdWxlVVJJLCBPYmplY3QgYW5BY2Nlc3NvcktleSwgU3RyaW5nIHByb2plY3RUeXBlLCBNYXAgcGFyYW1zKSB7Ci0JCQotCQlpZiAocGFyYW1zID09IG51bGwpCi0JCQlwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KEFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5QQVJBTV9NT0RVTEVfVVJJLCBhTW9kdWxlVVJJKTsKLQkJaWYgKHByb2plY3RUeXBlICE9bnVsbCkKLQkJCXJldHVybiAoQXJ0aWZhY3RFZGl0TW9kZWwpIGdldEVkaXRNb2RlbEZvclJlYWQocHJvamVjdFR5cGUsIGFuQWNjZXNzb3JLZXksIHBhcmFtcyk7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBhUHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QoYU1vZHVsZVVSSSk7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoYVByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBlZGl0TW9kZWxJRHMgPSBFZGl0TW9kZWxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJlZ2lzdGVyZWRFZGl0TW9kZWxJRHMoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8ZWRpdE1vZGVsSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGVkaXRNb2RlbElEc1tpXSk7Ci0JCQkJCQlpZiAoZmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKSB7Ci0JCQkJCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKSBnZXRFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElEc1tpXSwgYW5BY2Nlc3NvcktleSwgcGFyYW1zKTsKLQkJCQkJCQlpZiAoZWRpdE1vZGVsICE9bnVsbCkKLQkJCQkJCQkJcmV0dXJuIGVkaXRNb2RlbDsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIElnbm9yZSBleGNlcHRpb25zIHRoYXQgY29tZSBmcm9tIFByb2plY3RGYWNldHNNYW5hZ2VyCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoU3RhdHVzLkVSUk9SLCBNb2R1bGVDb3JlTWVzc2FnZXMuQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfUmVhZF9FeGNlcHRpb24sIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKFN0YXR1cy5FUlJPUiwgTW9kdWxlQ29yZU1lc3NhZ2VzLkFjcXVpcmluZ19BcnRpZmFjdEVkaXRfRm9yX1JlYWRfRXhjZXB0aW9uLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZChVUkkgYU1vZHVsZVVSSSwgT2JqZWN0IGFuQWNjZXNzb3JLZXksIFN0cmluZyBwcm9qZWN0VHlwZSkgewotCQlNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZChhTW9kdWxlVVJJLCBhbkFjY2Vzc29yS2V5LCBwcm9qZWN0VHlwZSwgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfSZuYnNwOyB0byB3b3JrIHdpdGggdGhlIHVuZGVybHlpbmcgY29udGVudCBvZiBhbgotCSAqIGluZGl2aWR1YWwge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH0mbmJzcDsgY29udGFpbmVkIGluIHRoZSBwcm9qZWN0LiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH1zCi0JICogYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgY29udGVudCBtb2RlbHMgZm9yIGluZGl2aWR1YWwge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH1zLiBJbgotCSAqIGdlbmVyYWwsIGEgY29udGVudCBtb2RlbCB3aWxsIGNvbnRhaW4gYW4gRU1GIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2R1bGUncyByZWxldmFudAotCSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHBvc3NpYmx5IG90aGVyIEVNRiByZXNvdXJjZXMgYXMgd2VsbC4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICoge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9cyB0aGF0IGFyZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQKLQkgKiBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgTW9kdWxlIENvbnRlbnQgTWV0YW1vZGVsLiBGb3IgY2xpZW50cyB0aGF0IGRvIG5vdCBleHBlY3QgdG8KLQkgKiBtYWtlIG1vZGlmaWNhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHtAc2VlICNnZXRBcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQoVVJJLCBPYmplY3QpfQotCSAqICZuYnNwOyBpbnN0ZWFkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB7QHNlZSBBcnRpZmFjdEVkaXR9Jm5ic3A7b3Igb25lIG9mIGl0cyByZWxldmFudCBzdWJjbGFzc2VzIHRvCi0JICogd29yayB3aXRoIHRoZSBtb2R1bGUgY29udGVudCBtb2RlbCwgaW5zdGVhZCBvZiB3b3JraW5nIHdpdGggZGlyZWN0bHkgd2l0aCB0aGUgRWRpdE1vZGVsOgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnRpZmFjdEVkaXQgZWRpdEZhY2FkZSA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShhV29ya2JlbmNoTW9kdWxlKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIFdoZW4gYSBjbGllbnQgaXMgYXdhcmUgb2YgdGhlIHVuZGVybHlpbmcgdHlwZSBvZiBtb2R1bGUsIG1vcmUgc3BlY2lmaWMgRWRpdCBGYWNhZGVzIG1heSBiZQotCSAqIGFjcXVpcmVkOgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT5XZWJFZGl0IGVkaXRGYWNhZGUgPSBXZWJFZGl0LmdldFdlYkVkaXRGb3JXcml0ZShhV29ya2JlbmNoTW9kdWxlKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIGEgcGFydGljdWxhciBFZGl0IEZhY2FkZSBpcyBub3QgYXBwbGljYWJsZSB0byB0aGUgc3VwcGxpZWQge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH0sIHRoZW4KLQkgKiA8Yj5udWxsIDwvYj4gd2lsbCBiZSByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogU2VlIHRoZSBkaXNjdXNzaW9uIHdoYXQgYSB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDsgaXMgYW5kIDxhCi0JICogaHJlZj0iI2FydGlmYWN0LWVkaXRtb2RlbCI+aG93IGl0IHJlbGF0ZXMgdG8gdGhlIE1vZHVsZSBDb250ZW50IE1ldGFtb2RlbCA8L2E+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbHNvIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZiA8YSBocmVmPSIjYWNjZXNzb3Ita2V5Ij50aGUgcHVycG9zZSBvZiBhbiBhY2Nlc3NvciBrZXkgPC9hPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIFVSSSBvZiB0aGUgZm9ybSAibW9kdWxlOi9yZXNvdXJjZS8gPHByb2plY3QtbmFtZT4vCi0JICogICAgICAgICAgICA8bW9kdWxlLWRlcGxveWVkLW5hbWU+IgotCSAqIEBwYXJhbSBhbkFjY2Vzc29yS2V5Ci0JICogICAgICAgICAgICBUeXBpY2FsbHkgY2xpZW50IHN1cHBsaWVzIHRoZSBvYmplY3QgdGhhdCBpbnZva2VkIHRoaXMgbWV0aG9kLCBvciBhIHByb3h5ICgKLQkgKiAgICAgICAgICAgIDxjb2RlPm5ldyBPYmplY3QoKTwvY29kZT4pIGluIHRoZSBjYXNlIG9mIG90aGVyIHN0YXRpYyBtZXRob2RzIHJlcXVlc3RpbmcgYQotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfS4KLQkgKiBAcmV0dXJuCi0JICogQHNlZSBBcnRpZmFjdEVkaXQKLQkgKiBAc2VlIEFydGlmYWN0RWRpdCNnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQpCi0JICovCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGUoVVJJIGFNb2R1bGVVUkksIE9iamVjdCBhbkFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKGFNb2R1bGVVUkksIGFuQWNjZXNzb3JLZXksIG51bGwpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSSAtIHVzZWQgdG8gbG9va3VwIHByb2plY3QKLQkgKiBAcGFyYW0gYW5BY2Nlc3NvcktleSAtIHVzZWQgdG8gc2V0IGNsaWVudCBhY2Nlc3NvcgotCSAqIEBwYXJhbSBwcm9qZWN0VHlwZSAtIHVzZWQgdG8gZGV0ZXJtaW5lIGVkaXRtb2RlbCBmYWN0b3J5Ci0JICogQHBhcmFtIHBhcmFtcyAtIHBhc3NlZCBmb3Igc3BlY2lhbGl6ZWQgcHJvY2Vzc2luZyBpbiBmYWN0b3J5Ci0JICogQHJldHVybiBBcnRpZmFjdEVkaXRNb2RlbCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKFVSSSBhTW9kdWxlVVJJLCBPYmplY3QgYW5BY2Nlc3NvcktleSwgU3RyaW5nIHByb2plY3RUeXBlLCBNYXAgcGFyYW1zKSB7Ci0JCQotCQlpZiAocGFyYW1zID09IG51bGwpCi0JCQlwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KEFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5QQVJBTV9NT0RVTEVfVVJJLCBhTW9kdWxlVVJJKTsKLQkJaWYgKHByb2plY3RUeXBlICE9IG51bGwpCi0JCQlyZXR1cm4gIChBcnRpZmFjdEVkaXRNb2RlbCkgZ2V0RWRpdE1vZGVsRm9yV3JpdGUocHJvamVjdFR5cGUsIGFuQWNjZXNzb3JLZXksIHBhcmFtcyk7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBhUHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QoYU1vZHVsZVVSSSk7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoYVByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBlZGl0TW9kZWxJRHMgPSBFZGl0TW9kZWxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJlZ2lzdGVyZWRFZGl0TW9kZWxJRHMoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8ZWRpdE1vZGVsSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGVkaXRNb2RlbElEc1tpXSk7Ci0JCQkJCQlpZiAoZmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKSB7Ci0JCQkJCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKSBnZXRFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRHNbaV0sIGFuQWNjZXNzb3JLZXksIHBhcmFtcyk7Ci0JCQkJCQkJaWYgKGVkaXRNb2RlbCAhPW51bGwpCi0JCQkJCQkJCXJldHVybiBlZGl0TW9kZWw7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBJZ25vcmUgZXhjZXB0aW9ucyB0aGF0IGNvbWUgZnJvbSBQcm9qZWN0RmFjZXRzTWFuYWdlcgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKFN0YXR1cy5FUlJPUiwgTW9kdWxlQ29yZU1lc3NhZ2VzLkFjcXVpcmluZ19BcnRpZmFjdEVkaXRfRm9yX1dyaXRlX0V4Y2VwdGlvbiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoU3RhdHVzLkVSUk9SLCBNb2R1bGVDb3JlTWVzc2FnZXMuQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfV3JpdGVfRXhjZXB0aW9uLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGUoVVJJIGFNb2R1bGVVUkksIE9iamVjdCBhbkFjY2Vzc29yS2V5LCBTdHJpbmcgcHJvamVjdFR5cGUpIHsKLQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKGFNb2R1bGVVUkksIGFuQWNjZXNzb3JLZXksIHByb2plY3RUeXBlLCBwYXJhbXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmF0dXJlSUQoKSB7Ci0JCXJldHVybiBNT0RVTEVfTkFUVVJFX0lEOwotCX0KLQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5JRU1GQ29udGV4dENvbnRyaWJ1dG9yI3ByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2UpCi0JICovCi0JcHVibGljIHZvaWQgcHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSkgewotCQlpZiAoZW1mQ29udGV4dCA9PSBhTmF0dXJlKQotCQkJcmV0dXJuOwotCQllbWZDb250ZXh0ID0gYU5hdHVyZTsKLQkJZ2V0RW1mQ29udGV4dCgpLnNldERlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5KHRydWUpOwotCQkvLyBPdmVycmlkaW5nIHN1cGVyY2xhc3MgdG8gdXNlIG91ciBvd24gVVJJIGNvbnZlcnRlciwgd2hpY2gga25vd3MgYWJvdXQgYmluYXJ5IHByb2plY3RzCi0JCVByb2plY3RSZXNvdXJjZVNldCBwcm9qZWN0UmVzb3VyY2VTZXQgPSBhTmF0dXJlLmdldFJlc291cmNlU2V0KCk7Ci0JCXByb2plY3RSZXNvdXJjZVNldC5zZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRSk7Ci0JCXByb2plY3RSZXNvdXJjZVNldC5zZXRVUklDb252ZXJ0ZXIoY3JlYXRlVVJJQ29udmVydGVyKGdldFByb2plY3QoKSwgcHJvamVjdFJlc291cmNlU2V0KSk7Ci0JCQotCQkvLyBpbml0aWFsaXplQ2FjaGVFZGl0TW9kZWwoKTsKLQkJLy8gYWRkQWRhcHRlckZhY3RvcmllcyhzZXQpOwotCQkvLyBzZXQuZ2V0U3luY2hyb25pemVyKCkuYWRkRXh0ZW5kZXIodGhpcyk7IC8vIGFkZGVkIHNvIHdlIGNhbiBiZSBpbmZvcm1lZCBvZiBjbG9zZXMgdG8gdGhlCi0JCS8vIG5ldyBKMkVFUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIoc2V0KTsgLy8gVGhpcyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIFVSSUNvbnZlcnRlciBpcwotCQljYWNoZU1vZHVsZVN0cnVjdHVyYWxNb2RlbCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZS5wcmltQ29uZmlndXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIucHJpbUNvbmZpZ3VyZSgpOwotCQkvLyBhZGQgVmFsaWRhdGlvbiBCdWlsZGVyIHRvIGFsbCBmbGV4IFByb2plY3QncyBidWlsZGVyIGxpc3QKLQkJUHJvamVjdFV0aWxpdGllcy5hZGRUb0J1aWxkU3BlYyhWQUxJREFUSU9OX0JVSUxERVJfSUQscHJvamVjdCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBVUklDb252ZXJ0ZXIgY3JlYXRlVVJJQ29udmVydGVyKElQcm9qZWN0IGFQcm9qZWN0LCBQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0ICkgewotCQlDb21wb25lbnRDb3JlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IG5ldyBDb21wb25lbnRDb3JlVVJJQ29udmVydGVyKGFQcm9qZWN0LCBhUmVzb3VyY2VTZXQuZ2V0U3luY2hyb25pemVyKCkpOyAKLQkJdXJpQ29udmVydGVyLmFkZElucHV0Q29udGFpbmVyKGdldFByb2plY3QoKSk7Ci0JCXJldHVybiB1cmlDb252ZXJ0ZXI7Ci0JfQotCQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIGdldEVtZkNvbnRleHRCYXNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLklFTUZDb250ZXh0Q29udHJpYnV0b3Ijc2Vjb25kYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSkgewotCQkvL0RlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmUjY29uZmlndXJlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNvbmZpZ3VyZSgpOwotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoKSB7Ci0JCWlmIChjYWNoZWRNb2RlbCA9PSBudWxsKQotCQkJY2FjaGVkTW9kZWwgPSBnZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JSZWFkKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBNT0RVTEVfUExVR19JTl9JRDsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGdldEV4aXN0aW5nRWRpdE1vZGVsKFN0cmluZyBhcnRpZmFjdEVkaXRNb2RlbElkLE1hcCBwYXJhbXMsIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQlyZXR1cm4gZ2V0RW1mQ29udGV4dCgpLmdldEV4aXN0aW5nRWRpdE1vZGVsKGFydGlmYWN0RWRpdE1vZGVsSWQscGFyYW1zLGlzUmVhZE9ubHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQlzdXBlci5zaHV0ZG93bigpOwotCQlpZiAoY2FjaGVkTW9kZWwgIT0gbnVsbCkgewotCQkJY2FjaGVkTW9kZWwuZGlzcG9zZSgpOwotCQkJY2FjaGVkTW9kZWwgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5JU3luY2hyb25pemVyRXh0ZW5kZXIjcHJvamVjdENoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JICovCi0JcHVibGljIHZvaWQgcHJvamVjdENoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5PUEVOKQotCQkJaWYgKGNhY2hlZE1vZGVsID09IG51bGwpCi0JCQkJY2FjaGVkTW9kZWwgPSBnZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JSZWFkKHRoaXMpOwotCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyI3Byb2plY3RDbG9zZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2plY3RDbG9zZWQoKSB7Ci0JCXRoaXMuZW1mQ29udGV4dCA9IG51bGw7Ci0JCWlmIChjYWNoZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQljYWNoZWRNb2RlbC5kaXNwb3NlKCk7Ci0JCQljYWNoZWRNb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL1VucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTdjMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL1VucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLS8qKgotICogPHA+Ci0gKiBUaHJvd24gd2hlbmV2ZXIgYSBVUkkgY2Fubm90IGJlIGFwcHJvcHJpYXRlbHkgcmVzb2x2ZWQuCi0gKiA8L3A+Ci0gKiAgCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihVUkkgYW5VbnJlc29sdmVhYmxlVVJJKSB7Ci0JCXN1cGVyKCJDb3VsZCBub3QgcmVzb2x2ZTogIiArIGFuVW5yZXNvbHZlYWJsZVVSSSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldERhdGFNb2RlbENvbmZpZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXREYXRhTW9kZWxDb25maWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMWM3ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldERhdGFNb2RlbENvbmZpZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQWN0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0RGF0YU1vZGVsQ29uZmlnQWRhcHRlcgotCi0gICAgZXh0ZW5kcyBBY3Rpb25Db25maWcKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIElEYXRhTW9kZWwgZG07Ci0gICAgCi0gICAgcHVibGljIEZhY2V0RGF0YU1vZGVsQ29uZmlnQWRhcHRlciggZmluYWwgSURhdGFNb2RlbCBkbSApCi0gICAgewotICAgICAgICB0aGlzLmRtID0gZG07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RGYWNldFZlcnNpb24oIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIGRtLnNldFByb3BlcnR5KCBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04sIGZ2ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjICkKLSAgICB7Ci0gICAgICAgIGRtLnNldFByb3BlcnR5KCBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFksIGZwandjICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBuYW1lQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRtLnNldFN0cmluZ1Byb3BlcnR5KCBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgZnBqd2MuZ2V0UHJvamVjdE5hbWUoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgZnBqd2MuYWRkTGlzdGVuZXIoIG5hbWVDaGFuZ2VMaXN0ZW5lciwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX05BTUVfQ0hBTkdFRCApOwotICAgICAgICBuYW1lQ2hhbmdlTGlzdGVuZXIuaGFuZGxlRXZlbnQoIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZG0udmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IEFjdGlvbkNvbmZpZy5jbGFzcyB9OwotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBhZGFwdGVyVHlwZSA9PSBBY3Rpb25Db25maWcuY2xhc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmFjZXREYXRhTW9kZWxDb25maWdBZGFwdGVyKCAoSURhdGFNb2RlbCkgYWRhcHRhYmxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL0ZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWEzYjJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkZhY2V0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLkRhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlOwotCi1wdWJsaWMgY2xhc3MgRmFjZXREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9PUEVSQVRJT04gPSAiRmFjZXREYXRhTW9kZWxQcm92aWRlci5OT1RJRklDQVRJT05fT1BFUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX1BST0pFQ1RfTkFNRSk7Ci0JCW5hbWVzLmFkZChGQUNFVF9JRCk7Ci0JCW5hbWVzLmFkZChGQUNFVF9WRVJTSU9OX1NUUik7Ci0JCW5hbWVzLmFkZChGQUNFVF9UWVBFKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX1ZFUlNJT04pOwotCQluYW1lcy5hZGQoRkFDRVRfQUNUSU9OKTsKLQkJbmFtZXMuYWRkKFNIT1VMRF9FWEVDVVRFKTsKLQkJbmFtZXMuYWRkKE5PVElGSUNBVElPTl9PUEVSQVRJT04pOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRkFDRVRfVkVSU0lPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChnZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9JRCkpLmdldFZlcnNpb24oZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfVkVSU0lPTl9TVFIpKTsKLQkJfSBlbHNlIGlmIChGQUNFVF9BQ1RJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbigoVHlwZSkgbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfVFlQRSksIChJUHJvamVjdEZhY2V0VmVyc2lvbikgbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfVkVSU0lPTiksIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChTSE9VTERfRVhFQ1VURS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChOT1RJRklDQVRJT05fT1BFUkFUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZ2V0RmFjZXROb3RpZmljYXRpb25PcGVyYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKEZBQ0VUX0FDVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEZhY2V0RGF0YU1vZGVsT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRGYWNldE5vdGlmaWNhdGlvbk9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwobmV3IEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uKHRoaXMubW9kZWwpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCQkJcmV0dXJuICJGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5vdGlmaWNhdGlvbi4iICsgbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfVFlQRSkgKyAiLiIgKyBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9JRCk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIAotCQkJfQotCi0JCQlwdWJsaWMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCXJldHVybiBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDIyMzQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBGYWNldERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFjdGlvbkNvbmZpZ0ZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFTVEVSX1BST0pFQ1RfRE0gPSAiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuTUFTVEVSX1BST0pFQ1RfRE0iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChNQVNURVJfUFJPSkVDVF9ETSk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JcHVibGljIEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX1RZUEUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBGQUNFVF9UWVBFX0lOU1RBTEw7Ci0JCX0gZWxzZSBpZiAoRkFDRVRfVkVSU0lPTl9TVFIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGdldFByb3BlcnR5KEZBQ0VUX1ZFUlNJT04pOwotCQkJcmV0dXJuIHZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpOwotCQl9IGVsc2UgaWYgKEZBQ0VUX1ZFUlNJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24gPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfSUQpKS5nZXREZWZhdWx0VmVyc2lvbigpOwotCQkJcmV0dXJuIHZlcnNpb247Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChGQUNFVF9UWVBFLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKEZBQ0VUX1ZFUlNJT05fU1RSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhGQUNFVF9WRVJTSU9OKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpLmVxdWFscyhwcm9wZXJ0eVZhbHVlKSkgewotCQkJCQlzZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OLCBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobnVsbCAhPSBwcm9wZXJ0eVZhbHVlICYmIEZBQ0VUX1ZFUlNJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIHByb3BlcnR5VmFsdWU7Ci0JCQlzZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OX1NUUiwgdmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBjYWNoZWRWZXJzaW9uRGVzY3JpcHRvcnM7Ci0JcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGNhY2hlZFZlcnNpb25TdHJpbmdEZXNjcmlwdG9yczsKLQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRkFDRVRfVkVSU0lPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJaWYgKG51bGwgPT0gY2FjaGVkVmVyc2lvbkRlc2NyaXB0b3JzKSB7Ci0JCQkJU2V0IHZlcnNpb25zID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX0lEKSkuZ2V0VmVyc2lvbnMoKTsKLQkJCQlMaXN0IGxpc3QgPSBDb2xsZWN0aW9ucy5saXN0KENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHZlcnNpb25zKSk7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgQ29tcGFyYXRvcigpewotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJCXJldHVybiAoKElQcm9qZWN0RmFjZXRWZXJzaW9uKW8xKS5nZXRWZXJzaW9uU3RyaW5nKCkuY29tcGFyZVRvKCgoSVByb2plY3RGYWNldFZlcnNpb24pbzIpLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQljYWNoZWRWZXJzaW9uRGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZFZlcnNpb25EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWNhY2hlZFZlcnNpb25EZXNjcmlwdG9yc1tpXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IodmVyc2lvbiwgdmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjYWNoZWRWZXJzaW9uRGVzY3JpcHRvcnM7Ci0JCX0KLQkJaWYgKEZBQ0VUX1ZFUlNJT05fU1RSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlpZiAobnVsbCA9PSBjYWNoZWRWZXJzaW9uU3RyaW5nRGVzY3JpcHRvcnMpIHsKLQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSB2ZXJzaW9uRGVzY3JpcHRvcnMgPSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRkFDRVRfVkVSU0lPTik7Ci0JCQkJY2FjaGVkVmVyc2lvblN0cmluZ0Rlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclt2ZXJzaW9uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZFZlcnNpb25TdHJpbmdEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQljYWNoZWRWZXJzaW9uU3RyaW5nRGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZlcnNpb25EZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjYWNoZWRWZXJzaW9uU3RyaW5nRGVzY3JpcHRvcnM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY3JlYXRlKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL0ZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGNiNWQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLlJ1bnRpbWVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqIFR5cGUgamF2YS51dGlsLkNvbGxlY3Rpb24uIFRoaXMgaXMgYSBzbWFsbGVzdCBDb2xsZWN0aW9uIG9mCi0JICogSVByb2plY3RGYWNldHMgdGhhdCBhcmUgYWJzb2x1dGVseSByZXF1aXJlZCBieSB0aGlzIHByb2plY3QgdHlwZS4gVGhpcwotCSAqIENvbGxlY3Rpb24gd2lsbCBiZSB1c2VkIHRvIGZpbHRlciBydW50aW1lcy4gVGhpcyBwcm9wZXJ0eSBpcyBub3QgbWVhbnQgdG8KLQkgKiBiZSBleHBvc2VkIHRvIGNsaWVudHMuIFN1YmNsYXNzZXMgc2hvdWxkIGluaXRpYWxpemUgdGhpcyBDb2xsZWN0aW9uIGluCi0JICogdGhlaXIgaW5pdCgpIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTiA9ICJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLlJFUVVJUkVEX0ZBQ0VUU19DT0xMRUNUSU9OIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRV9WRVJTSU9OX0NPTVBMSUFOQ0UgPSAiRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5GT1JDRV9WRVJTSU9OX0NPTVBMSUFOQ0UiOwotCQotCXB1YmxpYyBGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IG5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQluYW1lcy5hZGQoRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSk7Ci0JCW5hbWVzLmFkZChGQUNFVF9QUk9KRUNUX05BTUUpOwotCQluYW1lcy5hZGQoRkFDRVRfRE1fTUFQKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX0FDVElPTl9NQVApOwotCQluYW1lcy5hZGQoRkFDRVRfUlVOVElNRSk7Ci0JCW5hbWVzLmFkZChSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTik7Ci0JCW5hbWVzLmFkZChGT1JDRV9WRVJTSU9OX0NPTVBMSUFOQ0UpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkKLQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgPSBGYWNldGVkUHJvamVjdEZyYW1ld29yay5jcmVhdGVOZXdQcm9qZWN0KCk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFksIGZwandjKTsKLQkJCi0JCWZwandjLmFkZExpc3RlbmVyCi0JCSgKLQkJICAgIG5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpCi0JCSAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciggSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbiBhY3Rpb24gOiBmcGp3Yy5nZXRQcm9qZWN0RmFjZXRBY3Rpb25zKCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnID0gYWN0aW9uLmdldENvbmZpZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY29uZmlnICE9IG51bGwgJiYgY29uZmlnIGluc3RhbmNlb2YgSURhdGFNb2RlbCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSURhdGFNb2RlbCBkbSA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGRtLmdldEFsbFByb3BlcnRpZXMoKS5jb250YWlucyggRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuTUFTVEVSX1BST0pFQ1RfRE0gKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbS5zZXRQcm9wZXJ0eSggRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuTUFTVEVSX1BST0pFQ1RfRE0sIG1vZGVsICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCQkgICAgfSwKLQkJICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9GQUNFVFNfQ0hBTkdFRAotCQkpOwotCi0gICAgICAgIGZwandjLmFkZExpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX1JVTlRJTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuQVZBSUxBQkxFX1JVTlRJTUVTX0NIQU5HRUQKLSAgICAgICAgKTsKLQkJCi0JCUlEYXRhTW9kZWwgcHJvamVjdERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldygpKTsKLQkJcHJvamVjdERhdGFNb2RlbC5hZGRMaXN0ZW5lcihuZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSAKLQkJCXsKLQkJCSAgICBmaW5hbCBTdHJpbmcgcHJvcCA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJICAgIAotICAgICAgICAgICAgICAgIGlmKCBldmVudC5nZXRGbGFnKCkgPT0gSURhdGFNb2RlbC5WQUxVRV9DSEcgJiYKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5lcXVhbHMoIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTkFNRSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCQkJCQlmcGp3Yy5zZXRQcm9qZWN0TmFtZSggcHJvamVjdE5hbWUgKTsKLQkJCQl9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcHJvcC5lcXVhbHMoIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTE9DQVRJT04gKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSAoU3RyaW5nKSBldmVudC5nZXRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgICAgICBmcGp3Yy5zZXRQcm9qZWN0TG9jYXRpb24oIGxvY2F0aW9uID09IG51bGwgPyBudWxsIDogbmV3IFBhdGgoIGxvY2F0aW9uICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCX0pOwotCQltb2RlbC5hZGROZXN0ZWRNb2RlbChORVNURURfUFJPSkVDVF9ETSwgcHJvamVjdERhdGFNb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEZhY2V0QWN0aW9uTWFwSW1wbCBleHRlbmRzIEhhc2hNYXAgaW1wbGVtZW50cyBGYWNldEFjdGlvbk1hcCB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIGJvb2xlYW4gc3VwcmVzc05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCi0JCXB1YmxpYyB2b2lkIGFkZChBY3Rpb24gYWN0aW9uKSB7Ci0JCQlwdXQoYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKS5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLCBhY3Rpb24pOwotCQl9Ci0KLQkJcHVibGljIEFjdGlvbiBnZXRBY3Rpb24oU3RyaW5nIGZhY2V0SUQpIHsKLQkJCXJldHVybiAoQWN0aW9uKSBnZXQoZmFjZXRJRCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCXRyeSB7Ci0JCQkJc3VwcmVzc05vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCQkJc3VwZXIuY2xlYXIoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc3VwcmVzc05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX0FDVElPTl9NQVAsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnJlbW92ZShrZXkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoIXN1cHJlc3NOb3RpZmljYXRpb24pIHsKLQkJCQkJZ2V0RGF0YU1vZGVsKCkubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfQUNUSU9OX01BUCwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoIXN1cHJlc3NOb3RpZmljYXRpb24pIHsKLQkJCQkJZ2V0RGF0YU1vZGVsKCkubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfQUNUSU9OX01BUCwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbSkgewotCQkJdHJ5IHsKLQkJCQlzdXByZXNzTm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJCQlzdXBlci5wdXRBbGwobSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN1cHJlc3NOb3RpZmljYXRpb24gPSBmYWxzZTsKLQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9BQ1RJT05fTUFQLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRmFjZXREYXRhTW9kZWxNYXBJbXBsIGV4dGVuZHMgSGFzaE1hcCBpbXBsZW1lbnRzIEZhY2V0RGF0YU1vZGVsTWFwLCBJRGF0YU1vZGVsTGlzdGVuZXIgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBib29sZWFuIHN1cHJlc3NOb3RpZmljYXRpb24gPSBmYWxzZTsKLQotCQlwdWJsaWMgdm9pZCBhZGQoSURhdGFNb2RlbCBmYWNldERhdGFNb2RlbCkgewotCQkJcHV0KGZhY2V0RGF0YU1vZGVsLmdldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfSUQpLCBmYWNldERhdGFNb2RlbCk7Ci0JCX0KLQotCQlwdWJsaWMgSURhdGFNb2RlbCBnZXRGYWNldERhdGFNb2RlbChTdHJpbmcgZmFjZXRJRCkgewotCQkJcmV0dXJuIChJRGF0YU1vZGVsKSBnZXQoZmFjZXRJRCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCXRyeSB7Ci0JCQkJc3VwcmVzc05vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJKChJRGF0YU1vZGVsKSBpdGVyYXRvci5uZXh0KCkpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQkJCQlzdXBlci5jbGVhcigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdXByZXNzTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JCQkJZ2V0RGF0YU1vZGVsKCkubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfRE1fTUFQLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJCXRyeSB7Ci0JCQkJSURhdGFNb2RlbCBkbSA9IChJRGF0YU1vZGVsKSB2YWx1ZTsKLQkJCQlPYmplY3QgbGFzdFZhbHVlID0gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotCQkJCWlmIChsYXN0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkoKElEYXRhTW9kZWwpIGxhc3RWYWx1ZSkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJCSgoSURhdGFNb2RlbCkgbGFzdFZhbHVlKS5zZXRQcm9wZXJ0eShGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5NQVNURVJfUFJPSkVDVF9ETSwgbnVsbCk7Ci0JCQkJfQotCQkJCWRtLnNldFByb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSwgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKSk7Ci0JCQkJZG0uc2V0UHJvcGVydHkoRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuTUFTVEVSX1BST0pFQ1RfRE0sIEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIudGhpcy5tb2RlbCk7Ci0JCQkJZG0uYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJcmV0dXJuIGxhc3RWYWx1ZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKCFzdXByZXNzTm90aWZpY2F0aW9uKSB7Ci0JCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX0RNX01BUCwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbSkgewotCQkJdHJ5IHsKLQkJCQlzdXByZXNzTm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJCQlzdXBlci5wdXRBbGwobSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN1cHJlc3NOb3RpZmljYXRpb24gPSBmYWxzZTsKLQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9ETV9NQVAsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLQkJCXRyeSB7Ci0JCQkJSURhdGFNb2RlbCBkbSA9IChJRGF0YU1vZGVsKSBzdXBlci5yZW1vdmUoa2V5KTsKLQkJCQlkbS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQlyZXR1cm4gZG07Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICghc3VwcmVzc05vdGlmaWNhdGlvbikgewotCQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9ETV9NQVAsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoRkFDRVRfUFJPSkVDVF9OQU1FKSkgewotCQkJCWlmIChjb250YWluc1ZhbHVlKGV2ZW50LmdldERhdGFNb2RlbCgpKSkgewotCQkJCQlnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWV2ZW50LmdldERhdGFNb2RlbCgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKEZBQ0VUX1JVTlRJTUUpKSB7Ci0JCQkJaWYgKGNvbnRhaW5zVmFsdWUoZXZlbnQuZ2V0RGF0YU1vZGVsKCkpKSB7Ci0JCQkJCWlmIChldmVudC5nZXRGbGFnKCkgPT0gSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKSB7Ci0JCQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9SVU5USU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQkJCQl9IGVsc2UgaWYoZXZlbnQuZ2V0RmxhZygpID09IElEYXRhTW9kZWwuRU5BQkxFX0NIRykgewotCQkJCQkJZ2V0RGF0YU1vZGVsKCkubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfUlVOVElNRSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEZBQ0VUX1JVTlRJTUUsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXZlbnQuZ2V0RGF0YU1vZGVsKCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlpZiAoRkFDRVRfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChNYXApIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KEZBQ0VUX0RNX01BUCkpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkoKElEYXRhTW9kZWwpIGl0ZXJhdG9yLm5leHQoKSkuc2V0UHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCX0KLQkJCUlEYXRhTW9kZWwgcHJvak1vZGVsID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX1BST0pFQ1RfRE0pOwotCQkJcHJvak1vZGVsLnNldFByb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTkFNRSwgcHJvcGVydHlWYWx1ZSk7Ci0JCX0gZWxzZSBpZiAoRkFDRVRfUlVOVElNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgcHJvcGVydHlWYWx1ZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKE1hcCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoRkFDRVRfRE1fTUFQKSkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUlEYXRhTW9kZWwgZG0gPSAoSURhdGFNb2RlbCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChkbS5pc1Byb3BlcnR5KEZBQ0VUX1JVTlRJTUUpKSB7Ci0JCQkJCWRtLnNldFByb3BlcnR5KEZBQ0VUX1JVTlRJTUUsIHJ1bnRpbWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChydW50aW1lICE9IG51bGwpIHsKLQkJCQlpZihnZXRCb29sZWFuUHJvcGVydHkoRk9SQ0VfVkVSU0lPTl9DT01QTElBTkNFKSl7Ci0JCQkJCU1hcCBmYWNldERNcyA9IChNYXApIGdldFByb3BlcnR5KEZBQ0VUX0RNX01BUCk7Ci0JCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWNldERNcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlJRGF0YU1vZGVsIGZhY2V0RGF0YU1vZGVsID0gKElEYXRhTW9kZWwpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCUlQcm9qZWN0RmFjZXQgZmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoKFN0cmluZykgZmFjZXREYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCkpOwotCQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJRGF0YU1vZGVsIGZhY2V0TW9kZWwgPSAoKEZhY2V0RGF0YU1vZGVsTWFwKSBmYWNldERNcykuZ2V0RmFjZXREYXRhTW9kZWwoZmFjZXQuZ2V0SWQoKSk7Ci0JCQkJCQkJSVByb2plY3RGYWNldFZlcnNpb24gb2xkVmVyc2lvbiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbikgZmFjZXRNb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04pOwotCQkJCQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIG5ld1ZlcnNpb24gPSBmYWNldC5nZXRMYXRlc3RTdXBwb3J0ZWRWZXJzaW9uKHJ1bnRpbWUpOwotCQkJCQkJCWlmIChuZXdWZXJzaW9uICE9IG51bGwgJiYgKG9sZFZlcnNpb24gPT0gbnVsbCB8fCBvbGRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKS5jb21wYXJlVG8obmV3VmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpID4gMCB8fCAhcnVudGltZS5zdXBwb3J0cyhvbGRWZXJzaW9uKSkpIHsKLQkJCQkJCQkJZmFjZXRNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04sIG5ld1ZlcnNpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmKCBSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSApCi0JCXsKLQkJICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjIAotCQkgICAgICAgID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KCBGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZICk7Ci0JCSAgICAKLQkgICAgICAgIGZpbmFsIENvbGxlY3Rpb248SVByb2plY3RGYWNldD4gZml4ZWRGYWNldHMgPSAoQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PikgcHJvcGVydHlWYWx1ZTsKLQkgICAgICAgIAotCSAgICAgICAgZnBqd2Muc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0PiggZml4ZWRGYWNldHMgKSApOwotCSAgICAgICAgCi0JICAgICAgICBmaW5hbCBGYWNldERhdGFNb2RlbE1hcCBmYWNldERtTWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eSggRkFDRVRfRE1fTUFQICk7Ci0JICAgICAgICAKLQkgICAgICAgIGZvciggSVByb2plY3RGYWNldCBmYWNldCA6IGZpeGVkRmFjZXRzICkKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QuQWN0aW9uIGFjdGlvbiA9IGZwandjLmdldFByb2plY3RGYWNldEFjdGlvbiggZmFjZXQgKTsKLQkgICAgICAgICAgICBPYmplY3QgY29uZmlnID0gYWN0aW9uLmdldENvbmZpZygpOwotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIGlmKCAhICggY29uZmlnIGluc3RhbmNlb2YgSURhdGFNb2RlbCApICkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIGNvbmZpZyA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlciggY29uZmlnLCBJRGF0YU1vZGVsLmNsYXNzICk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIGZhY2V0RG1NYXAuYWRkKCAoSURhdGFNb2RlbCkgY29uZmlnICk7Ci0JICAgICAgICB9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRkFDRVRfRE1fTUFQLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlPYmplY3Qgb2JqID0gbmV3IEZhY2V0RGF0YU1vZGVsTWFwSW1wbCgpOwotCQkJc2V0UHJvcGVydHkoRkFDRVRfRE1fTUFQLCBvYmopOwotCQkJcmV0dXJuIG9iajsKLQkJfSBlbHNlIGlmIChGQUNFVF9BQ1RJT05fTUFQLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlPYmplY3Qgb2JqID0gbmV3IEZhY2V0QWN0aW9uTWFwSW1wbCgpOwotCQkJc2V0UHJvcGVydHkoRkFDRVRfQUNUSU9OX01BUCwgb2JqKTsKLQkJCXJldHVybiBvYmo7Ci0JCX0gZWxzZSBpZihSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSl7Ci0JCQlDb2xsZWN0aW9uIGMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzZXRQcm9wZXJ0eShSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTiwgYyk7Ci0JCQlyZXR1cm4gYzsKLQkJfSBlbHNlIGlmKEZPUkNFX1ZFUlNJT05fQ09NUExJQU5DRS5lcXVhbHMocHJvcGVydHlOYW1lKSl7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChGQUNFVF9SVU5USU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKG51bGwgIT0gcnVudGltZSkgewotCQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHJ1bnRpbWUsIHJ1bnRpbWUuZ2V0TG9jYWxpemVkTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKG51bGwsIFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5SVU5USU1FX05PTkUsIG51bGwpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChGQUNFVF9SVU5USU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSAKLQkJewotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgCi0gICAgICAgICAgICAgICAgPSAoSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkpIHRoaXMubW9kZWwuZ2V0UHJvcGVydHkoIEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZpeGVkRmFjZXRzID0gZnBqd2MuZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgZm9yKCBJUnVudGltZSBydCA6IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVzKCkgKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyBydW50aW1lIGluIHRoZSBsaXN0IG9ubHkgaWYgaXQgc3VwcG9ydHMgYWxsIG9mIHRoZSByZXF1aXJlZCBmYWNldHMKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldCBmYWNldCA6IGZpeGVkRmFjZXRzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhIHJ0LnN1cHBvcnRzKCBmYWNldCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBzdXBwb3J0cyApIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQocnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpICsgMV07Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWRlc2NyaXB0b3JzW2ldID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihydW50aW1lLCBydW50aW1lLmdldExvY2FsaXplZE5hbWUoKSk7Ci0JCQl9Ci0JCQlpZihkZXNjcmlwdG9ycy5sZW5ndGggPiAyKXsKLQkJCQlBcnJheXMuc29ydChkZXNjcmlwdG9ycywgMCwgZGVzY3JpcHRvcnMubGVuZ3RoIC0gMiwgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkMSA9IChEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IpYXJnMDsKLQkJCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkMiA9IChEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IpYXJnMTsKLQkJCQkJCXJldHVybiBkMS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkuY29tcGFyZVRvKGQyLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCQotCQkJZGVzY3JpcHRvcnNbZGVzY3JpcHRvcnMubGVuZ3RoIC0gMV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKG51bGwsIFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5SVU5USU1FX05PTkUsIG51bGwpKTsKLQkJCXJldHVybiBkZXNjcmlwdG9yczsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgCi0JewotCQlpZiAoRkFDRVRfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSAKLQkJewotCQkJSURhdGFNb2RlbCBwcm9qTW9kZWwgPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfUFJPSkVDVF9ETSk7Ci0JCQlyZXR1cm4gcHJvak1vZGVsLnZhbGlkYXRlUHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9OQU1FKTsKLQkJfQotCQllbHNlIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZICkgKQotCQl7Ci0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyAKLSAgICAgICAgICAgICAgICA9IChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eSggRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZnBqd2MudmFsaWRhdGUoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBGYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbihtb2RlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL1Byb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL1Byb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYzNjYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9Qcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBuYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJbmFtZXMuYWRkKFBST0pFQ1RfTkFNRSk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFByb2plY3RNaWdyYXRvckRhdGFNb2RlbE9wZXJhdGlvbihtb2RlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkY2Y1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkRvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNTsKLQotLyoqCi0gKiA8cD4KLSAqIElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgcHJvdmlkZXMgcHJvcGVydGllcyB0byB0aGUgRGF0YU1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAqIENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgYXMgd2VsbCBhcyBhbGwgZXh0ZW5kaW5nIGludGVyZmFjZXMgZXh0ZW5kaW5nCi0gKiBJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHNwZWNpZmljYWxseSwgYnV0IG5vdCBsaW1pdGVkIHRvIGFsbCBKMkVFIGNvbXBvbmVudCByZWxhdGVkCi0gKiBjcmVhdGlvbi4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLSAqICAgICAgPC9wPgotICogICAgICA8cD4KLSAqICAgICAgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAgICAgIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotLyoqCi0gKiBUaGlzIGhhcyBiZWVuIHNsYXRlZCBmb3IgcmVtb3ZhbCBwb3N0IFdUUCAxLjUuIERvIG5vdCB1c2UgdGhpcyBjbGFzcy9pbnRlcmZhY2UKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqIAotICogQHNlZSBJQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcywgRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1IHsKLQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZy4gVGhlIHVzZXIgZGVmaW5lZCBuYW1lIG9mIHRoZSB0YXJnZXQgcHJvamVjdCBmb3IgdGhlIGNvbXBvbmVudCB0byBiZQotCSAqIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZy4gVGhlIHVzZXIgZGVmaW5lZCBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfTkFNRSA9ICJJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZy4gVGhlIHVzZXIgZGVmaW5lZCBsb2NhdGlvbiBvbiBkaXNrIG9mIHRoZSB0YXJnZXQgcHJvamVjdCBmb3IgdGhlCi0JICogY29tcG9uZW50IHRvIGJlIGNyZWF0ZWQuIERlZmF1bHRlZCB0byBkZWZhdWx0IGVjbGlwc2Ugd29ya3NwYWNlIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT04gPSAiSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5MT0NBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgU3RyaW5nLiBUaGUgdXNlciBkZWZpbmVkIGRlcGxveSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgY3JlYXRlZC4gVGhlCi0JICogRGF0YU1vZGVsUHJvdmlkZXIgd2lsbCBkZWZhdWx0IHRoZSBuYW1lIHRvIHRoZSBDT01QT05FTlRfTkFNRS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfREVQTE9ZX05BTUUgPSAiSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfREVQTE9ZX05BTUUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgU3RyaW5nLiBOZXN0ZWQgb3BlcmF0aW9uIHRvIGNyZWF0ZSBhIG5ldyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RFRF9QUk9KRUNUX0NSRUFUSU9OX0RNID0gIklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX1BST0pFQ1RfQ1JFQVRJT05fRE0iOyAvLyROT04tTkxTLTEkCi0JLy8gVE9ETyBkZWxldGUgdGhpcwotCS8qKgotCSAqIE9wdGlvbmFsLCB0eXBlIEJvb2xlYW4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Qm9vbGVhbi5UUlVFPC9jb2RlPi4gSWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqIHNldCB0byA8Y29kZT5Cb29sZWFuLlRSVUU8L2NvZGU+IHRoZW4gYSBkZWZhdWx0IGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgc3VwcG9ydGluZwotCSAqIGJpbmRpbmdzIGZpbGVzIHdpbGwgYmUgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9ERUZBVUxUX0ZJTEVTID0gIklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX0RFRkFVTFRfRklMRVMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiB1bnNldHRhYmxlIHJlc3VsdCBwcm9wZXJ0eSB1c2VkIHRvIHJldHJlaXZlIHRoZSBjcmVhdGVkIHZpcnR1YWwgY29tcG9uZW50IGFmdGVyIHRoZQotCSAqIG9wZXJhdGlvbiBoYXMgZXhlY3V0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UID0gIklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTFmOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyByZXF1aXJlZCBwcm9wZXJ0eSBpcyB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9IHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fXMgc3BlY2lmaWVkIGJ5IHtAbGluayAjVEFSR0VUX0NPTVBPTkVOVF9MSVNUfS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGlmIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fXMgQSwgQiwgYW5kIEMgZXhpc3QgYW5kIHJlZmVyZW5jZXMgYXJlIHJlcXVpcmVkCi0JICogZnJvbSBBIHRvIEIgYW5kIEEgdG8gQywgdGhlbiB7QGxpbmsgI1NPVVJDRV9DT01QT05FTlR9IHNob3VsZCBiZSBzZXQgdG8gQSwgYW5kCi0JICoge0BsaW5rICNUQVJHRVRfQ09NUE9ORU5UX0xJU1R9IHNob3VsZCBiZSBzZXQgdG8gYSB7QGxpbmsgamF2YS51dGlsLkxpc3R9IGNvbnRhaW5pbmcgQiBhbmQgQy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0NPTVBPTkVOVCA9ICJJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgcmVxdWlyZWQgcHJvcGVydHkgaXMgdGhlIHtAbGluayBqYXZhLnV0aWwuTGlzdH0gY29udGFpbmluZyB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9cyB0aGF0Ci0JICogd2lsbCBiZSByZWZlcmVuY2VkIGZyb20gdGhlIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fSBzcGVjaWZpZWQgYnkge0BsaW5rICNTT1VSQ0VfQ09NUE9ORU5UfS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0NPTVBPTkVOVF9MSVNUID0gIklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UT0RPIHRoaXMgc2hvdWxkIGJlIGEgbWFwCi0JLyoqCi0JICogT3B0aW9uYWwsIGRlcGxveSBwYXRoIGZvciB0aGUgZGVwZW5kZW50IGNvbXBvbmVudCwgZGVmYXVsdCBpcyAiLyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSCA9ICJJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9ERVBMT1lfUEFUSCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgb3B0aW9uYWwgcHJvcGVydHkgaXMgdGhlIHtAbGluayBqYXZhLnV0aWwuTWFwfSBjb250YWluaW5nIGtleXMgb2Yge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9cyBhbmQKLQkgKiB2YWx1ZXMgb2Yge0BsaW5rIFN0cmluZ31zLiBUaGlzIG1hcCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIFN0cmluZyB3aGljaCBzaG91bGQgYmUgdXNlZCBieQotCSAqIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudH0gc3BlY2lmaWVkIGJ5IHRoZSB7QGxpbmsgI1NPVVJDRV9DT01QT05FTlR9IHByb3BlcnR5IHRvIGxvb2t1cAotCSAqIHRoZSBrZXllZCB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudH0uIFRoZSB7QGxpbmsgamF2YS51dGlsLlNldH0gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9cyBpbiB0aGUKLQkgKiBrZXlzIG9mIHRoaXMge0BsaW5rIGphdmEudXRpbC5NYXB9IHNob3VsZCBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSB7QGxpbmsgamF2YS51dGlsLkxpc3R9LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQID0gIklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjNjk0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBGQUNFVF9UWVBFX0lOU1RBTEwgPSBBY3Rpb24uVHlwZS5JTlNUQUxMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEZBQ0VUX1RZUEVfVU5JTlNUQUxMID0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEZBQ0VUX1RZUEVfVkVSU0lPTl9DSEFOR0UgPSBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1BST0pFQ1RfTkFNRSA9ICJJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1RZUEUgPSAiSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfSUQgPSAiSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1ZFUlNJT05fU1RSID0gIklGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBhbiBJUHJvamVjdEZhY2V0VmVyc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1ZFUlNJT04gPSAiSUZhY2V0RGF0YU1vZGVsUHJvcGV0aWVzLkZBQ0VUX1ZFUlNJT04iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogYW4gSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX0FDVElPTiA9ICJJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0FDVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9FWEVDVVRFID0gIklGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuU0hPVUxEX0VYRUNVVEUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSA9ICJJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWUzZmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3NmEwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSURhdGFNb2RlbFByb3BlcnRpZXMgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkgCi0gICAgICAgID0gIklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSI7IC8vJE5PTi1OTFMtMSQiOwotCi0JLyoqCi0JICogQSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9QUk9KRUNUX05BTUUgPSBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRTsKLQotCS8qKgotCSAqIEEgTmVzdGVkIElEYXRhTW9kZWwgb2YgdHlwZSBJUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RFRF9QUk9KRUNUX0RNID0gIklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX1BST0pFQ1RfRE0iOyAvLyROT04tTkxTLTEkIjsKLQotCS8qKgotCSAqIEFuIGluc3RhbmNlb2YgRmFjZXREYXRhTW9kZWxNYXAuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfRE1fTUFQID0gIklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gaW5zdGFuY2Ugb2YgRmFjZXRBY3Rpb25NYXAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9BQ1RJT05fTUFQID0gIklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfQUNUSU9OX01BUCI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIEFuIGluc3RhbmNlb2Ygb2YgSVJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9SVU5USU1FID0gIklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIFRoaXMgbWFwIGlzIHVzZWQgZm9yIHRyYWNraW5nIGluZGl2aWR1YWwgSURhdGFNb2RlbHMgaW1wbGVtZW50aW5nIElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuCi0JICogVGhlIGZhY2V0IGlkcyBhcmUgdGhlIGtleXMgZm9yIHJldGlldmluZyB0aGUgc3BlY2lmaWMgSUZhY2V0YXRhTW9kZWxQcm9wZXJ0aWVzIElEYXRhTW9kZWxzCi0JICovCi0JcHVibGljIGludGVyZmFjZSBGYWNldERhdGFNb2RlbE1hcCBleHRlbmRzIE1hcCB7Ci0JCXB1YmxpYyB2b2lkIGFkZChJRGF0YU1vZGVsIGZhY2V0RGF0YU1vZGVsKTsKLQkJcHVibGljIElEYXRhTW9kZWwgZ2V0RmFjZXREYXRhTW9kZWwoU3RyaW5nIGZhY2V0SUQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWFwIGlzIHVzZWQgZm9yIHRyYWNpbmcgaW5kaXZkdWFsIElGYWNldGVkUHJvamVjdC5BY3Rpb25zIGZvciBmYWNldHMgdGhhdCBlaXRoZXIgZG8gbm90Ci0JICogaGF2ZSBhbnkgY29uZmlnIGRhdGEsIG9yIGZhY2V0cyB3aG9zZSBjb25maWcgZGF0YSBpcyBub3QgYW4gSURhdGFNb2RlbC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIEZhY2V0QWN0aW9uTWFwIGV4dGVuZHMgTWFwIHsKLQkJcHVibGljIHZvaWQgYWRkKElGYWNldGVkUHJvamVjdC5BY3Rpb24gYWN0aW9uKTsKLQkJcHVibGljIElGYWNldGVkUHJvamVjdC5BY3Rpb24gZ2V0QWN0aW9uKFN0cmluZyBmYWNldElEKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTkzZmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJJUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1OTM3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+Q29tcG9uZW50IGNyZWF0aW9uIGFuZCBSZWZlcmVuY2VkIENvbXBvbmVudCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIEFQSSAgZm9yIGNyZWF0aW5nIGNvbXBvbmVudHMgaW4gYSBGbGV4aWJsZSBwcm9qZWN0IGFuZCAKLSAgICAgICAgYWRkaW5nIHJlZmVyZW5jZWQgY29tcG9uZW50cyB0byBleGlzdGluZyBjb21wb25lbnRzLihzZWUgPGEgaHJlZj0iQ29tcG9uZW50Q29yZS5odG1sIj5Db21wb25lbnRDb3JlPC9hPikuIAotICAgICAgICBDbGllbnRzIHNob3VsZCBhbHNvIHJldmlldyB0aGUgPGI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlczwvYj4KLSAgICAgICAgcGFja2FnZS4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9BcnRpZmFjdEVkaXRNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0FydGlmYWN0RWRpdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzg5NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0FydGlmYWN0RWRpdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5QbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogCi0gKiBQcm92aWRlcyByZXNvdXJjZSBsaWZlIGN5Y2xlIG1hbmFnZW1lbnQgYmV0d2VlbiBhbiBFZGl0TW9kZWwgYW5kIGEgV1RQIGZsZXhpYmxlIG1vZHVsZSBwYXR0ZXJuLgotICogPHA+Ci0gKiBBcnRpZmFjdEVkaXRNb2RlbCBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgbWFuYWdpbmcgYSBzZXQgb2YgRU1GIHJlc291cmNlcyB3aXRoaW4gYSB1bml0IG9mIHdvcmsuCi0gKiBNYW5hZ2VtZW50IG9mIHRoZXNlIHJlc291cmNlcyBpbmNsdWRlcyBiYXNpYyBzZXJ2aWNlcyBzdWNoIGFzIGxvYWRzLCBzYXZlcywgYW5kIHN5bmNocm9uaXphdGlvbgotICogZm9yIHRoZSBtYW5hZ2VkIHJlc291cmNlcy4gQXJ0aWZhY3RFZGl0TW9kZWxzIGFyZSByZWZlcmVuY2UgY291bnRlZCBzbyB0aGF0IGEgc2luZ2xlIGluc3RhbmNlIGNhbgotICogYmUgc2hhcmVkIGJ5IG1vcmUgdGhhbiBvbmUgb3BlcmF0aW9uIG9yIGVkaXRvci4KLSAqIDwvcD4KLSAqIDxwPgotICogQXJpdGZhY3RFZGl0TW9kZWwgdXRpbGl6ZXMKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHR9Jm5ic3A7IHRvIG1hbmFnZSB0aGUgbGlmZQotICogY3ljbGUgb2YgYW4gRU1GIHtAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZX0mbmJzcDsgaW4gYSBnaXZlbiBFTUYKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldH0uIFRoZXJlIGlzIG9uZSBBcnRpZmFjdEVkaXRNb2RlbCBwZXIKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Xb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7aW4gZWFjaCBwcm9qZWN0LgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZQotICovCi0KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEVkaXRNb2RlbCBleHRlbmRzIEVkaXRNb2RlbCBpbXBsZW1lbnRzIElBZGFwdGFibGUsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gQXJ0aWZhY3RFZGl0TW9kZWwuY2xhc3M7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBjb21wb25lbnRQcm9qZWN0OyAKLQlwcml2YXRlIGZpbmFsIElQYXRoIG1vZHVsZVBhdGg7Ci0JcHJpdmF0ZSBVUkkgcm9vdFVSSTsKLQlwcml2YXRlIFN0cmluZyByb290Q29udGVudFR5cGU7Ci0JcHJpdmF0ZSBmaW5hbCBJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50OwotCXByaXZhdGUgZmluYWwgVVJJIGNvbXBvbmVudFVSSTsKLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBBcnRpZmFjdEVkaXRNb2RlbCBpbnN0YW5jZSB0aGF0IHVzZXMgaW5mb3JtYXRpb24gZnJvbSB0aGUKLQkgKiA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxGYWN0b3J5IDwvYj4gZXh0ZW5zaW9uIHBvaW50Ci0JICogYXNzb2NpYXRlZCB3aXRoIGFuRWRpdE1vZGVsSWQgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QgbWFuYWdlZCBieSBhQ29udGV4dCBmb3IgYSBzcGVjaWZpYwotCSAqIG1vZHVsZSByZWZlcmVuY2VkIGJ5IGFNb2R1bGVVUkkuIFJlc291cmVzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkIGFzIGRlZmluZWQgUmVzb3VyY2VzIHZpYQotCSAqIHRoZSBhcHByb3ByaWF0ZSBFZGl0TW9kZWwgZXh0ZW5zaW9uIHBvaW50cyB3aWxsIGJlIGFjY2Vzc2VkIGFzIHJlYWQtb25seS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG86Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPkFydGlmYWN0RWRpdE1vZGVsKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0b01ha2VSZWFkT25seSwgdHJ1ZSwgYU1vZHVsZVVSSSk8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkVkaXRNb2RlbElkCi0JICogICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWRpdE1vZGVsIGRlZmluZWQgYnkgdGhlIGFwcHJvcHJpYXRlCi0JICogICAgICAgICAgICA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxGYWN0b3J5IDwvYj4gZXh0ZW5zaW9uCi0JICogICAgICAgICAgICBwb2ludC4KLQkgKiBAcGFyYW0gYUNvbnRleHQKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgRU1GV29ya2JlbmNoQ29udGV4dCB3aGljaCBoZWxwcyBtYW5hZ2UgdGhlIGxpZmVjeWNsZSBvZiBFTUYgcmVzb3VyY2VzIGZvcgotCSAqICAgICAgICAgICAgYSBnaXZlbiBwcm9qZWN0LgotCSAqIEBwYXJhbSB0b01ha2VSZWFkT25seQotCSAqICAgICAgICAgICAgVHJ1ZSBpbmRpY2F0ZXMgdGhhdCBSZXNvdXJjZXMgbG9hZGVkIGJ5IHRoZSBFZGl0TW9kZWwgd2lsbCBub3QgYWxsb3cKLQkgKiAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMuCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgZnVsbHktcXVhbGlmaWVkIFVSSSB0aGF0IGNvbmZvcm1zIHRvIHRoZSAibW9kdWxlOiIgZm9ybWF0LgotCSAqLwotCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBib29sZWFuIHRvTWFrZVJlYWRPbmx5LCBVUkkgYU1vZHVsZVVSSSkgewotCQl0aGlzKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0b01ha2VSZWFkT25seSwgdHJ1ZSwgYU1vZHVsZVVSSSk7Ci0JfQotCQotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbChTdHJpbmcgYW5FZGl0TW9kZWxJZCwgRU1GV29ya2JlbmNoQ29udGV4dCBhQ29udGV4dCwgYm9vbGVhbiB0b01ha2VSZWFkT25seSwgYm9vbGVhbiB0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5LCBVUkkgYU1vZHVsZVVSSSxVUkkgcm9vdFVSSSwKLQkJCVN0cmluZyByb290Q29udGVudFR5cGUpIHsKLQkJdGhpcyhhbkVkaXRNb2RlbElkLCBhQ29udGV4dCwgdG9NYWtlUmVhZE9ubHksIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIGFNb2R1bGVVUkkpOwotCQl0aGlzLnJvb3RVUkkgPSByb290VVJJOwotCQl0aGlzLnJvb3RDb250ZW50VHlwZSA9IHJvb3RDb250ZW50VHlwZTsKLQkJCi0JfQotCQotCQotCS8qKgotCSAqIAotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBBcnRpZmFjdEVkaXRNb2RlbCBpbnN0YW5jZSB0aGF0IHVzZXMgaW5mb3JtYXRpb24gZnJvbSB0aGUKLQkgKiA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxGYWN0b3J5IDwvYj4gZXh0ZW5zaW9uIHBvaW50Ci0JICogYXNzb2NpYXRlZCB3aXRoIGFuRWRpdE1vZGVsSWQgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QgbWFuYWdlZCBieSBhQ29udGV4dCBmb3IgYSBzcGVjaWZpYwotCSAqIG1vZHVsZSByZWZlcmVuY2VkIGJ5IGFNb2R1bGVVUkkuIFJlc291cmVzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkIGFzIGRlZmluZWQKLQkgKiA8L3A+KgotCSAqIAotCSAqIEBwYXJhbSBhbkVkaXRNb2RlbElkCi0JICogICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWRpdE1vZGVsIGRlZmluZWQgYnkgdGhlIGFwcHJvcHJpYXRlCi0JICogICAgICAgICAgICA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxGYWN0b3J5IDwvYj4gZXh0ZW5zaW9uCi0JICogICAgICAgICAgICBwb2ludC4KLQkgKiBAcGFyYW0gYUNvbnRleHQKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgRU1GV29ya2JlbmNoQ29udGV4dCB3aGljaCBoZWxwcyBtYW5hZ2UgdGhlIGxpZmVjeWNsZSBvZiBFTUYgcmVzb3VyY2VzIGZvcgotCSAqICAgICAgICAgICAgYSBnaXZlbiBwcm9qZWN0LgotCSAqIEBwYXJhbSB0b01ha2VSZWFkT25seQotCSAqICAgICAgICAgICAgVHJ1ZSBpbmRpY2F0ZXMgdGhhdCBSZXNvdXJjZXMgbG9hZGVkIGJ5IHRoZSBFZGl0TW9kZWwgd2lsbCBub3QgYWxsb3cKLQkgKiAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMuCi0JICogQHBhcmFtIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHkKLQkgKiAgICAgICAgICAgIFRydWUgaW5kaWNhdGVzIHRoYXQgUmVzb3VyY2VzIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBFZGl0TW9kZWwgYmUgbG9hZGVkIGFzCi0JICogICAgICAgICAgICByZWFkLW9ubHkgLSBzdWNoIHRob3NlIGxvYWRlZCB2aWEge0BzZWUgI2dldFJlc291cmNlKFVSSSl9LgotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIGZ1bGx5LXF1YWxpZmllZCBVUkkgdGhhdCBjb25mb3JtcyB0byB0aGUgIm1vZHVsZToiIGZvcm1hdC4KLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgYUNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksIGJvb2xlYW4gdG9BY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSwgVVJJIGFNb2R1bGVVUkkpIHsKLQkJc3VwZXIoYW5FZGl0TW9kZWxJZCwgYUNvbnRleHQsIHRvTWFrZVJlYWRPbmx5LCB0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KTsKLQkJSVByb2plY3QgYVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJYVByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGFNb2R1bGVVUkkpOwotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0UHJvajsKLQkJCWZhY2V0UHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChmYWNldFByb2ogIT0gbnVsbCkKLQkJCQlmYWNldFByb2ouYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9ZmluYWxseSB7Ci0JCQljb21wb25lbnRQcm9qZWN0ID0gYVByb2plY3Q7Ci0JCX0KLQkJCi0JCXZpcnR1YWxDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRQcm9qZWN0KTsKLQkJY29tcG9uZW50VVJJID0gYU1vZHVsZVVSSTsKLQkJbW9kdWxlUGF0aCA9IG5ldyBQYXRoKGFNb2R1bGVVUkkucGF0aCgpKTsKLQkJcHJvY2Vzc0xvYWRlZFJlc291cmNlcyhjb21wb25lbnRQcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksIFVSSSBtb2R1bGVVUkksIFVSSSByb290VVJJLAotCQkJU3RyaW5nIHJvb3RDb250ZW50VHlwZSkgewotCQl0aGlzKGVkaXRNb2RlbElELCBjb250ZXh0LCB0b01ha2VSZWFkT25seSwgdHJ1ZSwgbW9kdWxlVVJJKTsKLQkJdGhpcy5yb290VVJJID0gcm9vdFVSSTsKLQkJdGhpcy5yb290Q29udGVudFR5cGUgPSByb290Q29udGVudFR5cGU7Ci0JCQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFjY2Vzc2VzIHJlc291cmNlcyB3aXRoaW4gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2V0LiBUYWtlcyBhIHN0YW5kYXJkIFVSSSBhdHRhY2hlcyBtb2R1bGUKLQkgKiBwcm90b2NvbCBhbmQgaW5mb3JtYXRpb24uIFRoaXMgZGF0YSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc291cmNlIGlzIHBhcnQgb2YgYQotCSAqIGZsZXhpYmxlIG1vZHVsZSBzdHJ1Y3R1cmUuIElmIHRoZSByZXNvdXJjZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcmVzb3VyY2Ugc2V0IGl0IHdpbGwgdHJ5IGFuZAotCSAqIGxvYWQgdGhlIHJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVVyaSAtCi0JICogICAgICAgICAgICBsb2NhdGlvbiBvZiByZXNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UgKEBzZWUgUmVzb3VyY2UpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSBhVXJpKSB7Ci0JCUlQYXRoIHJlcXVlc3RQYXRoOwotCQkvL0lmIHJlcXVlc3Rpbmcgcm9vdFVSSSwgdXNlIGNvbnRlbnQgdHlwZSBkZXNjcmliZXIgaWYgYXZhaWxhYmxlCi0JCWlmIChyb290VVJJICE9IG51bGwgJiYgcm9vdFVSSS5lcXVhbHMoYVVyaSkgJiYgcm9vdENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCXJlcXVlc3RQYXRoID0gbW9kdWxlUGF0aC5hcHBlbmQobmV3IFBhdGgocm9vdENvbnRlbnRUeXBlKSk7Ci0JCQlyZXF1ZXN0UGF0aCA9IHJlcXVlc3RQYXRoLmFwcGVuZChuZXcgUGF0aChhVXJpLnBhdGgoKSkpOwotCQl9Ci0JCWVsc2Ugey8vIEZpcnN0IGNoZWNrIGlmIHBhc3NlZCBVUkkgaXMgYWxyZWFkeSBub3JtYWxpemVkLi4uCi0JCQlyZXF1ZXN0UGF0aCA9IG1vZHVsZVBhdGguYXBwZW5kKG5ldyBQYXRoKGFVcmkucGF0aCgpKSk7Ci0JCX0KLQkJVVJJIHJlc291cmNlVVJJID0gVVJJLmNyZWF0ZVVSSShQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uTU9EVUxFX1BST1RPQ09MICsgcmVxdWVzdFBhdGgudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSk7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldENvbXBvbmVudFByb2plY3QoKSB7IAotCQlyZXR1cm4gY29tcG9uZW50UHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldE1vZHVsZVVSSSgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFVSSTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBY2Nlc3NlcyByZXNvdXJlY2VzIHdpdGhpbiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzZXQuIFRha2VzIGEgc3Rhcm5kYXJkIFVSSSBhdHRhY2hlcyBtb2R1bGUKLQkgKiBpbmZvcm1hdGlvbi4gVGhpcyBkYXRhIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgcmVzb3VyY2UgaXMgcGFydCBvZiBhIGZsZXhpYmxlIG1vZHVsZQotCSAqIHN0cnVjdHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFVcmkgLQotCSAqICAgICAgICAgICAgbG9jYXRpb24gb2YgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlIChAc2VlIFJlc291cmNlKQotCSAqLwotCi0JcHVibGljIFJlc291cmNlIGdldE9yQ3JlYXRlUmVzb3VyY2UoVVJJIGFVcmkpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0T3JDcmVhdGVSZXNvdXJjZShhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBPdmVycmlkZGVuIHRvIHByZXZlbnQgc3VwZXIoKSBpbXBsZW1lbnRhdGlvbiwgcHJvY2Vzc0xvYWRlZFJlc291cmNlcyhhTW9kdWxlVVJJKSB1c2VkCi0JICogaW5zdGVhZC4gKEBsaW5rIHByb2Nlc3NMb2FkZWRSZXNvdXJjZXMoVVJJIGFNb2R1bGVVUkkpCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhVXJpIC0KLQkgKiAgICAgICAgICAgIGxvY2F0aW9uIG9mIHJlc291cmNlCi0JICovCi0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0xvYWRlZFJlc291cmNlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBHYXRoZXJzIHJlc291cmNlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHNldCwgZGV0ZXJtaW5lcyBpZiBpbnRlcmVzdGVkIChAbGluawotCSAqIHByb2Nlc3NMb2FkZWRSZXNvdXJjZXMoVVJJIGFNb2R1bGVVUkkpKWFuZCByZXF1ZXN0IGFjY2VzcyAoQGxpbmsgYWNjZXNzKFJlZmVyZW5jZWRSZXNvdXJjZQotCSAqIGFSZXNvdXJjZSkpdG8gZWFjaCByZXNvdXJjZSBpbmNyZW1lbnRpbmcgdGhlIHdyaXRlL3JlYWQgY291bnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhVXJpIC0KLQkgKiAgICAgICAgICAgIGxvY2F0aW9uIG9mIHJlc291cmNlCi0JICovCi0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NMb2FkZWRSZXNvdXJjZXMoSVByb2plY3QgYUNvbXBvbmVudFByb2plY3QpIHsKLQkJTGlzdCBsb2FkZWRSZXNvdXJjZXMgPSBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpOwotCQlpZiAoIWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCXByb2Nlc3NSZXNvdXJjZXNJZkludGVycmVzdGVkKGxvYWRlZFJlc291cmNlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDaGVja3MgdG8gbWFrZSBzdXJlIGEgZmxleGlibGUgbW9kdWxlIHN0cnVjdHVyZSBleGlzdCBmb3IgdGhlIHJlc291cmNlcyBpbiB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqIFRoaXMgaXMgYWNoaWV2ZWQgYnkgcXVlcnlpbmcgTW9kdWxlQ29yZShAc2VlIE1vZHVsZUNvcmUpIGZvciBleGlzdGluZwotCSAqIFdvcmtiZW5jaE1vZHVsZVJlc291cmNlcyAoQHNlZSBXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZXMpLiBJZiB0aGUgcmVzb3VyY2UgZXhpc3QgaXQgcHJvY2Vzc2VzCi0JICogdGhlIHJlc291cmNlIChAbGluayBwcm9jZXNzUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSkuIFByb2Nlc3NpbmcgdGhlIHJlc291cmNlIGluY3JlbWVudHMKLQkgKiB0aGUgcmVhZC93cml0ZSBjb3VudC4KLQkgKiA8L3A+KgotCSAqIAotCSAqIEBwYXJhbSB0aGVSZXNvdXJjZXMgLQotCSAqICAgICAgICAgICAgbGlzdCBvZiByZXNvdXJjZXMgdG8gdmVyaWZ5IGZsZXhpYmxlIG1vZHVsZSBzdGF0dXMsIGFuZCBwcm9jZXNzCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgY291bGQgbm90IFdvcmtiZW5jaFJlc291cmNlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgVVJJLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NSZXNvdXJjZXNJZkludGVycmVzdGVkKExpc3QgdGhlUmVzb3VyY2VzKSB7Ci0JCWludCBzaXplID0gdGhlUmVzb3VyY2VzLnNpemUoKTsKLQkJUmVzb3VyY2UgcmVzb3VyY2VUb1Byb2Nlc3M7Ci0JCWJvb2xlYW4gcHJvY2Vzc2VkID0gZmFsc2U7IAotIAotCQlJUmVzb3VyY2UgcmVzb3VyY2VSZXNvdXJjZTsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZXM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7IAotCQkJcmVzb3VyY2VUb1Byb2Nlc3MgPSAoUmVzb3VyY2UpIHRoZVJlc291cmNlcy5nZXQoaSk7Ci0JCQlpZiAocmVzb3VyY2VUb1Byb2Nlc3MgPT0gbnVsbCkgY29udGludWU7Ci0JCQlTdHJpbmcgbGFzdFNlZ21lbnQgPSByZXNvdXJjZVRvUHJvY2Vzcy5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOwotCQkJaWYgKG51bGwgIT0gbGFzdFNlZ21lbnQgJiYgbGFzdFNlZ21lbnQuZW5kc1dpdGgoSU1vZHVsZUNvbnN0YW50cy5DT01QT05FTlRfRklMRV9OQU1FKSkgY29udGludWU7Ci0JCQlyZXNvdXJjZVJlc291cmNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZVRvUHJvY2Vzcyk7Ci0JCQlpZiAocmVzb3VyY2VSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHJlc291cmNlUmVzb3VyY2UpOyAKLQkJCQlmb3IgKGludCByZXNvdXJjZXNJbmRleCA9IDA7IHJlc291cmNlc0luZGV4IDwgdmlydHVhbFJlc291cmNlcy5sZW5ndGg7IHJlc291cmNlc0luZGV4KyspIHsKLQkJCQkJaWYgKHZpcnR1YWxDb21wb25lbnQuZXF1YWxzKHZpcnR1YWxSZXNvdXJjZXNbcmVzb3VyY2VzSW5kZXhdLmdldENvbXBvbmVudCgpKSkgewotCQkJCQkJaWYgKHJlc291cmNlVG9Qcm9jZXNzICE9bnVsbCAmJiBpc0ludGVycmVzdGVkSW5SZXNvdXJjZShyZXNvdXJjZVRvUHJvY2VzcykpIHsKLQkJCQkJCQlwcm9jZXNzUmVzb3VyY2UocmVzb3VyY2VUb1Byb2Nlc3MpOwotCQkJCQkJCXByb2Nlc3NlZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gIAotCQlyZXR1cm4gcHJvY2Vzc2VkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIDxwPgotCSAqIEdlbmVyaWMgd2F5IHRvIHJldHJpZXZlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24sIHdpdGhpbiB0aGUgcGxhdGZvcm0uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXJUeXBlIGZvciB0aGlzIGFkYXB0ZXIgY2xhc3MgZnJvbSBhZGFwdGVyIGZhY3Rvcnkgc3RvcmVkIGluIHRoZQotCSAqICAgICAgICAgYWRhcHRlciBtYW5hZ2VyIChAc2VlIEFkYXB0ZXJNYW5hZ2VyKQotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXJUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0VmlydHVhbENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHZpcnR1YWxDb21wb25lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdENoYW5nZWQoKSB7Ci0JCXRyeSB7Ci0JCQlFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5ub3RpZnlGdW5jdGlvbkdyb3VwQ2hhbmdlZChudWxsLGdldENvbXBvbmVudFByb2plY3QoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCQkvL1JlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgZmFjZXRlZCBwcm9qZWN0Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGdldENvbXBvbmVudFByb2plY3QoKSk7Ci0JCQlpZiAoZmFjZXRQcm9qICE9IG51bGwpCi0JCQkJZmFjZXRQcm9qLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXN1cGVyLmRvRGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9CaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9CaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3MWI0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvQmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5Q29tcG9uZW50SGVscGVyIHsKLQotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50OwotCi0JcHJvdGVjdGVkIEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBnZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCi0JcHVibGljIGFic3RyYWN0IFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpOwotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKXsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZThhZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PjwvY29weXJpZ2h0PgotICogCi0gKiAkSWQ6IENvbXBvbmVudFJlc291cmNlLmphdmEsdiAxLjYgMjAwNi8wNC8yNyAwNDoxNzo0MCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gUHJvdmlkZXMgYW4gYWJzdHJhY3QgbWFwcGluZyBvZiB3b3JrYmVuY2ggcmVzb3VyY2VzIHRvIGRlcGxveWFibGUKLSAqIHJlc291cmNlcy4KLSAqIDxwPgotICogVGhlIHVuZGVybHlpbmcgZWNsaXBzZSByZXNvdXJjZSBjb3VsZCBiZSBhIGNvbnRhaW5lciBvciBhIGZpbGUuIEhvd2V2ZXIsIGlmIHRoZQotICoge0BzZWUgI2dldFNvdXJjZVBhdGgoKX0mbmJzcDsgaXMgYSBjb250YWluZXIsIHRoZW4gdGhlIHtAc2VlICNnZXREZXBsb3llZFBhdGgoKX0mbmJzcDsgd2lsbCBiZQotICogYSBjb250YWluZXIgYXMgd2VsbC4KLSAqIDwvcD5DbGllbnRzIHRoYXQgcmVxdWlyZSBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgRWNsaXBzZSBSZXNvdXJjZSBmb3IgYSBnaXZlbgotICogQ29tcG9uZW50UmVzb3VyY2Ugc2hvdWxkIHVzZSAKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlI2dldEVjbGlwc2VSZXNvdXJjZShDb21wb25lbnRSZXNvdXJjZSl9Jm5ic3A7Ci0gKiA8cD4KLSAqIFNlZSB0aGUgcGFja2FnZSBvdmVydmlldyBmb3IgYW4gPGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm92ZXJ2aWV3IG9mIHRoZSBtb2RlbCBjb21wb25lbnRzIDwvYT4uCi0gKiA8L3A+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0U291cmNlUGF0aCA8ZW0+U291cmNlIFBhdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSdW50aW1lUGF0aCA8ZW0+UnVudGltZSBQYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0RXhjbHVzaW9ucyA8ZW0+RXhjbHVzaW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldENvbXBvbmVudCA8ZW0+Q29tcG9uZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0UmVzb3VyY2VUeXBlIDxlbT5SZXNvdXJjZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50UmVzb3VyY2UgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb3VyY2UgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb3VyY2UgUGF0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQKLQkgKiBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2UgUGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U291cmNlUGF0aChJUGF0aCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRSZXNvdXJjZV9Tb3VyY2VQYXRoKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5JUGF0aCIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUlQYXRoIGdldFNvdXJjZVBhdGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRTb3VyY2VQYXRoIDxlbT5Tb3VyY2UgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlIFBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNvdXJjZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNvdXJjZVBhdGgoSVBhdGggdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UnVudGltZSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SdW50aW1lIFBhdGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UnVudGltZSBQYXRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSdW50aW1lUGF0aChJUGF0aCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRSZXNvdXJjZV9SdW50aW1lUGF0aCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSVBhdGgiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJUGF0aCBnZXRSdW50aW1lUGF0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldFJ1bnRpbWVQYXRoIDxlbT5SdW50aW1lIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UnVudGltZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJ1bnRpbWVQYXRoKElQYXRoIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1c2lvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1c2lvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseQotCSAqIHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdXNpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFJlc291cmNlX0V4Y2x1c2lvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4Y2x1c2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBvbmVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldFJlc291cmNlcyA8ZW0+UmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbXBvbmVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29tcG9uZW50KFdvcmtiZW5jaENvbXBvbmVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRSZXNvdXJjZV9Db21wb25lbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRSZXNvdXJjZXMKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InJlc291cmNlcyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtiZW5jaENvbXBvbmVudCBnZXRDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRDb21wb25lbnQgPGVtPkNvbXBvbmVudDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvbmVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tcG9uZW50KFdvcmtiZW5jaENvbXBvbmVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXNvdXJjZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFJlc291cmNlX1Jlc291cmNlVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSZXNvdXJjZVR5cGUgPGVtPlJlc291cmNlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc291cmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQlJUHJvamVjdCBnZXRPd25pbmdQcm9qZWN0KCk7Ci0Jdm9pZCBzZXRPd25pbmdQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KTsKLQotfSAvLyBDb21wb25lbnRSZXNvdXJjZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTA3MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICogSW5kaWNhdGVzIGhvdyB0aGUge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtzaG91bGQgYmUgaGFuZGxlZCBieQotICogdGhlIHRvb2xpbmcuICAKLSAqIDxwPgotICogSW4gcGFydGljdWxhciwgdGhlIHtAc2VlICNnZXRNb2R1bGVUeXBlSWQoKX0mbmJzcDsgaXMgdXNlZCB0byBjb29yZGluYXRlIG90aGVyCi0gKiBleHRlbnNpb25zIHN1Y2ggYXMgRWRpdE1vZGVscyBhbmQgdGhlIG1vZHVsZSBzdHJ1Y3R1cmUgcHJlcGFyYXRpb24gYnVpbGRlci4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBTZWUgdGhlIHBhY2thZ2Ugb3ZlcnZpZXcgZm9yIGFuIDxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj5vdmVydmlldyBvZiB0aGUgbW9kZWwgY29tcG9uZW50cyA8L2E+LgotICogPC9wPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0Q29tcG9uZW50VHlwZUlkIDxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0TWV0YWRhdGFSZXNvdXJjZXMgPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50VHlwZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBUeXBlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGUgSWQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGUgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbXBvbmVudFR5cGVJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0Q29tcG9uZW50VHlwZV9Db21wb25lbnRUeXBlSWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZUlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRDb21wb25lbnRUeXBlSWQgPGVtPkNvbXBvbmVudCBUeXBlIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZUlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21wb25lbnRUeXBlSWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGFkYXRhIFJlc291cmNlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlCi0JICogcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0Q29tcG9uZW50VHlwZV9NZXRhZGF0YVJlc291cmNlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5JUGF0aCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFR5cGVfVmVyc2lvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFR5cGVfUHJvcGVydGllcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UHJvcGVydGllcygpOwotCi19IC8vIENvbXBvbmVudFR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRjb3JlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudGNvcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZGU0ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudGNvcmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbXBvbmVudGNvcmVGYWN0b3J5LmphdmEsdiAxLjIgMjAwNi8wNC8yNyAwNDoxNzo0MCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlRmFjdG9yeUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50Y29yZUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb25lbnRjb3JlRmFjdG9yeSBlSU5TVEFOQ0UgPSBDb21wb25lbnRjb3JlRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrYmVuY2hDb21wb25lbnQgY3JlYXRlV29ya2JlbmNoQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb25lbnRSZXNvdXJjZSBjcmVhdGVDb21wb25lbnRSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb25lbnQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvbmVudFR5cGUgY3JlYXRlQ29tcG9uZW50VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVmZXJlbmNlZENvbXBvbmVudCBjcmVhdGVSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9qZWN0Q29tcG9uZW50cyBjcmVhdGVQcm9qZWN0Q29tcG9uZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb25lbnRjb3JlUGFja2FnZSBnZXRDb21wb25lbnRjb3JlUGFja2FnZSgpOwotCi19IC8vQ29tcG9uZW50Y29yZUZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRjb3JlUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudGNvcmVQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZDRmZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudGNvcmVQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9uZW50Y29yZVBhY2thZ2UuamF2YSx2IDEuOCAyMDA2LzA0LzI3IDA0OjE3OjQwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50Y29yZVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiY29tcG9uZW50Y29yZSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImNvbXBvbmVudGNvcmUueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZSI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvbmVudGNvcmVQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwgPGVtPldvcmtiZW5jaCBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0V29ya2JlbmNoQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcG9uZW50IFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19SRUZFUkVOQ0VEX0NPTVBPTkVOVFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlRfX1BST1BFUlRJRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIFJlc291cmNlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0JFTkNIX0NPTVBPTkVOVF9fTUVUQURBVEFfUkVTT1VSQ0VTID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlRfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFJlc291cmNlSW1wbCA8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUE9ORU5UX1JFU09VUkNFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9fU09VUkNFX1BBVEggPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJ1bnRpbWUgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9fUlVOVElNRV9QQVRIID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdXNpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfUkVTT1VSQ0VfX0VYQ0xVU0lPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9fUkVTT1VSQ0VfVFlQRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50VHlwZUltcGwgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50VHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTVBPTkVOVF9UWVBFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnQgVHlwZSBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9UWVBFX19DT01QT05FTlRfVFlQRV9JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9UWVBFX19WRVJTSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfVFlQRV9fUFJPUEVSVElFUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgUmVzb3VyY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfVFlQRV9fTUVUQURBVEFfUkVTT1VSQ0VTID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db21wb25lbnQgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfVFlQRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlJbXBsIDxlbT5Qcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST1BFUlRZID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVmZXJlbmNlZENvbXBvbmVudEltcGwgPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVmZXJlbmNlZENvbXBvbmVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFRkVSRU5DRURfQ09NUE9ORU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fSEFORExFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SdW50aW1lIFBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fUlVOVElNRV9QQVRIID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5DWV9UWVBFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXBlbmRlbnQgT2JqZWN0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1QgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyY2hpdmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRURfQ09NUE9ORU5UX19BUkNISVZFX05BTUUgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRURfQ09NUE9ORU5UX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9qZWN0Q29tcG9uZW50c0ltcGwgPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb2plY3RDb21wb25lbnRzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFByb2plY3RDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0pFQ1RfQ09NUE9ORU5UUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9DT01QT05FTlRTX19QUk9KRUNUX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfQ09NUE9ORU5UU19fQ09NUE9ORU5UUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfQ09NUE9ORU5UU19fVkVSU0lPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfQ09NUE9ORU5UU19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlIDxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldERlcGVuZGVuY3lUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFUEVOREVOQ1lfVFlQRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPklQYXRoPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0SVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSVBBVEggPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5VUkk8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0VVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFVSSSA9IDg7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQgPGVtPldvcmtiZW5jaCBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29ya2JlbmNoIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtiZW5jaENvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtiZW5jaENvbXBvbmVudF9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRSZXNvdXJjZXMoKQotCSAqIEBzZWUgI2dldFdvcmtiZW5jaENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Jlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldENvbXBvbmVudFR5cGUgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtiZW5jaENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya2JlbmNoQ29tcG9uZW50X0NvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldFJlZmVyZW5jZWRDb21wb25lbnRzIDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKQotCSAqIEBzZWUgI2dldFdvcmtiZW5jaENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya2JlbmNoQ29tcG9uZW50X1JlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtiZW5jaENvbXBvbmVudF9Qcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRNZXRhZGF0YVJlc291cmNlcyA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldE1ldGFkYXRhUmVzb3VyY2VzKCkKLQkgKiBAc2VlICNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtiZW5jaENvbXBvbmVudF9NZXRhZGF0YVJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlIDxlbT5Db21wb25lbnQgUmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb21wb25lbnRSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0U291cmNlUGF0aCA8ZW0+U291cmNlIFBhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb3VyY2UgUGF0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRTb3VyY2VQYXRoKCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50UmVzb3VyY2VfU291cmNlUGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0UnVudGltZVBhdGggPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSdW50aW1lUGF0aCgpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX1J1bnRpbWVQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldEV4Y2x1c2lvbnMgPGVtPkV4Y2x1c2lvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkV4Y2x1c2lvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0RXhjbHVzaW9ucygpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX0V4Y2x1c2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRDb21wb25lbnQgPGVtPkNvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Db21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0Q29tcG9uZW50KCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29tcG9uZW50UmVzb3VyY2VfQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSZXNvdXJjZVR5cGUgPGVtPlJlc291cmNlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldFJlc291cmNlVHlwZSgpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX1Jlc291cmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0Q29tcG9uZW50VHlwZUlkIDxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbXBvbmVudCBUeXBlIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0Q29tcG9uZW50VHlwZUlkKCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRUeXBlX0NvbXBvbmVudFR5cGVJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFR5cGVfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRNZXRhZGF0YVJlc291cmNlcyA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRNZXRhZGF0YVJlc291cmNlcygpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50VHlwZV9NZXRhZGF0YVJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCA8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRIYW5kbGUgPGVtPkhhbmRsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhbmRsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldEhhbmRsZSgpCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9IYW5kbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0UnVudGltZVBhdGggPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldFJ1bnRpbWVQYXRoKCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X1J1bnRpbWVQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldERlcGVuZGVuY3lUeXBlIDxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXREZXBlbmRlbmN5VHlwZSgpCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbmN5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXREZXBlbmRlbnRPYmplY3QgPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EZXBlbmRlbnQgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0RGVwZW5kZW50T2JqZWN0KCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRBcmNoaXZlTmFtZSA8ZW0+QXJjaGl2ZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXJjaGl2ZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0QXJjaGl2ZU5hbWUoKQotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlZmVyZW5jZWRDb21wb25lbnRfQXJjaGl2ZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyA8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvamVjdENvbXBvbmVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldFByb2plY3ROYW1lIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMjZ2V0UHJvamVjdE5hbWUoKQotCSAqIEBzZWUgI2dldFByb2plY3RDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0Q29tcG9uZW50c19Qcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRDb21wb25lbnRzIDxlbT5Db21wb25lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db21wb25lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldENvbXBvbmVudHMoKQotCSAqIEBzZWUgI2dldFByb2plY3RDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0Q29tcG9uZW50c19Db21wb25lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0Q29tcG9uZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdENvbXBvbmVudHNfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGUgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREZXBlbmRlbmN5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCA8ZW0+SVBhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPklQYXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCIKLQkgKiAgICAgICAgYW5ub3RhdGlvbj0ia2V5d29yZHMgZGF0YXR5cGU9J251bGwnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldElQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSA8ZW0+VVJJPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5VUkk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiCi0JICogICAgICAgIGFubm90YXRpb249ImtleXdvcmRzIGRhdGF0eXBlPSdudWxsJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRVUkkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvbmVudGNvcmVGYWN0b3J5IGdldENvbXBvbmVudGNvcmVGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwgPGVtPldvcmtiZW5jaCBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFdvcmtiZW5jaENvbXBvbmVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLQkVOQ0hfQ09NUE9ORU5UID0gZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktCRU5DSF9DT01QT05FTlRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0V29ya2JlbmNoQ29tcG9uZW50X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTID0gZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudF9SZXNvdXJjZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya2JlbmNoQ29tcG9uZW50X0NvbXBvbmVudFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29tcG9uZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVGRVJFTkNFRF9DT01QT05FTlRTID0gZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudF9SZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS0JFTkNIX0NPTVBPTkVOVF9fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRXb3JrYmVuY2hDb21wb25lbnRfUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgUmVzb3VyY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLQkVOQ0hfQ09NUE9ORU5UX19NRVRBREFUQV9SRVNPVVJDRVMgPSBlSU5TVEFOQ0UuZ2V0V29ya2JlbmNoQ29tcG9uZW50X01ldGFkYXRhUmVzb3VyY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRSZXNvdXJjZUltcGwgPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFJlc291cmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRDb21wb25lbnRSZXNvdXJjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT01QT05FTlRfUkVTT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1JFU09VUkNFX19TT1VSQ0VfUEFUSCA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRSZXNvdXJjZV9Tb3VyY2VQYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SdW50aW1lIFBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT01QT05FTlRfUkVTT1VSQ0VfX1JVTlRJTUVfUEFUSCA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRSZXNvdXJjZV9SdW50aW1lUGF0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVzaW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1JFU09VUkNFX19FWENMVVNJT05TID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFJlc291cmNlX0V4Y2x1c2lvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRSZXNvdXJjZV9Db21wb25lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2VfUmVzb3VyY2VUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRUeXBlSW1wbCA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRDb21wb25lbnRUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPTkVOVF9UWVBFID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBUeXBlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFR5cGVfQ29tcG9uZW50VHlwZUlkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1RZUEVfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50VHlwZV9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT05FTlRfVFlQRV9fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIFJlc291cmNlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUyA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRUeXBlX01ldGFkYXRhUmVzb3VyY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eUltcGwgPGVtPlByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST1BFUlRZID0gZUlOU1RBTkNFLmdldFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPUEVSVFlfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsIDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFJlZmVyZW5jZWRDb21wb25lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVGRVJFTkNFRF9DT01QT05FTlQgPSBlSU5TVEFOQ0UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFRF9DT01QT05FTlRfX0hBTkRMRSA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0hhbmRsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UnVudGltZSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFRF9DT01QT05FTlRfX1JVTlRJTUVfUEFUSCA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X1J1bnRpbWVQYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5DWV9UWVBFID0gZUlOU1RBTkNFLmdldFJlZmVyZW5jZWRDb21wb25lbnRfRGVwZW5kZW5jeVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlcGVuZGVudCBPYmplY3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5UX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJjaGl2ZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFRF9DT01QT05FTlRfX0FSQ0hJVkVfTkFNRSA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0FyY2hpdmVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9qZWN0Q29tcG9uZW50c0ltcGwgPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb2plY3RDb21wb25lbnRzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRQcm9qZWN0Q29tcG9uZW50cygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9KRUNUX0NPTVBPTkVOVFMgPSBlSU5TVEFOQ0UuZ2V0UHJvamVjdENvbXBvbmVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0pFQ1RfQ09NUE9ORU5UU19fUFJPSkVDVF9OQU1FID0gZUlOU1RBTkNFLmdldFByb2plY3RDb21wb25lbnRzX1Byb2plY3ROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFMgPSBlSU5TVEFOQ0UuZ2V0UHJvamVjdENvbXBvbmVudHNfQ29tcG9uZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0pFQ1RfQ09NUE9ORU5UU19fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRQcm9qZWN0Q29tcG9uZW50c19WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGUgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldERlcGVuZGVuY3lUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gREVQRU5ERU5DWV9UWVBFID0gZUlOU1RBTkNFLmdldERlcGVuZGVuY3lUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JUGF0aDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRJUGF0aCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBJUEFUSCA9IGVJTlNUQU5DRS5nZXRJUGF0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VVJJPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRVUkkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVVJJID0gZUlOU1RBTkNFLmdldFVSSSgpOwotCi0JfQotCi19IC8vQ29tcG9uZW50Y29yZVBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9EZXBlbmRlbmN5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0RlcGVuZGVuY3lUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTE0YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0RlcGVuZGVuY3lUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiAKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICogSW5kaWNhdGVzIGhvdyBhIHBhcnRpY3VsYXIge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLlJlZmVyZW5jZWRDb21wb25lbnR9Jm5ic3A7c2hvdWxkIGJlCi0gKiBhYnNvcmJlZCBieSBhIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Xb3JrYmVuY2hDb21wb25lbnR9LiAKLSAqIDxwPgotICogUHJvdmlkZXMgdHdvIHR5cGVzICgidXNlcyIsICJjb25zdW1lcyIpIHdoaWNoIGFyZSB1c2VkIGJ5Ci0gKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuUmVmZXJlbmNlZENvbXBvbmVudH1zIHRvIHNwZWNpZnkgaG93IHRoZQotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLlJlZmVyZW5jZWRDb21wb25lbnR9Jm5ic3A7IHNob3VsZCBiZSBhYnNvcmJlZCBieSB0aGUKLSAqIGNvbnRhaW5pbmcge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudH0uCi0gKiA8L3A+Ci0gKiBGb3IgY2xpZW50cyB0aGF0IG5lZWQgdG8gY3JlYXRlIG9uZSBvZiB0aGVzZSBvYmplY3RzIGZyb20gc2NyYXRjaCwKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlRmFjdG9yeX0uCi0gKiA8cD4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRlcGVuZGVuY3kgVHlwZTwvYj48L2VtPicsIGFuZAotICogdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwvcD4KLSAqIDxwPiAKLSAqIFNlZSB0aGUgcGFja2FnZSBvdmVydmlldyBmb3IgYW4gPGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm92ZXJ2aWV3IG9mIHRoZSBtb2RlbCBjb21wb25lbnRzPC9hPi4KLSAqIDwvcD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+IHVzZXM9MCBjb25zdW1lcz0xIDwhLS0KLSAqIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZUNvcmVQYWNrYWdlI2dldERlcGVuZGVuY3lUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVwZW5kZW5jeVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVzZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVzZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkCi0JICogYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVVNFU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9InVzZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db25zdW1lczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29uc3VtZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkKLQkgKiBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OU1VNRVNfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJjb25zdW1lcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Vc2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVU0VTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZXBlbmRlbmN5VHlwZSBVU0VTX0xJVEVSQUwgPSBuZXcgRGVwZW5kZW5jeVR5cGUoVVNFUywgInVzZXMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAc2VlICNDT05TVU1FUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVwZW5kZW5jeVR5cGUgQ09OU1VNRVNfTElURVJBTCA9IG5ldyBEZXBlbmRlbmN5VHlwZShDT05TVU1FUywgImNvbnN1bWVzIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZXBlbmRlbmN5VHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBEZXBlbmRlbmN5VHlwZVtdIHsKLQkJCVVTRVNfTElURVJBTCwKLQkJCUNPTlNVTUVTX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEZXBlbmRlbmN5VHlwZSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURlcGVuZGVuY3lUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiAgPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiAgPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVwZW5kZW5jeVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFVTRVM6IHJldHVybiBVU0VTX0xJVEVSQUw7Ci0JCQljYXNlIENPTlNVTUVTOiByZXR1cm4gQ09OU1VNRVNfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERlcGVuZGVuY3lUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvL0RlcGVuZGVuY3lUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvSUNvbXBvbmVudFByb2plY3RNaWdyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0lDb21wb25lbnRQcm9qZWN0TWlncmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2NmFkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvSUNvbXBvbmVudFByb2plY3RNaWdyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnRQcm9qZWN0TWlncmF0b3IgewotCXB1YmxpYyB2b2lkIG1pZ3JhdGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlQ29yZVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZUNvcmVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxZWZkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlQ29yZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBNb2R1bGVzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci0KLQotcHVibGljIGNsYXNzIE1vZHVsZUNvcmVWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iIHsKLQkJcHJvdGVjdGVkIElSZXBvcnRlciBfcmVwb3J0ZXI7Ci0KLQkJcHVibGljIE1vZHVsZUNvcmVWYWxpZGF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JCX0KLQkJCi0JCXB1YmxpYyBSZXNvdXJjZSBnZXRQcmltYXJ5UmVzb3VyY2UoSVByb2plY3QgcHJvamVjdCkgewotCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODEzMzQ7IENoYW5naW5nIHRoaXMgbWV0aG9kIHRvIGNhbGwgTW9kdWxlU3RydWN0dXJhbE1vZGVsLmdldFByaW1hcnlSZXNvdXJjZSgpIG1ldGhvZCBpbnN0ZWFkLgotCQkJLy8gVGhpcyBkb2VzIHR3byB0aGluZ3M6Ci0JCQkvLyAxLiBSZW9yZGVycyB0aGUgbG9ja3MgdG8gcHJldmVudCBkZWFkbG9jayBiZXR3ZWVuIGxvY2tpbmcgdGhlIHJlc291cmNlIChCdWd6aWxsYSAxODEzMzQpLAotCQkJLy8JICB0aGVuIHRoZSBlZGl0IG1vZGVsIGFuZAotCQkJLy8gMi4gUmV1c2VzIGNvZGUuIChUaGUgY29kZSBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCBNU00uZ2V0UHJpbWFyeVJlc291cmNlKCkgaXMgaWRlbnRpY2FsLgotCQkJU3RydWN0dXJlRWRpdCBzdHJ1Y3R1cmVFZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWlmIChzdHJ1Y3R1cmVFZGl0ICE9IG51bGwpIHsKLQkJCQlNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgc3RydWN0dXJhbE1vZGVsID0gc3RydWN0dXJlRWRpdC5nZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoKTsKLQkJCQlpZiAoc3RydWN0dXJhbE1vZGVsICE9IG51bGwpIHsKLQkJCQkJLy8gYWNxdWlyaW5nIHRoZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgbG9jayBoZXJlIGZpcnN0IGJlY2F1c2UgdGhlIGNhbGwgdG8gZ2V0UHJpbWFyeVJlc291cmNlKCkKLQkJCQkJLy8gd2lsbCBjYXVzZSB0aGlzIGxvY2sgdG8gYmUgYWNxdWlyZWQgbGF0ZXIgcmVzdWx0aW5nIGluIGEgcG90ZW50aWFsIGRlYWRsb2NrCi0JCQkJCXN5bmNocm9uaXplZCAoc3RydWN0dXJhbE1vZGVsKSB7Ci0JCQkJCQlyZXR1cm4gc3RydWN0dXJhbE1vZGVsLmdldFByaW1hcnlSZXNvdXJjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotLyogYnVnMTk3NTMxIC0gc3RhbmRhcmRpemUgY29tcGlsZXIgc2V0dGluZ3MKLQkJcHJpdmF0ZSBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChJUHJvamVjdCBwcm9qKSB7Ci0JCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qKTsKLQkJCXJldHVybiBuYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJfQotKi8KLQotCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikKLQkJCQl0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQlfcmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJCS8vUmVtb3ZlIGFsbCBtYXJrZXJzIHJlbGF0ZWQgdG8gdGhpcyB2YWxpZGF0b3IKLQkJCV9yZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzKTsKLQkJCS8vVXNpbmcgdGhlIGhlbHBlciBjbGFzcywgbG9hZCB0aGUgbW9kdWxlIG1vZGVsCi0JCQlJUHJvamVjdCBwcm9qID0gKElQcm9qZWN0KSBoZWxwZXIKLQkJCQkJLmxvYWRNb2RlbChNb2R1bGVDb3JlVmFsaWRhdG9ySGVscGVyLk1PRFVMRUNPUkUsIG51bGwpOwotCQkJdHJ5IHsKLQkJCQlpZiAocHJvai5pc0FjY2Vzc2libGUoKSAmJiBwcm9qLmhhc05hdHVyZShNb2R1bGVDb3JlTmF0dXJlLk1PRFVMRV9OQVRVUkVfSUQpKSB7Ci0JCQkJCWlmIChuZWVkc01pZ3JhdGluZyhwcm9qKSkKLQkJCQkJCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG5ldyBNZXNzYWdlKCJtb2R1bGVjb3JlIiwKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJIk5FRURTTUlHUkFUSU5HIiwgbnVsbCwgcHJvaikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJCV9yZXBvcnRlciA9IG51bGw7Ci0KLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gbmVlZHNNaWdyYXRpbmcoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJWE1JUmVzb3VyY2UgcmVzID0gKFhNSVJlc291cmNlKWdldFByaW1hcnlSZXNvdXJjZShwcm9qZWN0KTsKLQkJCWJvb2xlYW4gbXVsdGlDb21wcyA9IGZhbHNlOwotCQkJaWYgKHByb2plY3Q9PW51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJYm9vbGVhbiBuZWVkc01pZ3JhdGluZyA9ICghcHJvamVjdC5oYXNOYXR1cmUoRmFjZXRlZFByb2plY3ROYXR1cmUuTkFUVVJFX0lEKSkgfHwgcmVzID09IG51bGwgfHwgKChyZXMgIT0gbnVsbCkgJiYgKChXVFBNb2R1bGVzUmVzb3VyY2UpcmVzKS5nZXRSb290T2JqZWN0KCkgPT0gbnVsbCk7IC8vfHwgKHJlcyE9bnVsbCAmJiAhcmVzLmlzTG9hZGVkKCkgJiYgKChXVFBNb2R1bGVzUmVzb3VyY2UpcmVzKS5nZXRSb290T2JqZWN0KCkgIT0gbnVsbCk7Ci0JCQlpZiAoIW5lZWRzTWlncmF0aW5nKSB7Ci0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIFRyYW5zbGF0b3JSZXNvdXJjZSAmJiAoKFRyYW5zbGF0b3JSZXNvdXJjZSlyZXMpLmdldFJvb3RPYmplY3QoKSBpbnN0YW5jZW9mIFByb2plY3RDb21wb25lbnRzKSB7Ci0JCQkJCVByb2plY3RDb21wb25lbnRzIGNvbXBvbmVudHMgPSAoUHJvamVjdENvbXBvbmVudHMpICgoV1RQTW9kdWxlc1Jlc291cmNlKXJlcykuZ2V0Um9vdE9iamVjdCgpOwotCQkJCQlpZiAoY29tcG9uZW50cy5nZXRDb21wb25lbnRzKCkgIT0gbnVsbCkgewotCQkJCQkJbXVsdGlDb21wcyA9IGNvbXBvbmVudHMuZ2V0Q29tcG9uZW50cygpLnNpemUoKSA+IDE7Ci0JCQkJCQlyZXR1cm4gbXVsdGlDb21wczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZWVkc01pZ3JhdGluZzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikKLQkJCQl0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQkvLyBGb3J3YXJkaW5nIHRvIGpvYiBtZXRob2QKLQkJCXZhbGlkYXRlSW5Kb2IoaGVscGVyLCByZXBvcnRlcik7Ci0JCX0KLQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlQ29yZVZhbGlkYXRvckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZUNvcmVWYWxpZGF0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2OWY2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlQ29yZVZhbGlkYXRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIE1vZHVsZUNvcmVWYWxpZGF0b3JIZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hDb250ZXh0IHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVDT1JFID0gIk1PRFVMRUNPUkUiOwotCQlwdWJsaWMgTW9kdWxlQ29yZVZhbGlkYXRvckhlbHBlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCQkvLwl0aGUgZm9sbG93aW5nIHdpbGwgcmVnaXN0ZXIgdGhlIGhlbHBlcidzIHN5bWJvbGljIG1ldGhvZHMKLQkJICAgIENsYXNzIFtdIGFyZ3MgPSBuZXcgQ2xhc3NbMF0gOwotCQkgICAgcmVnaXN0ZXJNb2RlbChNT0RVTEVDT1JFLCAibG9hZE1vZGVsIiwgYXJncyk7Ci0JCX0KLQkJLyoqCi0JCSAqIExvYWQgdGhlIFRyYWRpbmcgU2Vzc2lvbiBmb3IgdmFsaWRhdGlvbgotCQkgKi8KLQkJcHVibGljIE9iamVjdCBsb2FkTW9kZWwoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0KLQl9CQkKLQkJLyoqCi0JCSAqIEdpdmVuIGEgcmVzb3VyY2UsIHJldHVybiBpdHMgbm9uLWVjbGlwc2Utc3BlY2lmaWMgbG9jYXRpb24uIElmIHRoaXMKLQkJICogcmVzb3VyY2UsIG9yIHR5cGUgb2YgcmVzb3VyY2UsIGlzbid0IGhhbmRsZWQgYnkgdGhpcyBoZWxwZXIsIHJldHVybgotCQkgKiBudWxsLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkKLQkJCXJldHVybiByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCX0KLQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlTWlncmF0b3JNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlTWlncmF0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTkwNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZU1pZ3JhdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlTWlncmF0b3JNYW5hZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIEhhc2hNYXAgbWFuYWdlckNhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIHN0YXRpYyBIYXNoU2V0IG1pZ3JhdGVkID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIGJvb2xlYW4gbWlncmF0aW5nOwotCXB1YmxpYyBNb2R1bGVNaWdyYXRvck1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgTW9kdWxlTWlncmF0b3JNYW5hZ2VyIGdldE1hbmFnZXIoSVByb2plY3QgcHJvaikgewotCQlNb2R1bGVNaWdyYXRvck1hbmFnZXIgbWFuYWdlciA9IChNb2R1bGVNaWdyYXRvck1hbmFnZXIpbWFuYWdlckNhY2hlLmdldChwcm9qKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJbWFuYWdlciA9IG5ldyBNb2R1bGVNaWdyYXRvck1hbmFnZXIoKTsKLQkJCW1hbmFnZXJDYWNoZS5wdXQocHJvaixtYW5hZ2VyKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIG1pZ3JhdGVDb21wb25lbnRzSWZOZWNlc3NhcnkoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBtdWx0aUNvbXBzKSB7Ci0JCQotCQlzZXR1cEFuZE1pZ3JhdGVDb21wb25lbnRQcm9qZWN0KHByb2plY3QpOwotCQkKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldHVwQW5kTWlncmF0ZUNvbXBvbmVudFByb2plY3QoSVByb2plY3QgcHJvaikgewotCQltaWdyYXRlZC5hZGQocHJvaik7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWRtLnNldFN0cmluZ1Byb3BlcnR5KElQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSxwcm9qLmdldE5hbWUoKSk7Ci0JCXRyeSB7Ci0JCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLG51bGwpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWlncmF0ZU9sZE1ldGFEYXRhKElQcm9qZWN0IGFQcm9qZWN0LCBmaW5hbCBib29sZWFuIG11bHRpQ29tcHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbWlncmF0aW5nID0gdHJ1ZTsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cyB3b3Jrc3BhY2VSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzKGFQcm9qZWN0KSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCUlQcm9qZWN0IGFQcm9qID0gKElQcm9qZWN0KXRoaXMuZ2V0SW5mbygpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChhUHJvai5pc0FjY2Vzc2libGUoKSAmJiBNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KGFQcm9qKSkgewotCQkJCQkJaWYgKGFQcm9qLmZpbmRNZW1iZXIoIi53dHBtb2R1bGVzIikgIT0gbnVsbCkgewotCQkJCQkJCW1vdmVPbGRNZXRhRGF0YUZpbGUoYVByb2opOwotCQkJCQkJfQotCQkJCQkJaWYgKG5lZWRzQ29tcG9uZW50TWlncmF0aW9uKGFQcm9qLG11bHRpQ29tcHMpKQotCQkJCQkJCW1pZ3JhdGVDb21wb25lbnRzSWZOZWNlc3NhcnkoYVByb2osbXVsdGlDb21wcyk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQltaWdyYXRpbmcgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByaXZhdGUgYm9vbGVhbiBuZWVkc0NvbXBvbmVudE1pZ3JhdGlvbihJUHJvamVjdCBhUHJvaixib29sZWFuIG11bHRpQ29tcHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkKLQkJCWJvb2xlYW4gbmVlZHMgPSB0cnVlOwotCQkJaWYgKG11bHRpQ29tcHMpCi0JCQkJcmV0dXJuIChuZWVkcyAmJiBtdWx0aUNvbXBzKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKChhUHJvai5maW5kTWVtYmVyKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKSA9PSBudWxsKSAmJiAoYVByb2ouZmluZE1lbWJlcigiLnNldHRpbmdzLy5jb21wb25lbnQiKSA9PSBudWxsKSkgfHwgCi0JCQkJCQkoUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGFQcm9qKSA9PSBudWxsKSAmJiBuZWVkczsKLQkJCX0KLQkJfTsKLQkJCi0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4od29ya3NwYWNlUnVubmFibGUsIG51bGwsSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsbnVsbCk7Ci0JCQotCQkKLQkJCi0JCQotCX0KLQlwcml2YXRlIHZvaWQgbW92ZU1ldGFEYXRhRmlsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlSZXNvdXJjZSBvbGRmaWxlID0gcHJvamVjdC5maW5kTWVtYmVyKCIud3RwbW9kdWxlcyIpOwotCQlpZiAob2xkZmlsZSAhPSBudWxsICYmIG9sZGZpbGUuZXhpc3RzKCkpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQkJSUZvbGRlciBzZXR0aW5nc0ZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKCIuc2V0dGluZ3MiKTsKLQkJCQkJaWYgKCFzZXR0aW5nc0ZvbGRlci5leGlzdHMoKSkKLQkJCQkJCXNldHRpbmdzRm9sZGVyLmNyZWF0ZSh0cnVlLHRydWUsbnVsbCk7Ci0JCQkJCW9sZGZpbGUubW92ZShuZXcgUGF0aChTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSksdHJ1ZSxudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVBsYXRmb3JtLmdldExvZyhNb2R1bGVjb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9kdWxlY29yZVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCQl9Ci0JCX0gCi0JfQotCXByaXZhdGUgdm9pZCBtb3ZlT2xkTWV0YURhdGFGaWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQotCQl0cnkgewotCQkJCW1vdmVNZXRhRGF0YUZpbGUocHJvamVjdCk7Ci0JCQkJSUZvbGRlciBkZXBGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcigiLmRlcGxveWFibGVzIik7Ci0JCQkJaWYgKGRlcEZvbGRlci5leGlzdHMoKSkKLQkJCQkJZGVwRm9sZGVyLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQkJCQlwcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNNaWdyYXRpbmcoKSB7Ci0JCXJldHVybiBtaWdyYXRpbmc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlU3RydWN0dXJhbE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlU3RydWN0dXJhbE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDZlNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZVN0cnVjdHVyYWxNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQTW9kdWxlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUE1vZHVsZXNSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVGYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdE5hdHVyZTsKLS8qKgotICogTWFuYWdlcyB0aGUgdW5kZXJseWluZyBNb2R1bGUgU3RydWN0dXJhbCBNZXRhbW9kZWwuCi0qIDxhIG5hbWU9Im1vZHVsZS1zdHJ1Y3R1cmFsLW1vZGVsIi8+Ci0qIDxwPgotKiBFYWNoIE1vZHVsZUNvcmVOYXR1cmUgZnJvbSBhIGdpdmVuIHByb2plY3QgY2FuIHByb3ZpZGUgYWNjZXNzIHRvIHRoZQotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwOyBvZiB0aGUgcHJvamVjdC4KLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0mbmJzcDsgaXMgYSBzdWJjbGFzcyBvZgotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWx9Jm5ic3A7dGhhdCBtYW5hZ2VzCi0qIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4gQXMgYW4gRWRpdE1vZGVsLCB0aGUKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0mbmJzcDsgcmVmZXJlbmNlcyBFTUYgcmVzb3VyY2VzLAotKiB0aGF0IGNvbnRhaW4gRU1GIG1vZGVscyAtLSBpbiB0aGlzIGNhc2UsIHRoZSBFTUYgbW9kZWwgb2YgPGk+LmNvbXBvbmVudCA8L2k+IGZpbGUuCi0qIDwvcD4KLSogPHA+Ci0qIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBFZGl0IEZhY2FkZSBwYXR0ZXJuICh2aWEKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmV9Jm5ic3A7IG9yIG9uZSBpZiBpdHMgcmVsZXZhbnQgc3ViY2xhc3NlcykKLSogdG8gd29yayBkaXJlY3RseSB3aXRoIHRoZSBNb2R1bGUgU3RydWN0dXJhbCBNZXRhbW9kZWwuCi0qIDwvcD4gCi0qIDxwPgotKiA8YSBocmVmPSJNb2R1bGVDb3JlTmF0dXJlLmh0bWwjbW9kZWwtZGlzY3Vzc2lvbiI+U2VlIHRoZSBkaXNjdXNzaW9uPC9hPiBvZiBob3cgTW9kdWxlU3RydWN0dXJhbE1vZGVsIHJlbGF0ZXMgdG8gdGhlIEFydGlmYWN0RWRpdE1vZGVsIGFuZCBNb2R1bGVDb3JlTmF0dXJlLgotKiA8YSBuYW1lPSJhY2Nlc3Nvci1rZXkiLz4KLSogPHA+Ci0qIEFsbCBFZGl0TW9kZWxzIGhhdmUgYSBsaWZlY3ljbGUgdGhhdCBtdXN0IGJlIGVuZm9yY2VkIHRvIGtlZXAgdGhlIHJlc291cmNlcyBsb2FkZWQgdGhhdCBhcmUgaW4KLSogdXNlLCBhbmQgdG8gdW5sb2FkIHJlc291cmNlcyB0aGF0IGFyZSBub3QgaW4gdXNlLiBUbyBhY2Nlc3MgYW4gRWRpdE1vZGVsLCBjbGllbnRzIGFyZSByZXF1aXJlZCB0bwotKiBzdXBwbHkgYW4gb2JqZWN0IHRva2VuIHJlZmVycmVkIHRvIGFzIGFuIGFjY2Vzc29yIGtleS4gVGhlIGFjY2Vzc29yIGtleSBhbGxvd3MgdGhlIGZyYW1ld29yayB0bwotKiBiZXR0ZXIgdHJhY2sgd2hpY2ggY2xpZW50cyBhcmUgdXNpbmcgdGhlIEVkaXRNb2RlbCwgYW5kIHRvIGVuc3VyZSB0aGF0IG9ubHkgYSBjbGllbnQgd2hpY2ggaGFzCi0qIGFjY2Vzc2VkIHRoZSBFZGl0TW9kZWwgd2l0aCBhbiBhY2Nlc3NvciBrZXkgbWF5IGludm9rZSBzYXZlKigpcyBvbiB0aGF0IEVkaXRNb2RlbC4KLSogPC9wPgotKi8gCi1wdWJsaWMgY2xhc3MgTW9kdWxlU3RydWN0dXJhbE1vZGVsIGV4dGVuZHMgRWRpdE1vZGVsIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFIwXzdfTU9EVUxFX01FVEFfRklMRV9OQU1FID0gIi5jb21wb25lbnQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSMV9NT0RVTEVfTUVUQV9GSUxFX05BTUUgPSAiLnNldHRpbmdzLy5jb21wb25lbnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9DT1JFX0lEID0gIm1vZHVsZUNvcmVJZCI7IC8vJE5PTi1OTFMtMSQgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfVkVSU0lPTl8xXzUgPSAiMS41LjAiOwotCXByaXZhdGUgYm9vbGVhbiB1c2VPbGRGb3JtYXQgPSBmYWxzZTsKLQlwdWJsaWMgTW9kdWxlU3RydWN0dXJhbE1vZGVsKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHJlYWRPbmx5KSB7Ci0gICAgICAgIHN1cGVyKGVkaXRNb2RlbElELCBjb250ZXh0LCByZWFkT25seSk7Ci0gICAgfQotICAgIC8qKgotCSAqIFJlbGVhc2UgZWFjaCBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZShSZWZlcmVuY2VkUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChpc1JlYWRPbmx5KCkgJiYgYVJlc291cmNlLmdldFJlYWRDb3VudCgpICE9IDApCi0JCQlhUmVzb3VyY2UucmVsZWFzZUZyb21SZWFkKCk7Ci0JCWVsc2UKLQkJCWFSZXNvdXJjZS5yZWxlYXNlRnJvbVdyaXRlKCk7Ci0KLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChhUmVzb3VyY2UpIHsKLQkJCQlhUmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQWRhcHRlcik7Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlcygpLnJlbW92ZShhUmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsI2dldFByaW1hcnlSb290T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRQcmltYXJ5Um9vdE9iamVjdCgpIHsKLQkJCi0JCXRyeSB7Ci0JCQlSZXNvdXJjZSByZXMgPSBwcmVwYXJlUHJvamVjdE1vZHVsZXNJZk5lY2Vzc2FyeSgpOwotCQkJaWYgKHJlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJRU9iamVjdCBtb2RlbFJvb3QgPSBudWxsOwotCQltb2RlbFJvb3QgPSBzdXBlci5nZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCQlpZiAobW9kZWxSb290ICE9IG51bGwpIHsKLQkJCS8vIGlmIHRoZSB3b3Jrc3BhY2UgdHJlZSBpcyBsb2NrZWQgd2UgY2Fubm90IHRyeSB0byBjaGFuZ2UgdGhlIC5jb21wb25lbnQgcmVzb3VyY2UKLQkJCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNUcmVlTG9ja2VkKCkpCi0JCQkJcmV0dXJuIG1vZGVsUm9vdDsKLQkJCUxpc3QgY29tcG9uZW50cyA9ICgoUHJvamVjdENvbXBvbmVudHMpbW9kZWxSb290KS5nZXRDb21wb25lbnRzKCk7Ci0JCQlpZiAoY29tcG9uZW50cy5zaXplKCk+MCkgewotCQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXAgPSAoV29ya2JlbmNoQ29tcG9uZW50KWNvbXBvbmVudHMuZ2V0KDApOwotCQkJCS8vIENoZWNrIGFuZCBzZWUgaWYgd2UgbmVlZCB0byBjbGVhbiB1cCBzcHVycmlvdXMgcmVkdW5kYW50IG1hcCBlbnRyaWVzCi0JCQkJaWYgKCFpc1ZlcnNpb24xNShtb2RlbFJvb3QpKSB7Ci0JCQkJCSgoUHJvamVjdENvbXBvbmVudHMpbW9kZWxSb290KS5zZXRWZXJzaW9uKFBST0pFQ1RfVkVSU0lPTl8xXzUpOwotCQkJCQljbGVhbnVwV1RQTW9kdWxlcyh3YkNvbXApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxSb290OwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNWZXJzaW9uMTUoRU9iamVjdCBtb2RlbFJvb3QpewotCQlyZXR1cm4gKChQcm9qZWN0Q29tcG9uZW50cyltb2RlbFJvb3QpLmdldFZlcnNpb24oKS5lcXVhbHMoUFJPSkVDVF9WRVJTSU9OXzFfNSk7Ci0JfQotICAgIAotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmVtb3ZlIHNwdXJyaW91cyByZWR1bmRhbnQgZW50cmllcyBmcm9tIHRoZSAuY29tcG9uZW50IGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gd2JDb21wCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW51cFdUUE1vZHVsZXMoV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcCkgewotCQlpZiAod2JDb21wID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0U291cmNlUmVzb3VyY2VUcmVlUm9vdCh3YkNvbXApOwotCQlMaXN0IHJvb3RSZXNvdXJjZXMgPSBnZXRNb2R1bGVSZXNvdXJjZXMocm9vdCk7Ci0JCS8vIE9ubHkgaWYgd2UgbmVlZCB0byBkbyBhIGNsZWFuLCBkbyB3ZSBjbGVhciwgYWRkIGFsbCByZXF1aXJlZCByb290IHJlc291cmNlIG1hcHBpbmdzLCBhbmQgc2F2ZQotCQlpZiAoISh3YkNvbXAuZ2V0UmVzb3VyY2VzKCkuY29udGFpbnNBbGwocm9vdFJlc291cmNlcykgJiYgd2JDb21wLmdldFJlc291cmNlcygpLnNpemUoKT09cm9vdFJlc291cmNlcy5zaXplKCkpKSB7Ci0JCQlmaW5hbCBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgbW9kZWwgPSBuZXcgTW9kdWxlU3RydWN0dXJhbE1vZGVsKGdldEVkaXRNb2RlbElEKCksZ2V0RW1mQ29udGV4dCgpLGZhbHNlKTsKLQkJCWlmKG1vZGVsID09IG51bGwpewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWJvb2xlYW4gam9iU2NoZWR1bGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZpbmFsIE9iamVjdCBrZXkgPSBuZXcgT2JqZWN0KCk7Ci0JCQkJbW9kZWwuYWNjZXNzKGtleSk7Ci0JCQkJCi0JCQkJd2JDb21wLmdldFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCQkJd2JDb21wLmdldFJlc291cmNlcygpLmFkZEFsbChyb290UmVzb3VyY2VzKTsKLQkJCQlVUkkgdXJpID0gd2JDb21wLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJCS8vbmVlZCB0byBnZXQgdGhpcyByZXNvdXJjZSBpbnRvIHRoZSBtb2RlbAotCQkJCVJlc291cmNlIHJlc291cmNlID0gbW9kZWwuZ2V0UmVzb3VyY2UodXJpKTsKLQkJCQkvL25lZWQgdG8gbWFudWFsbHkgZGlydHkgdGhpcyByZXNvdXJjZSBpbiBvcmRlciBmb3IgaXQgdG8gc2F2ZS4KLQkJCQlyZXNvdXJjZS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkvL3RoaXMgam9iIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCB0aGUgZGVhZGxvY2sgaW4gCi0JCQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxMjUzCi0JCQkJY2xhc3MgU2F2ZUpvYiBleHRlbmRzIEpvYiB7Ci0JCQkJCQotCQkJCQlwdWJsaWMgU2F2ZUpvYigpIHsKLQkJCQkJCXN1cGVyKCJTYXZlIE1vZHVsZVN0cnVjdHVyYWxNb2RlbCBKb2IiKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQltb2RlbC5zYXZlKGtleSk7Ci0JCQkJCQkJcmV0dXJuIE9LX1NUQVRVUzsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJZGlzcG9zZU9uY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkQWxyZWFkeSA9IGZhbHNlOwotCQkJCQkKLQkJCQkJcHVibGljIHZvaWQgZGlzcG9zZU9uY2UoKXsKLQkJCQkJCWlmKCFkaXNwb3NlZEFscmVhZHkpewotCQkJCQkJCWRpc3Bvc2VkQWxyZWFkeSA9IHRydWU7Ci0JCQkJCQkJbW9kZWwuZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQlmaW5hbCBTYXZlSm9iIHNhdmVKb2IgPSBuZXcgU2F2ZUpvYigpOwotCQkJCXNhdmVKb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKXsKLQkJCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXNhdmVKb2IuZGlzcG9zZU9uY2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXNhdmVKb2Iuc2V0U3lzdGVtKHRydWUpOwotCQkJCXNhdmVKb2Iuc2NoZWR1bGUoKTsKLQkJCQlqb2JTY2hlZHVsZWQgPSB0cnVlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoIWpvYlNjaGVkdWxlZCAmJiBtb2RlbCAhPSBudWxsKQotCQkJCQltb2RlbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0gCi0JfQotICAgIAotCS8qKgotCSAqIFRoaXMgaXMgYSByZWN1cnNpdmUgbWV0aG9kIHRvIGZpbmQgYWxsIHRoZSByb290IGxldmVsIHJlc291cmNlcyBpbiB0aGUgY2hpbGRyZW4ncyByZXNvdXJjZSB0cmVlIHJvb3RzCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIExpc3Qgb2YgbW9kdWxlIHJlc291cmNlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZHVsZVJlc291cmNlcyhSZXNvdXJjZVRyZWVOb2RlIG5vZGUpIHsKLQkJLy8gSWYgdGhlIHJlc291cmNlIG5vZGUgaGFzIG1vZHVsZSByZXNvdXJjZXMganVzdCByZXR1cm4gdGhlbQotCQlpZiAobm9kZS5nZXRNb2R1bGVSZXNvdXJjZXMoKS5sZW5ndGg+MCkKLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KG5vZGUuZ2V0TW9kdWxlUmVzb3VyY2VzKCkpOwotCQkvLyBPdGhlcndpc2UsIHRoZSByb290IHJlc291cmNlIG1hcHMgYXJlIHJlYWxseSBhdCB0aGUgbmV4dCBsZXZlbCBvciBsb3dlcgotCQlMaXN0IHJvb3RSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1hcCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGRyZW4oKTsKLQkJSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJUmVzb3VyY2VUcmVlTm9kZSBzdWJOb2RlID0gKFJlc291cmNlVHJlZU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJLy8gcmVjdXJzaXZlbHkgY2FsbCBtZXRob2QgdG8gb2J0YWluIG1vZHVsZSByZXNvdXJjZXMKLQkJCXJvb3RSZXNvdXJjZXMuYWRkQWxsKGdldE1vZHVsZVJlc291cmNlcyhzdWJOb2RlKSk7Ci0JCX0KLQkJcmV0dXJuIHJvb3RSZXNvdXJjZXM7Ci0JfQotCXB1YmxpYyBSZXNvdXJjZSBwcmVwYXJlUHJvamVjdE1vZHVsZXNJZk5lY2Vzc2FyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJWE1JUmVzb3VyY2UgcmVzOwotCQlpZiAoIWlzQ29tcG9uZW50U3luY2hyb25pemVkT3JOdWxsKCkpIHsKLQkJCS8vUmV0dXJuIGlmIGNvbXBvbmVudCBmaWxlIGlzIG91dCBvZiBzeW5jIGZyb20gd29ya3NwYWNlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXMgPSAoWE1JUmVzb3VyY2UpIGdldFByaW1hcnlSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzTmVlZHNNaWdyYXRpbmcocmVzKSAmJiAhdXNlT2xkRm9ybWF0KQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmKHJlcyA9PSBudWxsKQotCQkJcmVzID0gbWFrZVdUUE1vZHVsZXNSZXNvdXJjZSgpOwkJCi0JCXRyeSB7Ci0JCQlhZGRQcm9qZWN0TW9kdWxlc0lmTmVjZXNzYXJ5KHJlcyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsJCQotCQkJUGxhdGZvcm0uZ2V0TG9nKE1vZHVsZWNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfSAKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2RzIGNoZWNrcyB0aGUgc3RhdHVzIG9mIHRoZSBjb21wb25lbnQgZmlsZSwgYW5kIGZpcnN0IGNoZWNrcyBmb3IgZXhpc3RhbmNlLCB0aGVuIGlmIGl0cyBsb2NhbGx5IHN5bmNocm9uaXplZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmVudFN5bmNocm9uaXplZE9yTnVsbCgpIHsKLQkJSUZpbGUgY29tcG9uZW50RmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQkJSVBhdGggY29tcG9uZW50RmlsZUxvY2F0aW9uID0gY29tcG9uZW50RmlsZS5nZXRMb2NhdGlvbigpOwotCQlpZiAoY29tcG9uZW50RmlsZUxvY2F0aW9uICE9IG51bGwgJiYgIWNvbXBvbmVudEZpbGVMb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJY29tcG9uZW50RmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKFIxX01PRFVMRV9NRVRBX0ZJTEVfTkFNRSk7Ci0JCQljb21wb25lbnRGaWxlTG9jYXRpb24gPSBjb21wb25lbnRGaWxlLmdldExvY2F0aW9uKCk7Ci0JCQlpZiAoY29tcG9uZW50RmlsZUxvY2F0aW9uICE9IG51bGwgJiYgIWNvbXBvbmVudEZpbGVMb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCWNvbXBvbmVudEZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZShSMF83X01PRFVMRV9NRVRBX0ZJTEVfTkFNRSk7Ci0JCQkJY29tcG9uZW50RmlsZUxvY2F0aW9uID0gY29tcG9uZW50RmlsZS5nZXRMb2NhdGlvbigpOwotCQkJCWlmIChjb21wb25lbnRGaWxlTG9jYXRpb24gIT0gbnVsbCAmJiAhY29tcG9uZW50RmlsZUxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSAKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbXBvbmVudEZpbGVMb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgcmV0dXJuIGNvbXBvbmVudEZpbGUuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCX0KLQlwdWJsaWMgV1RQTW9kdWxlc1Jlc291cmNlICBtYWtlV1RQTW9kdWxlc1Jlc291cmNlKCkgewotCQlyZXR1cm4gKFdUUE1vZHVsZXNSZXNvdXJjZSkgY3JlYXRlUmVzb3VyY2UoV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeS5XVFBfTU9EVUxFU19VUklfT0JKKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcnVuU2F2ZU9wZXJhdGlvbihJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFNhdmVGYWlsZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbnVsbCxJV29ya3NwYWNlLkFWT0lEX1VQREFURSxtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWxlZEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrQWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5jaGVja0FjdGl2YXRpb24ocHJlc2VudGVyKTsKLQl9Ci0JLyoqCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgLSBieSBkZWZhdWx0IHRoaXMgd2lsbCByZXR1cm4gdGhlIGZpcnN0IHJlc291cmNlIHJlZmVyZW5jZWQgYnkgdGhlCi0JICoga25vd24gcmVzb3VyY2UgVVJJcyBmb3IgdGhpcyBFZGl0TW9kZWwKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFByaW1hcnlSZXNvdXJjZSgpIHsKLQkJLy8gT3ZlcnJpZGVuIHRvIGhhbmRsZSBsb2FkaW5nIHRoZSAuY29tcG9uZW50IHJlc291cmNlIGluIG5ldyBhbmQgb2xkIGZvcm1zCi0JCS8vIEZpcnN0IHdpbGwgdHJ5IHRvIGxvYWQgZnJvbSAuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQKLQkJLy8gU2Vjb25kIHdpbGwgdHJ5IHRvIGxvYWQgZnJvbSB0aGUgb2xkIGxvY2F0aW9uKHMpIC5zZXR0aW5ncy8uY29tcG9uZW50IG9yIC5jb21wb25lbnQKLQkJCi0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQkJV1RQTW9kdWxlc1Jlc291cmNlIHJlcyA9IChXVFBNb2R1bGVzUmVzb3VyY2UpZ2V0UmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlcyA9PSBudWxsIHx8ICFyZXMuaXNMb2FkZWQoKSkgewotCQkJcmVtb3ZlUmVzb3VyY2UocmVzKTsKLQkJCXVyaSA9IFVSSS5jcmVhdGVVUkkoUjFfTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQkJCXJlcyA9IChXVFBNb2R1bGVzUmVzb3VyY2UpZ2V0UmVzb3VyY2UodXJpKTsKLQkJCWlmIChyZXMgPT0gbnVsbCB8fCAhcmVzLmlzTG9hZGVkKCkpIHsKLQkJCQlyZW1vdmVSZXNvdXJjZShyZXMpOwotCQkJCXVyaSA9IFVSSS5jcmVhdGVVUkkoUjBfN19NT0RVTEVfTUVUQV9GSUxFX05BTUUpOwotCQkJCXJlcyA9IChXVFBNb2R1bGVzUmVzb3VyY2UpZ2V0UmVzb3VyY2UodXJpKTsKLQkJCQlpZiAocmVzID09IG51bGwgfHwgIXJlcy5pc0xvYWRlZCgpKSB7Ci0JCQkJCXJlbW92ZVJlc291cmNlKHJlcyk7Ci0JCQkJCXJlcyA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhbkFkYXB0ZXIpOyAKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdE1vZHVsZXNJZk5lY2Vzc2FyeShYTUlSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsgCi0JCQlpZihhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlQcm9qZWN0Q29tcG9uZW50cyBwcm9qZWN0TW9kdWxlcyA9IENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRjb3JlRmFjdG9yeSgpLmNyZWF0ZVByb2plY3RDb21wb25lbnRzKCk7Ci0JCQkJcHJvamVjdE1vZHVsZXMuc2V0UHJvamVjdE5hbWUocHJvamVjdC5nZXROYW1lKCkpOwotCQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChwcm9qZWN0TW9kdWxlcyk7IAotCQkJCWFSZXNvdXJjZS5zZXRJRChwcm9qZWN0TW9kdWxlcywgTU9EVUxFX0NPUkVfSUQpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgYm9vbGVhbiByZXNOZWVkc01pZ3JhdGluZyhYTUlSZXNvdXJjZSByZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBtdWx0aUNvbXBzID0gZmFsc2U7Ci0JCWlmIChwcm9qZWN0PT1udWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlib29sZWFuIG5lZWRzTWlncmF0aW5nID0gKCFwcm9qZWN0Lmhhc05hdHVyZShGYWNldGVkUHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB8fCByZXMgPT0gbnVsbCB8fCAoKHJlcyAhPSBudWxsKSAmJiAoKFdUUE1vZHVsZXNSZXNvdXJjZSlyZXMpLmdldFJvb3RPYmplY3QoKSA9PSBudWxsKTsgCi0JCWlmICghbmVlZHNNaWdyYXRpbmcpIHsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBUcmFuc2xhdG9yUmVzb3VyY2UgJiYgKChUcmFuc2xhdG9yUmVzb3VyY2UpcmVzKS5nZXRSb290T2JqZWN0KCkgaW5zdGFuY2VvZiBQcm9qZWN0Q29tcG9uZW50cykgewotCQkJCVByb2plY3RDb21wb25lbnRzIGNvbXBvbmVudHMgPSAoUHJvamVjdENvbXBvbmVudHMpICgoV1RQTW9kdWxlc1Jlc291cmNlKXJlcykuZ2V0Um9vdE9iamVjdCgpOwotCQkJCWlmIChjb21wb25lbnRzLmdldENvbXBvbmVudHMoKSAhPSBudWxsKSB7Ci0JCQkJCW11bHRpQ29tcHMgPSBjb21wb25lbnRzLmdldENvbXBvbmVudHMoKS5zaXplKCkgPiAxOwotCQkJCQlyZXR1cm4gbXVsdGlDb21wczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5lZWRzTWlncmF0aW5nOwotCX0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0QW5kTG9hZExvY2FsUmVzb3VyY2UoVVJJIGFVcmkpIHsKLQkJCi0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldExvY2FsUmVzb3VyY2UoYVVyaSk7Ci0JCQlpZiAobnVsbCAhPSByZXNvdXJjZSkgewotCQkJCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOyAvLyByZWxvYWQgaXQKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gSWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZU9sZEZvcm1hdChib29sZWFuIHVzZU9sZEZvcm1hdCkgewotCQl0aGlzLnVzZU9sZEZvcm1hdCA9IHVzZU9sZEZvcm1hdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlY29yZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZWNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiNTVkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlY29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5QbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQTW9kdWxlc0luaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQXJ0aWZhY3RFZGl0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuTW9kdWxlQ29yZUVjbGlwc2VBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5UaHJvd2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVjb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTW9kdWxlY29yZVBsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkvL3BsdWdpbiBpZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNb2R1bGVjb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUlBZGFwdGVyTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKTsKLQkJCi0JCW1hbmFnZXIucmVnaXN0ZXJBZGFwdGVycyhuZXcgTW9kdWxlQ29yZUVjbGlwc2VBZGFwdGVyRmFjdG9yeSgpLCBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwuY2xhc3MpOwotCQltYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMobmV3IEFydGlmYWN0RWRpdEFkYXB0ZXJGYWN0b3J5KCksIEFydGlmYWN0RWRpdE1vZGVsLmNsYXNzKTsKLQkJbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKG5ldyBBcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeSgpLCBBcnRpZmFjdEVkaXQuY2xhc3MpOwotCQltYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMobmV3IEFydGlmYWN0RWRpdEFkYXB0ZXJGYWN0b3J5KCksIElWaXJ0dWFsQ29tcG9uZW50LmNsYXNzKTsKLQkJbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKG5ldyBNb2R1bGVDb3JlRWNsaXBzZUFkYXB0ZXJGYWN0b3J5KCksIElSZXNvdXJjZS5jbGFzcyk7Ci0JCQotCQlQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uc3RhcnR1cCgpOwotCQlXVFBNb2R1bGVzSW5pdC5pbml0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZHVsZWNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IE1vZHVsZWNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm1vZHVsZWNvcmUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBSZWNvcmQgYW4gZXJyb3IgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGFuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLAotCQkJVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coCi0JCQkJY3JlYXRlRXJyb3JTdGF0dXMoYUNvZGUsIGFNZXNzYWdlLCBhbkV4Y2VwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIFJlY29yZCBhIG1lc3NhZ2UgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJbG9nKGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBzdGF0dXMgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgYVN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGFTdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN0YXR1cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbHVnaW4uCi0JICogIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIEEgc3RhdHVzIGNvbmZpZ3VyZWQgd2l0aCB0aGlzIHBsdWdpbidzIGlkIGFuZCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgaW50IGFDb2RlLAotCQkJU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIGFDb2RlLAotCQkJCWFNZXNzYWdlICE9IG51bGwgPyBhTWVzc2FnZSA6ICJObyBtZXNzYWdlLiIsIGV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLAotCQkJVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Qcm9qZWN0Q29tcG9uZW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1Byb2plY3RDb21wb25lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYThhODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1Byb2plY3RDb21wb25lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAqIFByb3ZpZGVzIGEgcm9vdCBvYmplY3QgdG8gc3RvcmUgYW5kIG1hbmFnZSB0aGUKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Xb3JrYmVuY2hDb21wb25lbnR9cy4gKiAKLSAqIDxwPgotICogU2VlIHRoZSBwYWNrYWdlIG92ZXJ2aWV3IGZvciBhbiA8YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3ZlcnZpZXcgb2YgdGhlIG1vZGVsIGNvbXBvbmVudHMgPC9hPi4KLSAqIDwvcD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRQcm9qZWN0TmFtZSA8ZW0+UHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMjZ2V0Q29tcG9uZW50cyA8ZW0+Q29tcG9uZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRQcm9qZWN0Q29tcG9uZW50cygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9qZWN0Q29tcG9uZW50cyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvamVjdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZAotCSAqIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFByb2plY3RDb21wb25lbnRzX1Byb2plY3ROYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMjZ2V0UHJvamVjdE5hbWUgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21wb25lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRQcm9qZWN0Q29tcG9uZW50c19Db21wb25lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbXBvbmVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UHJvamVjdENvbXBvbmVudHNfVmVyc2lvbigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgZmluZFdvcmtiZW5jaE1vZHVsZShTdHJpbmcgYURlcGxveU5hbWUpOwotCi19IC8vIFByb2plY3RDb21wb25lbnRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Qcm9qZWN0TWlncmF0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg4M2NhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Qcm9qZWN0TWlncmF0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0TWlncmF0b3JSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05BTUUgPSAiQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9NSUdSQVRPUl9FWFRFTlNJT04gPSAibWlncmF0b3JFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBNSUdSQVRPUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIExpc3QgcHJvamVjdE1pZ3JhdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIHN0YXRpYyBQcm9qZWN0TWlncmF0b3JSZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7Ci0KLQlwdWJsaWMgUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fTkFNRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9qZWN0TWlncmF0b3JSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKLQkJCUlOU1RBTkNFID0gbmV3IFByb2plY3RNaWdyYXRvclJlZ2lzdHJ5KCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHcvIGFuIGV4dGVuc2lvbiBsaWtlOiA8ZWFyTW9kdWxlRXh0ZW5zaW9uIGV4dGVuc2lvbkNsYXNzID0KLQkgKiAiY29tLmlibS5ldG9vbHMud2ViLnBsdWdpbi5XZWJNb2R1bGVFeHRlbnNpb25JbXBsIi8+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTUVOVF9NSUdSQVRPUl9FWFRFTlNJT04pKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlDb21wb25lbnRQcm9qZWN0TWlncmF0b3IgbWlncmF0b3IgPSBudWxsOwotCQl0cnkgewotCQkJbWlncmF0b3IgPSAoSUNvbXBvbmVudFByb2plY3RNaWdyYXRvcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKE1JR1JBVE9SX0NMQVNTKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWlmIChtaWdyYXRvciAhPSBudWxsKQotCQkJYWRkTW9kdWxlRXh0ZW5zaW9uKG1pZ3JhdG9yKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElDb21wb25lbnRQcm9qZWN0TWlncmF0b3JbXSBnZXRQcm9qZWN0TWlncmF0b3JzKCl7Ci0JCXJldHVybiAoSUNvbXBvbmVudFByb2plY3RNaWdyYXRvcltdKXByb2plY3RNaWdyYXRvcnMudG9BcnJheShuZXcgSUNvbXBvbmVudFByb2plY3RNaWdyYXRvcltwcm9qZWN0TWlncmF0b3JzLnNpemUoKV0pOwotCX0KLQlwcml2YXRlIHZvaWQgYWRkTW9kdWxlRXh0ZW5zaW9uKElDb21wb25lbnRQcm9qZWN0TWlncmF0b3IgZXh0KSB7Ci0JCXByb2plY3RNaWdyYXRvcnMuYWRkKGV4dCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUHJvcGVydHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBmMTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9wZXJ0eS5qYXZhLHYgMS4yIDIwMDYvMDQvMjcgMDQ6MTc6NDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRQcm9wZXJ0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFByb3BlcnR5X05hbWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRQcm9wZXJ0eV9WYWx1ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb3BlcnR5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUmVmZXJlbmNlZENvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1JlZmVyZW5jZWRDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVhNWNmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUmVmZXJlbmNlZENvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAqIFVzZWQgdG8gcmVmZXJlbmNlIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Xb3JrYmVuY2hDb21wb25lbnR9cyBlaXRoZXIgY29udGFpbmVkIGluCi0gKiB0aGUgc2FtZSBwcm9qZWN0IG9yIHJlbW90ZWx5LiAKLSAqIDxwPgotICogRWFjaCB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwOyBjb250YWlucyBhIGxpc3Qgb2YgaXRzCi0gKiBEZXBlbmRlbnRNb2R1bGVzLgotICogPC9wPiAKLSAqIDxwPgotICogVGhlIHJlZmVyZW5jZWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwOyBtYXkgYmUgaW4gdGhlIHNhbWUgcHJvamVjdCBhcyB0aGUKLSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDsgdGhhdCBjb250YWlucyB0aGUgY3VycmVudCBSZWZlcmVuY2VkQ29tcG9uZW50LiBVc2UKLSAqIHtAc2VlIE1vZHVsZUNvcmUjaXNMb2NhbERlcGVuZGVuY3koUmVmZXJlbmNlZENvbXBvbmVudCl9Jm5ic3A7IHRvIG1ha2UgdGhlIGRldGVybWluYXRpb24uCi0gKiA8L3A+IAotICogPHA+Ci0gKiBTZWUgdGhlIHBhY2thZ2Ugb3ZlcnZpZXcgZm9yIGFuIDxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj5vdmVydmlldyBvZiB0aGUgbW9kZWwgY29tcG9uZW50cyA8L2E+LgotICogPC9wPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0SGFuZGxlIDxlbT5IYW5kbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldFJ1bnRpbWVQYXRoIDxlbT5SdW50aW1lIFBhdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldERlcGVuZGVuY3lUeXBlIDxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldERlcGVuZGVudE9iamVjdCA8ZW0+RGVwZW5kZW50IE9iamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0QXJjaGl2ZU5hbWUgPGVtPkFyY2hpdmUgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFJlZmVyZW5jZWRDb21wb25lbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVmZXJlbmNlZENvbXBvbmVudCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogUmV0dXJucyBhIGZ1bGx5LXF1YWxpZmllZCBVUkkgdGhhdCBjb25mb3JtcyB0byB0aGUgc3RhbmRhcmQgIm1vZHVsZToiIFVSSSBmb3JtYXQuIFRoZSBoYW5kbGUKLQkgKiByZWZlcmVuY2VzIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cmVwcmVzZW50ZWQgYnkgdGhlIGN1cnJlbnQgUmVmZXJlbmNlZENvbXBvbmVudC4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIYW5kbGUoVVJJKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFJlZmVyZW5jZWRDb21wb25lbnRfSGFuZGxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5VUkkiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVUkkgZ2V0SGFuZGxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRIYW5kbGUgPGVtPkhhbmRsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SGFuZGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIYW5kbGUoVVJJIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJ1bnRpbWUgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UnVudGltZSBQYXRoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UnVudGltZVBhdGgoSVBhdGgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9SdW50aW1lUGF0aCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSVBhdGgiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJUGF0aCBnZXRSdW50aW1lUGF0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0UnVudGltZVBhdGggPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UnVudGltZSBQYXRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSdW50aW1lUGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UnVudGltZVBhdGgoSVBhdGggdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIFRoZSBsaXRlcmFscyBhcmUKLQkgKiBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIFNlZSB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiB7QHNlZSBEZXBlbmRlbmN5VHlwZX1mb3IgaW5mb3JtYXRpb24gb24gdGhlIHB1cnBvc2Ugb2YgdGhpcwotCSAqIGZpZWxkLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlCi0JICogQHNlZSAjc2V0RGVwZW5kZW5jeVR5cGUoRGVwZW5kZW5jeVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlQ29yZVBhY2thZ2UjZ2V0RGVwZW5kZW50TW9kdWxlX0RlcGVuZGVuY3lUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVwZW5kZW5jeVR5cGUgZ2V0RGVwZW5kZW5jeVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldERlcGVuZGVuY3lUeXBlIDxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlCi0JICogQHNlZSAjZ2V0RGVwZW5kZW5jeVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlcGVuZGVuY3lUeXBlKERlcGVuZGVuY3lUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlcGVuZGVudCBPYmplY3Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVwZW5kZW50IE9iamVjdDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGVwZW5kZW50T2JqZWN0KEVPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbnRPYmplY3QoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFT2JqZWN0IGdldERlcGVuZGVudE9iamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0RGVwZW5kZW50T2JqZWN0IDxlbT5EZXBlbmRlbnQgT2JqZWN0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXBlbmRlbnQgT2JqZWN0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZXBlbmRlbnRPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlcGVuZGVudE9iamVjdChFT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFyY2hpdmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXJjaGl2ZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFyY2hpdmUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXJjaGl2ZU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFJlZmVyZW5jZWRDb21wb25lbnRfQXJjaGl2ZU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldEFyY2hpdmVOYW1lIDxlbT5BcmNoaXZlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFyY2hpdmUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXJjaGl2ZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFyY2hpdmVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUmVmZXJlbmNlZENvbXBvbmVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1N0cnVjdHVyZUVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9TdHJ1Y3R1cmVFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTFjZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1N0cnVjdHVyZUVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuSUVkaXRNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5QbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuRWNsaXBzZVJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5JVmFsaWRhdGVFZGl0Q29udGV4dDsKLQotLyoqCi0gKiA8cD4KLSAqIFByb3ZpZGVzIGEgRmFjYWRlIHBhdHRlcm4gZm9yIGFjY2Vzc2luZyB0aGUgV2ViIFRvb2xzIFBsYXRmb3JtIEVNRiBNb2R1bGUgTW9kZWwuIE1vZHVsZUNvcmUgY2FuCi0gKiBiZSB1c2VkIGFzIGEgc3RhdGljIHV0aWxpdHkgb3IgYW4gaW5zdGFuY2UgYWRhcHRlci4KLSAqIDwvcD4KLSAqIDxwPgotICogTW9kdWxlQ29yZSBoaWRlcyB0aGUgbWFuYWdlbWVudCBvZiBhY2Nlc3NpbmcgRWRpdE1vZGVscyAoCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlU3RydWN0dXJhbE1vZGVsfSkgY29ycmVjdGx5LiBFYWNoIHByb2plY3QgaGFzCi0gKiBleGFjdGx5IG9uZSAoe0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0pIGZvciByZWFkIGFuZAotICogZXhhY3RseSBvbmUgZm9yIHdyaXRlLiBFYWNoIG9mIHRoZXNlIGlzIHNoYXJlZCBhbW9uZyBhbGwgY2xpZW50cyBhbmQgcmVmZXJlbmNlIGNvdW50ZWQgYXMKLSAqIG5lY2Vzc2FyeS4gQ2xpZW50cyBzaG91bGQgdXNlIE1vZHVsZUNvcmUgd2hlbiB3b3JraW5nIHdpdGggdGhlIFdUUCBNb2R1bGVzIFN0cmN1dHJ1YWwgTW9kZWwuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogRWFjaCBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIGlzIGRlc2lnbmVkIHRvIG1hbmFnZSB0aGUgRWRpdE1vZGVsIGxpZmVjeWNsZSBmb3IgY2xpZW50cy4gSG93ZXZlciwKLSAqIHdoaWxlIGVhY2ggTW9kdWxlQ29yZSBpcyBkZXNpZ25lZCB0byBiZSBwYXNzZWQgYXJvdW5kIGFzIG5lZWRlZCwgY2xpZW50cyBtdXN0IGVuZm9yY2UgdGhlCi0gKiBNb2R1bGVDb3JlIGxpZmVjeWNsZS4gVGhlIG1vc3QgY29tbW9uIG1ldGhvZCBvZiBhY3F1aXJpbmcgYSBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIGlzIHRvIHVzZQotICoge0BzZWUgI2dldE1vZHVsZUNvcmVGb3JSZWFkKElQcm9qZWN0KX0mbmJzcDtvciB7QHNlZSAjZ2V0TW9kdWxlQ29yZUZvcldyaXRlKElQcm9qZWN0KX0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFdoZW4gY2xpZW50cyBoYXZlIGNvbmNsdWRlZCB0aGVpciB1c2Ugb2YgdGhlaXIgTW9kdWxlQ29yZSBpbnN0YW5jZSBhZGFwdGVyICwgPGI+Y2xpZW50cyBtdXN0IGNhbGwKLSAqIHtAc2VlICNkaXNwb3NlKCl9PC9iPi4KLSAqIDwvcD4KLSAqIDxwPgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVuZGVybHlpbmcgRWRpdE1vZGVsLCBzZWUgPGEKLSAqIGhyZWY9Ik1vZHVsZUNvcmVOYXR1cmUuaHRtbCNtb2R1bGUtc3RydWN0dXJhbC1tb2RlbCI+dGhlIGRpc2N1c3Npb24gb2YgdGhlIE1vZHVsZVN0cnVjdHVyYWxNb2RlbAotICogPC9hPi4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlU3RydWN0dXJhbE1vZGVsCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVFZGl0IGltcGxlbWVudHMgSUVkaXRNb2RlbEhhbmRsZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX1RZUEUgPSBTdHJ1Y3R1cmVFZGl0LmNsYXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX01FVEFfRklMRV9OQU1FID0gIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIENvbXBvbmVudGNvcmVGYWN0b3J5IENPTVBPTkVOVF9GQUNUT1JZID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudFJlc291cmNlW10gTk9fUkVTT1VSQ0VTID0gbmV3IENvbXBvbmVudFJlc291cmNlWzBdOwotCQotCXByaXZhdGUgZmluYWwgTW9kdWxlU3RydWN0dXJhbE1vZGVsIHN0cnVjdHVyYWxNb2RlbDsKLQlwcml2YXRlIGZpbmFsIE1hcCBkZXBlbmRlbnRDb3JlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBJUHJvamVjdCBhUHJvamVjdDsKLQlwcml2YXRlIGJvb2xlYW4gaXNTdHJ1Y3R1cmFsTW9kZWxTZWxmTWFuYWdlZDsKLQlwcml2YXRlIGJvb2xlYW4gaXNSZWFkT25seTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFdvcmtiZW5jaENvbXBvbmVudFtdIE5PX0NPTVBPTkVOVFMgPSBuZXcgV29ya2JlbmNoQ29tcG9uZW50WzBdOwotCi0JLyoqCi0JICogCi0JICogPHA+Ci0JICogRWFjaCBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIGlzIHRpZWQgdG8gYSBzcGVjaWZpYyBwcm9qZWN0LiBBIHByb2plY3QKLQkgKiBtYXkgaGF2ZSBtdWx0aXBsZSBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlcyBsaXZlIGF0IGFueSBnaXZlbiB0aW1lLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhIE1vZHVsZUNvcmUgZmFjYWRlIGZvciBhIHNwZWNpZmljIHByb2plY3QgdGhhdCB3aWxsIG5vdAotCSAqIGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZQotCSAqIHJldHVybmVkIGZyb20gVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBJUHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBXVFAgTW9kdWxlcyBtb2RlbCB0byBsb2FkCi0JICogQHJldHVybiBBIE1vZHVsZUNvcmUgZWRpdCBmYWNhZGUgdG8gYWNjZXNzIHRoZSBXVFAgTW9kdWxlcyBNb2RlbCwgbnVsbAotCSAqICAgICAgICAgZm9yIG5vbi1mbGV4aWJsZSBwcm9qZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RydWN0dXJlRWRpdCBnZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChJUHJvamVjdCBhUHJvamVjdCkgewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShhUHJvamVjdCk7Ci0JCXJldHVybiBuYXR1cmUgIT0gbnVsbCA/IG5ldyBTdHJ1Y3R1cmVFZGl0KG5hdHVyZSwgdHJ1ZSkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIDxwPgotCSAqIEVhY2ggTW9kdWxlQ29yZSBlZGl0IGZhY2FkZSBpcyB0aWVkIHRvIGEgc3BlY2lmaWMgcHJvamVjdC4gQSBwcm9qZWN0IG1heSBoYXZlIG11bHRpcGxlCi0JICogTW9kdWxlQ29yZSBlZGl0IGZhY2FkZXMgbGl2ZSBhdCBhbnkgZ2l2ZW4gdGltZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYSBNb2R1bGVDb3JlIGZhY2FkZSBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IHRoZQotCSAqIG1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBJUHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBXVFAgTW9kdWxlcyBtb2RlbCB0byBsb2FkCi0JICogQHJldHVybiBBIE1vZHVsZUNvcmUgZWRpdCBmYWNhZGUgdG8gYWNjZXNzIHRoZSBXVFAgTW9kdWxlcyBNb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RydWN0dXJlRWRpdCBnZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUoYVByb2plY3QpOwotCQlyZXR1cm4gbmF0dXJlICE9IG51bGwgPyBuZXcgU3RydWN0dXJlRWRpdChuYXR1cmUsIGZhbHNlKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBBUEkgdG8gZmV0Y2ggdGhlIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Jm5ic3A7Zm9yIGEgcGFydGljdWxhciBtb2R1bGUgVVJJLiBUaGUKLQkgKiBtb2R1bGUgVVJJIG11c3QgYmUgb2YgdGhlIHZhbGlkIGZvcm0sIG9yIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gVGhlIG1vZHVsZSBVUkkgbXVzdCBiZQotCSAqIGNvbnRhaW5lZCBieSBhIHByb2plY3QgdGhhdCBoYXMgYSB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfSZuYnNwO29yIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIHZhbGlkLCBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSQotCSAqIEByZXR1cm4gVGhlIE1vZHVsZUNvcmVOYXR1cmUgb2YgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIGFNb2R1bGVVUkkKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVDb3JlTmF0dXJlIGdldE1vZHVsZUNvcmVOYXR1cmUoVVJJIGFNb2R1bGVVUkkpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmluZ1Byb2plY3QoYU1vZHVsZVVSSSk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkKLQkJCXJldHVybiBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUoY29udGFpbmVyKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRm9yIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1zIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYSBwcm9qZWN0LCB0aGUgY29udGFpbmluZyBwcm9qZWN0Ci0JICogY2FuIGJlIGRldGVybWluZWQgd2l0aCB0aGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSdzIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgVVJJLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgZm9sbG93aW5nIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBmb3IgdGhlIHN1cHBsaWVkIG1vZHVsZSBVUkksCi0JICogaWYgaXQgY2FuIGJlIGRldGVybWluZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIGFuIGluYWNjZXNzaWJsZSBwcm9qZWN0LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgVVJJCi0JICogQHJldHVybiBUaGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBtb2R1bGUgcmVmZXJlbmNlZCBieSB0aGUgbW9kdWxlIFVSSQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldENvbnRhaW5pbmdQcm9qZWN0KFdvcmtiZW5jaENvbXBvbmVudCBhQ29tcG9uZW50KSB7CQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGFDb21wb25lbnQpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gcHJvamVjdDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIEZvciB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cyB0aGF0IGFyZSBjb250YWluZWQgd2l0aGluIGEgcHJvamVjdCwgdGhlIGNvbnRhaW5pbmcgcHJvamVjdAotCSAqIGNhbiBiZSBkZXRlcm1pbmVkIHdpdGggdGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0ncyBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGZvbGxvd2luZyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgZm9yIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJLAotCSAqIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgbWV0aG9kIHdpbGwgbm90IHJldHVybiBhbiBpbmFjY2Vzc2libGUgcHJvamVjdC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIHZhbGlkLCBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSQotCSAqIEByZXR1cm4gVGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgbW9kdWxlIHJlZmVyZW5jZWQgYnkgdGhlIG1vZHVsZSBVUkkKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRDb250YWluaW5nUHJvamVjdChVUkkgYU1vZHVsZVVSSSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlNb2R1bGVVUklVdGlsLmVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkoYU1vZHVsZVVSSSk7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGFNb2R1bGVVUkkuc2VnbWVudChNb2R1bGVVUklVdGlsLk1vZHVsZVVSSS5QUk9KRUNUX05BTUVfSU5EWCk7Ci0JCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsIHx8IHByb2plY3ROYW1lLmxlbmd0aCgpID09IDApCi0JCQl0aHJvdyBuZXcgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihhTW9kdWxlVVJJKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgRWNsaXBzZSBJUmVzb3VyY2UsIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9LiBUaGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2UjZ2V0U291cmNlUGF0aCgpfSAmbmJzcDttdXN0IHJldHVybiBhCi0JICogdmFsaWQgcmVzb3VyY2UgcGF0aCBmb3IgVGhpcyBtZXRob2QgdG8gcmV0dXJuIGEgdmFsaWQgdmFsdWUuIFRoZSByZXR1cm5lZCB2YWx1ZSBtYXkgYmUgZWl0aGVyCi0JICogYW4ge0BzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGV9Jm5ic3A7b3Ige0BzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcn0uCi0JICogQSBjbGllbnQgbWF5IHVzZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAc2VlIElSZXNvdXJjZSNnZXRUeXBlKCl9Jm5ic3A7dG8gZGV0ZXJtaW5lIHdoYXQgdHlwZQotCSAqIG9mIHJlc291cmNlIHdhcyByZXR1cm5lZC4gKEBzZWUgSVJlc291cmNlI0ZJTEV9IG9yIHtAc2VlIElSZXNvdXJjZSNGT0xERVJ9KS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlUmVzb3VyY2UKLQkgKiAgICAgICAgICAgIEEgQ29tcG9uZW50UmVzb3VyY2Ugd2l0aCBhIHZhbGlkIHNvdXJjZVBhdGgKLQkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIEVjbGlwc2UgSVJlc291cmNlLCBpZiBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0RWNsaXBzZVJlc291cmNlKENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSkgewotCQlFY2xpcHNlUmVzb3VyY2VBZGFwdGVyIGVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIgPSAoRWNsaXBzZVJlc291cmNlQWRhcHRlcikgRXh0ZW5kZWRFY29yZVV0aWwuZ2V0QWRhcHRlcihhTW9kdWxlUmVzb3VyY2UsYU1vZHVsZVJlc291cmNlLmVBZGFwdGVycygpLCBFY2xpcHNlUmVzb3VyY2VBZGFwdGVyLkFEQVBURVJfVFlQRSk7Ci0JCWlmIChlY2xpcHNlUmVzb3VyY2VBZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZWNsaXBzZVJlc291cmNlQWRhcHRlci5nZXRFY2xpcHNlUmVzb3VyY2UoKTsKLQkJZWNsaXBzZVJlc291cmNlQWRhcHRlciA9IG5ldyBFY2xpcHNlUmVzb3VyY2VBZGFwdGVyKCk7Ci0JCWFNb2R1bGVSZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQoZWNsaXBzZVJlc291cmNlQWRhcHRlcik7Ci0JCXJldHVybiBlY2xpcHNlUmVzb3VyY2VBZGFwdGVyLmdldEVjbGlwc2VSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFBhcnNlcyB0aGUgc3VwcGxpZWQgVVJJIGZvciB0aGUgZGVwbG95ZWQgbmFtZSBuYW1lIG9mIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7cmVmZXJlbmNlZAotCSAqIGJ5IHRoZSBVUkkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgVVJJCi0JICogQHJldHVybiBUaGUgZGVwbG95ZWQgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Ci0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHN1cHBsaWVkIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXBsb3llZE5hbWUoVVJJIGFGdWxseVF1YWxpZmllZE1vZHVsZVVSSSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlyZXR1cm4gTW9kdWxlVVJJVXRpbC5nZXREZXBsb3llZE5hbWUoYUZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKTsKLQl9Ci0KLQkvL3B1YmxpYyBzdGF0aWMgQ29tcG9uZW50VHlwZSBnZXRDb21wb25lbnRUeXBlKElWaXJ0dWFsQ29udGFpbmVyIGFDb21wb25lbnQpIHsKLQlwdWJsaWMgc3RhdGljIENvbXBvbmVudFR5cGUgZ2V0Q29tcG9uZW50VHlwZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCVN0cnVjdHVyZUVkaXQgY29tcG9uZW50Q29yZSA9IG51bGw7Ci0JCUNvbXBvbmVudFR5cGUgY29tcG9uZW50VHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb21wb25lbnRDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBjb21wb25lbnRDb3JlLmdldENvbXBvbmVudCgpOwotCQkJY29tcG9uZW50VHlwZSA9IHdiQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb21wb25lbnRDb3JlICE9IG51bGwpCi0JCQkJY29tcG9uZW50Q29yZS5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbXBvbmVudFR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZSBjcmVhdGVWaXJ0dWFsUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGNvbnRleHQsIFJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCkgewotCi0JCUlWaXJ0dWFsQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IG51bGw7Ci0JCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBudWxsOwotCQlVUkkgdXJpID0gcmVmZXJlbmNlZENvbXBvbmVudC5nZXRIYW5kbGUoKTsKLQkJaWYgKHVyaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWJvb2xlYW4gaXNDbGFzc1BhdGhVUkkgPSBNb2R1bGVVUklVdGlsLmlzQ2xhc3NQYXRoVVJJKHVyaSk7Ci0JCWlmKCAhaXNDbGFzc1BhdGhVUkkgKXsKLQkJCXRyeSB7IAotCQkJCXRhcmdldFByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KHVyaSk7Ci0JCQl9IGNhdGNoKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gdXVyaWUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfSAKLQkJCS8vIGlmIHRoZSBwcm9qZWN0IGNhbm5vdCBiZSByZXNvbHZlZCwgYXNzdW1lIGl0J3MgbG9jYWwgLSByZWFsbHkgaXQgcHJvYmFibHkgZGVsZXRlZCAKLQkJCQotCQkJdGFyZ2V0Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQodGFyZ2V0UHJvamVjdCk7ICAKLQkJCQkKLQotCQl9ZWxzZXsKLQkJCVN0cmluZyBhcmNoaXZlVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlhcmNoaXZlVHlwZSA9IE1vZHVsZVVSSVV0aWwuZ2V0QXJjaGl2ZVR5cGUodXJpKTsKLQkJCQlhcmNoaXZlTmFtZSA9IE1vZHVsZVVSSVV0aWwuZ2V0QXJjaGl2ZU5hbWUodXJpKTsKLQkJCQkKLQkJCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQl0YXJnZXRDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQoY29udGV4dC5nZXRQcm9qZWN0KCksIGFyY2hpdmVUeXBlICsgSVBhdGguU0VQQVJBVE9SICsgYXJjaGl2ZU5hbWUgKTsgCi0JCX0KLQkJcmV0dXJuIG5ldyBWaXJ0dWFsUmVmZXJlbmNlKGNvbnRleHQsIHRhcmdldENvbXBvbmVudCwgcmVmZXJlbmNlZENvbXBvbmVudC5nZXRSdW50aW1lUGF0aCgpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldERlcGVuZGVuY3lUeXBlKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cnVjdHVyZUVkaXQoTW9kdWxlQ29yZU5hdHVyZSBhTmF0dXJlLCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgewotCQlpZiAodG9BY2Nlc3NBc1JlYWRPbmx5KQotCQkJc3RydWN0dXJhbE1vZGVsID0gYU5hdHVyZS5nZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JSZWFkKHRoaXMpOwotCQllbHNlCi0JCQlzdHJ1Y3R1cmFsTW9kZWwgPSBhTmF0dXJlLmdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbEZvcldyaXRlKHRoaXMpOwotCQlhUHJvamVjdCA9IGFOYXR1cmUuZ2V0UHJvamVjdCgpOwotCQlpc1JlYWRPbmx5ID0gdG9BY2Nlc3NBc1JlYWRPbmx5OwotCQlpc1N0cnVjdHVyYWxNb2RlbFNlbGZNYW5hZ2VkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZm9sbG93aW5nIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gbWFuYWdlIGFuIGFscmVhZHkgbG9hZGVkIG1vZGVsLiBDbGllbnRzIHNob3VsZCB1c2UgdGhlCi0JICogZm9sbG93aW5nIGxpbmUgaWYgdGhleSBpbnRlbmQgdG8gdXNlIHRoaXMgY29uc3RydWN0b3I6IDxicj4KLQkgKiA8YnI+Ci0JICogPGNvZGU+TW9kdWxlQ29yZSBjb21wb25lbnRDb3JlID0gKE1vZHVsZUNvcmUpIGFTdHJ1Y3R1cmFsTW9kZWwuZ2V0QWRhcHRlcihNb2R1bGVDb3JlLkFEQVBURVJfVFlQRSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVN0cnVjdHVyYWxNb2RlbAotCSAqICAgICAgICAgICAgVGhlIGVkaXQgbW9kZWwgdG8gYmUgbWFuYWdlZCBieSB0aGlzIE1vZHVsZUNvcmUKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlRWRpdChNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgYVN0cnVjdHVyYWxNb2RlbCkgewotCQlzdHJ1Y3R1cmFsTW9kZWwgPSBhU3RydWN0dXJhbE1vZGVsOwotCQlhUHJvamVjdCA9IGFTdHJ1Y3R1cmFsTW9kZWwuZ2V0UHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEZvcmNlIGEgc2F2ZSBvZiB0aGUgdW5kZXJseWluZyBtb2RlbC4gVGhlIGZvbGxvd2luZyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLiBVbmxlc3MKLQkgKiByZXF1aXJlZCwgdXNlIHtAc2VlICNzYXZlSWZOZWNlc3NhcnkoSVByb2dyZXNzTW9uaXRvcikgaW5zdGVhZC4KLQkgKiA8L3A+Ci0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLklFZGl0TW9kZWxIYW5kbGVyI3NhdmUoKQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIE1vZHVsZUNvcmUgb2JqZWN0IHdhcyBjcmVhdGVkIGFzIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQlpZiAoaXNSZWFkT25seSkKLQkJCXRocm93QXR0ZW1wdGVkUmVhZE9ubHlNb2RpZmljYXRpb24oKTsKLQkJZWxzZSBpZiAodmFsaWRhdGVFZGl0KCkuaXNPSygpKSB7IAotCQkJc3luY2hyb25pemVkIChzdHJ1Y3R1cmFsTW9kZWwpIHsKLQkJCQlpZiAoIXN0cnVjdHVyYWxNb2RlbC5pc0Rpc3Bvc2VkKCkpCi0JCQkJCXN0cnVjdHVyYWxNb2RlbC5zYXZlKGFNb25pdG9yLCB0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFNhdmUgdGhlIHVuZGVybHlpbmcgbW9kZWwgb25seSBpZiBubyBvdGhlciBjbGllbnRzIGFyZSBjdXJyZW50bHkgdXNpbmcgdGhlIG1vZGVsLiBJZiB0aGUKLQkgKiBtb2RlbCBpcyBub3Qgc2hhcmVkLCBpdCB3aWxsIGJlIHNhdmVkLiBJZiBpdCBpcyBzaGFyZWQsIHRoZSBzYXZlIHdpbGwgYmUgZGVmZXJyZWQuCi0JICogPC9wPgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5JRWRpdE1vZGVsSGFuZGxlciNzYXZlSWZOZWNlc3NhcnkoKQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIE1vZHVsZUNvcmUgb2JqZWN0IHdhcyBjcmVhdGVkIGFzIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCWlmIChpc1JlYWRPbmx5KQotCQkJdGhyb3dBdHRlbXB0ZWRSZWFkT25seU1vZGlmaWNhdGlvbigpOwotCQllbHNlIGlmICh2YWxpZGF0ZUVkaXQoKS5pc09LKCkpIHsgCi0JCQkJaWYgKCFzdHJ1Y3R1cmFsTW9kZWwuaXNEaXNwb3NlZCgpKQotCQkJCQlzdHJ1Y3R1cmFsTW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KGFNb25pdG9yLCB0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENsaWVudHMgbXVzdCBjYWxsIHRoZSBmb2xsb3dpbmcgbWV0aG9kIHdoZW4gdGhleSBoYXZlIGZpbmlzaGVkIHVzaW5nIHRoZSBtb2RlbCwgZXZlbiBpZiB0aGUKLQkgKiBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIHdhcyBjcmVhdGVkIGFzIHJlYWQtb25seS4KLQkgKiA8L3A+Ci0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLklFZGl0TW9kZWxIYW5kbGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CQotCQlpZiAoaXNTdHJ1Y3R1cmFsTW9kZWxTZWxmTWFuYWdlZCAmJiBzdHJ1Y3R1cmFsTW9kZWwhPW51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoc3RydWN0dXJhbE1vZGVsKSB7Ci0JCQkJaWYgKCFzdHJ1Y3R1cmFsTW9kZWwuaXNEaXNwb3NlZCgpKQotCQkJCQlzdHJ1Y3R1cmFsTW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJCX0JCi0JCX0KLQkJaWYgKGRlcGVuZGVudENvcmVzIT1udWxsICYmIGRlcGVuZGVudENvcmVzLnNpemUoKSA+IDApIHsKLQkJCXN5bmNocm9uaXplZCAoZGVwZW5kZW50Q29yZXMpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGNvcmVzID0gZGVwZW5kZW50Q29yZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgY29yZXMuaGFzTmV4dCgpOykgewotCQkJCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSAoU3RydWN0dXJlRWRpdCkgY29yZXMubmV4dCgpOwotCQkJCQlpZiAoY29yZSAhPSBudWxsKQotCQkJCQkJY29yZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlZmF1bHQgV1RQIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbCBmaWxlIGlmIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgcHJlcGFyZVByb2plY3RDb21wb25lbnRzSWZOZWNlc3NhcnkoKSB7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHN0cnVjdHVyYWxNb2RlbCkgewotCQkJaWYgKCFzdHJ1Y3R1cmFsTW9kZWwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RydWN0dXJhbE1vZGVsLnByZXBhcmVQcm9qZWN0TW9kdWxlc0lmTmVjZXNzYXJ5KCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBXaGVuIGxvYWRlZCBmb3Igd3JpdGUsIHRoZSBjdXJyZW50IE1vZHVsZUNvcmUgbWF5IHJldHVybiB0aGUgcm9vdCBvYmplY3QsIHdoaWNoIGNhbiBiZSB1c2VkCi0JICogdG8gYWRkIG9yIHJlbW92ZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cy4gSWYgYSBjbGllbnQgbmVlZHMgdG8ganVzdCByZWFkIHRoZSBleGlzdGluZwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1zLCB1c2Uge0BzZWUgI2dldFdvcmtiZW5jaE1vZHVsZXMoKX0uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0JICovCi0JcHVibGljIFByb2plY3RDb21wb25lbnRzIGdldENvbXBvbmVudE1vZGVsUm9vdCgpIHsKLQkJUHJvamVjdENvbXBvbmVudHMgY29tcHMgPSBudWxsOwotCQlJTG9jayBsb2NrID0gRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmdldFByb2plY3RMb2NrT2JqZWN0KHN0cnVjdHVyYWxNb2RlbC5nZXRQcm9qZWN0KCkpOwotCQl0cnl7Ci0JCQlpZihudWxsICE9IGxvY2spewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJfQotCQkJc3luY2hyb25pemVkKHN0cnVjdHVyYWxNb2RlbCl7Ci0JCQkJaWYgKCFzdHJ1Y3R1cmFsTW9kZWwuaXNEaXNwb3NlZCgpKQotCQkJCQljb21wcyA9IChQcm9qZWN0Q29tcG9uZW50cykgc3RydWN0dXJhbE1vZGVsLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCQl9Ci0JCX0gZmluYWxseXsKLQkJCWlmKG51bGwgIT0gbG9jayl7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBjb21wczsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm4gdGhlIGFuIGFycmF5IG9mIENvbXBvbmVudFJlc291cmNlIHdoaWNoIGJhc2ljYWxseSByZXByZXNlbnQgdGhlIHNvdXJjZSBjb250YWluZXJzIG9mIGEKLQkgKiBXb3JrYmVuY2hSZXNvdXJjZS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGdldFNvdXJjZUNvbnRhaW5lcnMoV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQkvLyBUT0RPIEFwaSBpbiBwcm9ncmVzczogTmVlZCB0byByZXR1cm4gdGhlIEphdmEgU291cmNlIGNvbnRhaW5lcnMgb2YgdGhlIHByb2plY3QKLQkJLy8gVE9ETyBNREU6IEkgZG9uJ3Qga25vdyBpZiBJIGFncmVlIHdpdGggdGhlIHBsYWNlbWVudCBvZiB0aGlzIG1ldGhvZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ2xpZW50cyB0aGF0IHdpc2ggdG8gbW9kaWZ5IHRoZSBpbmRpdmlkdWFsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtpbnN0YW5jZXMgbWF5IHVzZQotCSAqIHRoaXMgbWV0aG9kLiBJZiBjbGllbnRzIG5lZWQgdG8gYWRkIG9yIHJlbW92ZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7aW5zdGFuY2VzLCB1c2UKLQkgKiB7QHNlZSAjZ2V0UHJvamVjdE1vZHVsZXMoKX0mbmJzcDt0byBnZXQgdGhlIHJvb3Qgb2JqZWN0IGFuZCB0aGVuIGFjY2VzcyB0aGUgY29udGFpbmVkCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXMgdGhyb3VnaCB7QHNlZSBQcm9qZWN0Q29tcG9uZW50cyNnZXRXb3JrYmVuY2hNb2R1bGVzKCl9LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIFdvcmtiZW5jaE1vZHVsZXMgb2YgdGhlIHVuZGVybHlpbmcgbW9kZWwsIGlmIGFueS4KLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50W10gZ2V0V29ya2JlbmNoTW9kdWxlcygpIHsKLQkJUHJvamVjdENvbXBvbmVudHMgcGMgPSBnZXRDb21wb25lbnRNb2RlbFJvb3QoKTsKLQkJaWYocGMgIT0gbnVsbCkgewotCQkJTGlzdCB3Yk1vZHVsZXMgPSBwYy5nZXRDb21wb25lbnRzKCk7Ci0JCQlyZXR1cm4gKFdvcmtiZW5jaENvbXBvbmVudFtdKSB3Yk1vZHVsZXMudG9BcnJheShuZXcgV29ya2JlbmNoQ29tcG9uZW50W3diTW9kdWxlcy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gTk9fQ09NUE9ORU5UUzsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCB0aGUgZ2l2ZW4gZGVwbG95ZWQgbmFtZS4gVGhlIHJldHVybmVkIG1vZHVsZQotCSAqIHdpbGwgYmUgY29udGFpbmVkIGJ5IHRoZSByb290IG9iamVjdCBvZiB0aGUgY3VycmVudCBNb2R1bGVDb3JlIChzbyBubyBuZWVkIHRvIHJlLWFkZCBpdCB0bwotCSAqIHRoZSBNb2R1bGUgTW9kdWxlIHJvb3Qgb2JqZWN0KS4gVGhlIGN1cnJlbnQgTW9kdWxlQ29yZSBtdXN0IG5vdCBiZSByZWFkLW9ubHkgdG8gaW52b2tlIFRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhRGVwbG95TmFtZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBTdHJpbmcgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIGFzIHRoZSBkZXBsb3llZC1uYW1lCi0JICogQHJldHVybiBBIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1hc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3aXRoIHRoZSBzdXBwbGllZAotCSAqICAgICAgICAgZGVwbG95ZWQgbmFtZQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3YXMgY3JlYXRlZCBhcyByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGNyZWF0ZVdvcmtiZW5jaE1vZHVsZShTdHJpbmcgYURlcGxveU5hbWUpIHsKLQkJaWYgKGlzUmVhZE9ubHkpCi0JCQl0aHJvd0F0dGVtcHRlZFJlYWRPbmx5TW9kaWZpY2F0aW9uKCk7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBDT01QT05FTlRfRkFDVE9SWS5jcmVhdGVXb3JrYmVuY2hDb21wb25lbnQoKTsKLQkJbW9kdWxlLnNldE5hbWUoYURlcGxveU5hbWUpOwotCQlnZXRDb21wb25lbnRNb2RlbFJvb3QoKS5nZXRDb21wb25lbnRzKCkuYWRkKG1vZHVsZSk7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGEge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Jm5ic3A7d2l0aCB0aGUgc291cmNlUGF0aCBvZiBhUmVzb3VyY2UuIFRoZSBjdXJyZW50Ci0JICogTW9kdWxlQ29yZSBtdXN0IG5vdCBiZSByZWFkLW9ubHkgdG8gaW52b2tlIFRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9dG8gY29udGFpbiB0aGUgY3JlYXRlZAotCSAqICAgICAgICAgICAge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Ci0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBJUmVzb3VyY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZSBzb3VyY2VQYXRoCi0JICogQHJldHVybiBBIHtAc2VlIENvbXBvbmVudFJlc291cmNlfWFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBNb2R1bGVDb3JlIHdpdGggaXRzIHNvdXJjZVBhdGgKLQkgKiAgICAgICAgIGVxdWl2YWxlbnQgdG8gYVJlc291cmNlCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgY3VycmVudCBNb2R1bGVDb3JlIHdhcyBjcmVhdGVkIGFzIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZSBjcmVhdGVXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZShJUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChpc1JlYWRPbmx5KQotCQkJdGhyb3dBdHRlbXB0ZWRSZWFkT25seU1vZGlmaWNhdGlvbigpOwotCi0JCUNvbXBvbmVudFJlc291cmNlIG1vZHVsZVJlc291cmNlID0gQ09NUE9ORU5UX0ZBQ1RPUlkuY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoKTsgCi0JCW1vZHVsZVJlc291cmNlLnNldFNvdXJjZVBhdGgoYVJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5tYWtlQWJzb2x1dGUoKSk7Ci0JCXJldHVybiBtb2R1bGVSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYSB7QHNlZSBDb21wb25lbnRUeXBlfSZuYnNwO3dpdGggdGhlIHNvdXJjZVBhdGggb2YgYVJlc291cmNlLiBUaGUgcmV0dXJuZWQgcmVzb3VyY2UKLQkgKiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBNb2R1bGVDb3JlLiBUaGUgY3VycmVudCBNb2R1bGVDb3JlIG11c3Qgbm90IGJlIHJlYWQtb25seQotCSAqIHRvIGludm9rZSBUaGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBJUmVzb3VyY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZSBzb3VyY2VQYXRoCi0JICogQHJldHVybiBBIHtAc2VlIENvbXBvbmVudFJlc291cmNlfWFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBNb2R1bGVDb3JlIHdpdGggaXRzIHNvdXJjZVBhdGgKLQkgKiAgICAgICAgIGVxdWl2YWxlbnQgdG8gYVJlc291cmNlCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgY3VycmVudCBNb2R1bGVDb3JlIHdhcyBjcmVhdGVkIGFzIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyBDb21wb25lbnRUeXBlIGNyZWF0ZU1vZHVsZVR5cGUoU3RyaW5nIGFNb2R1bGVUeXBlSWQpIHsKLQkJaWYgKGlzUmVhZE9ubHkpCi0JCQl0aHJvd0F0dGVtcHRlZFJlYWRPbmx5TW9kaWZpY2F0aW9uKCk7Ci0KLQkJQ29tcG9uZW50VHlwZSBtb2R1bGVUeXBlID0gQ09NUE9ORU5UX0ZBQ1RPUlkuY3JlYXRlQ29tcG9uZW50VHlwZSgpOwotCQltb2R1bGVUeXBlLnNldENvbXBvbmVudFR5cGVJZChhTW9kdWxlVHlwZUlkKTsKLQkJcmV0dXJuIG1vZHVsZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogU2VhcmNoIHRoZSBnaXZlbiBtb2R1bGUgKGluZGljYXRlZCBieSBhTW9kdWxlVVJJKSBmb3IgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfXMKLQkgKiBpZGVudGlmaWVkIGJ5IHRoZSBtb2R1bGUtcmVsYXRpdmUgcGF0aCAoaW5kaWNhdGVkIGJ5IGFEZXBsb3llZFJlc291cmNlUGF0aCkuCi0JICogPC9wPgotCSAqIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgYXQgbmV4dCBJbnRlZ3JhdGlvbiBCdWlsZCAwNC8xNC8wNSBNREUuIE5vIHN1YnN0aXR1dGUuIChObyBjbGllbnRzKS4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkKLQkgKiBAcGFyYW0gYURlcGxveWVkUmVzb3VyY2VQYXRoCi0JICogICAgICAgICAgICBBIG1vZHVsZS1yZWxhdGl2ZSBwYXRoIHRvIGEgZGVwbG95ZWQgZmlsZQotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIHRoYXQgY29udGFpbiB0aGUgVVJJIHNwZWNpZmllZCBieSB0aGUKLQkgKiAgICAgICAgIG1vZHVsZS1yZWxhdGl2ZSBhRGVwbG95ZWRSZXNvdXJjZVBhdGgKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoVVJJIGFNb2R1bGVVUkksIFVSSSBhRGVwbG95ZWRSZXNvdXJjZVBhdGgpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IGdldENvbXBvbmVudCgpOwotCQlyZXR1cm4gbW9kdWxlLmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKGFEZXBsb3llZFJlc291cmNlUGF0aC5wYXRoKCkpKTsKLQl9IAotCi0JLyoqCi0JICogPHA+Ci0JICogU2VhcmNoIHRoZSB0aGUgbW9kdWxlIChpbmRpY2F0ZWQgYnkgdGhlIHJvb3Qgb2YgYU1vZHVsZVJlc291cmNlUGF0aCkgZm9yIHRoZQotCSAqIHtAc2VlIENvbXBvbmVudFJlc291cmNlfXMgaWRlbnRpZmllZCBieSB0aGUgbW9kdWxlLXF1YWxpZmllZCBwYXRoIChpbmRpY2F0ZWQgYnkKLQkgKiBhRGVwbG95ZWRSZXNvdXJjZVBhdGgpLgotCSAqIDwvcD4KLQkgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGF0IG5leHQgSW50ZWdyYXRpb24gQnVpbGQgMDQvMTQvMDUgTURFIFVzZSBJUGF0aCBTaWduYXR1cmUgaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVJlc291cmNlUGF0aAotCSAqICAgICAgICAgICAgQSB2YWxpZCBmdWxseS1xdWFsaWZpZWQgVVJJIG9mIGEgZGVwbG95ZWQgcmVzb3VyY2Ugd2l0aGluIGEgc3BlY2lmaWMKLQkgKiAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudAotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIHRoYXQgY29udGFpbiB0aGUgVVJJIHNwZWNpZmllZCBieQotCSAqICAgICAgICAgYU1vZHVsZVJlc291cmNlUGF0aAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50UmVzb3VyY2VbXSBmaW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChVUkkgYU1vZHVsZVJlc291cmNlUGF0aCkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCi0JCVVSSSBkZXBsb3llZFVSSSA9IE1vZHVsZVVSSVV0aWwudHJpbVRvRGVwbG95UGF0aFNlZ21lbnQoYU1vZHVsZVJlc291cmNlUGF0aCk7Ci0JCUlQYXRoIGRlcGxveWVkUGF0aCA9IG5ldyBQYXRoKGRlcGxveWVkVVJJLnBhdGgoKSk7Ci0JCXJldHVybiBmaW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChNb2R1bGVVUklVdGlsLmdldERlcGxveWVkTmFtZShhTW9kdWxlUmVzb3VyY2VQYXRoKSwgZGVwbG95ZWRQYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogU2VhcmNoIHRoZSB0aGUgbW9kdWxlIChpbmRpY2F0ZWQgYnkgdGhlIHJvb3Qgb2YgYU1vZHVsZVJlc291cmNlUGF0aCkgZm9yIHRoZQotCSAqIHtAc2VlIENvbXBvbmVudFJlc291cmNlfXMgaWRlbnRpZmllZCBieSB0aGUgbW9kdWxlLXF1YWxpZmllZCBwYXRoIChpbmRpY2F0ZWQgYnkKLQkgKiBhRGVwbG95ZWRSZXNvdXJjZVBhdGgpLgotCSAqIDwvcD4gCi0JICogCi0JICogQHBhcmFtIGFNb2R1bGVSZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgZnVsbHktcXVhbGlmaWVkIFVSSSBvZiBhIGRlcGxveWVkIHJlc291cmNlIHdpdGhpbiBhIHNwZWNpZmljCi0JICogICAgICAgICAgICBXb3JrYmVuY2hDb21wb25lbnQKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdvcmtiZW5jaE1vZHVsZVJlc291cmNlcyB0aGF0IGNvbnRhaW4gdGhlIFVSSSBzcGVjaWZpZWQgYnkKLQkgKiAgICAgICAgIGFNb2R1bGVSZXNvdXJjZVBhdGgKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoU3RyaW5nIGFNb2R1bGVOYW1lLCBJUGF0aCBhTW9kdWxlUmVzb3VyY2VQYXRoKSB7ICAgCi0JCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBnZXRDb21wb25lbnQoKTsKLQkJcmV0dXJuIG1vZHVsZS5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChhTW9kdWxlUmVzb3VyY2VQYXRoKTsKLQl9Ci0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChVUkkgYVdvcmtzcGFjZVJlbGF0aXZlUGF0aCkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlyZXR1cm4gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChhV29ya3NwYWNlUmVsYXRpdmVQYXRoLFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCX0KLQkvKioKLQkgKiA8cD4KLQkgKiBMb2NhdGVzIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1zIHRoYXQgY29udGFpbiB0aGUgc3VwcGxpZWQgcmVzb3VyY2UgaW4gdGhlaXIgc291cmNlCi0JICogcGF0aC4gVGhlcmUgYXJlIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgY29udGFpbm1lbnQgb2YgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfXMKLQkgKiB3aGljaCBhcmUgcmV0dXJuZWQuIFRoZSBvbmx5IGd1YXJhbnRlZSBpcyB0aGF0IHRoZSByZXR1cm5lZCBlbGVtZW50cyBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGUKLQkgKiBzYW1lIHByb2plY3QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBzb3VyY2VQYXRoIG9mIGVhY2gge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Jm5ic3A7d2lsbCBiZSBtYXBwZWQgdG8gZWl0aGVyIGFuIElGaWxlIG9yIGFuCi0JICogSUZvbGRlci4gQXMgYSByZXN1bHQsIGlmIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX0mbmJzcDtpcyBhIGNvbnRhaW5lciBtYXBwaW5nLCB0aGUgcGF0aAotCSAqIG9mIHRoZSBzdXBwbGllZCByZXNvdXJjZSBtYXkgbm90IGJlIGlkZW50aWNhbCB0aGUgc291cmNlUGF0aCBvZiB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9LgotCSAqIDwvcD4KLQkgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGF0IG5leHQgSW50ZWdyYXRpb24gQnVpbGQgMDQvMTQvMDUgTURFIFVzZSBJUGF0aCBTaWduYXR1cmUgaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gYVdvcmtzcGFjZVJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgQSB2YWxpZCBmdWxseS1xdWFsaWZpZWQgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGggb2YgYSBnaXZlbiByZXNvdXJjZQotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIHdoaWNoIGhhdmUgc291cmNlUGF0aHMgdGhhdCBjb250YWluIHRoZSBnaXZlbgotCSAqICAgICAgICAgcmVzb3VyY2UKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChVUkkgYVdvcmtzcGFjZVJlbGF0aXZlUGF0aCwgaW50IHJlc291cmNlRmxhZykgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlyZXR1cm4gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChuZXcgUGF0aChhV29ya3NwYWNlUmVsYXRpdmVQYXRoLnBhdGgoKSkscmVzb3VyY2VGbGFnKTsKLQl9CQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoSVBhdGggYVByb2plY3RSZWxhdGl2ZVBhdGgpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoYVByb2plY3RSZWxhdGl2ZVBhdGgsUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7Ci0JfQotCS8qKgotCSAqIDxwPgotCSAqIExvY2F0ZXMgdGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1zIHRoYXQgY29udGFpbnMgdGhlIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIHNvdXJjZQotCSAqIHBhdGguIFRoZXJlIGFyZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIGNvbnRhaW5tZW50IG9mIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1zCi0JICogd2hpY2ggYXJlIHJldHVybmVkLiBUaGUgb25seSBndWFyYW50ZWUgaXMgdGhhdCB0aGUgcmV0dXJuZWQgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogc2FtZSBwcm9qZWN0LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgc291cmNlUGF0aCBvZiBlYWNoIHtAc2VlIENvbXBvbmVudFJlc291cmNlfSZuYnNwO3dpbGwgYmUgbWFwcGVkIHRvIGVpdGhlciBhbiBJRmlsZSBvciBhbgotCSAqIElGb2xkZXIuIEFzIGEgcmVzdWx0LCBpZiB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Jm5ic3A7aXMgYSBjb250YWluZXIgbWFwcGluZywgdGhlIHBhdGgKLQkgKiBvZiB0aGUgc3VwcGxpZWQgcmVzb3VyY2UgbWF5IG5vdCBiZSBpZGVudGljYWwgdGhlIHNvdXJjZVBhdGggb2YgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfS4KLQkgKiA8L3A+IAotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdFJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgQSB2YWxpZCBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgYSBnaXZlbiByZXNvdXJjZQotCSAqICAgICAgICByZXNvdXJjZUZsYWcKLQkgKiAgICAgICAgCSAgQSBiaXQgZmxhZyB0aGF0IGRldGVybWluZXMgaWYgUmVzb3VyY2VzIHNob3VsZCBiZSBjcmVhdGVkIGR1cmluZyB0aGUgc2VhcmNoCi0JICogICAgICAgIAkJQ1JFQVRFX05PTkUgCi0JICogCQkJCUNSRUFURV9SRVNPVVJDRV9BTFdBWVMKLQkgKiAJCQkJQ1JFQVRFX1RSRUVOT0RFX0lGTkVDCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZXMgd2hpY2ggaGF2ZSBzb3VyY2VQYXRocyB0aGF0IGNvbnRhaW4gdGhlIGdpdmVuCi0JICogICAgICAgICByZXNvdXJjZQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGZpbmRDb21wb25lbnQoSVBhdGggYVByb2plY3RSZWxhdGl2ZVJlc291cmNlUGF0aCwgaW50IHJlc291cmNlRmxhZykgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlQcm9qZWN0Q29tcG9uZW50cyBwcm9qZWN0TW9kdWxlcyA9IGdldENvbXBvbmVudE1vZGVsUm9vdCgpOwotCQlpZiAocHJvamVjdE1vZHVsZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUVMaXN0IG1vZHVsZXMgPSBwcm9qZWN0TW9kdWxlcy5nZXRDb21wb25lbnRzKCk7Ci0KLQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IG51bGw7Ci0JCWJvb2xlYW4gcmVzb3VyY2VFeGlzdHMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQltb2R1bGUgPSAoV29ya2JlbmNoQ29tcG9uZW50KSBtb2R1bGVzLmdldChpKTsKLQkJCXJlc291cmNlRXhpc3RzID0gbW9kdWxlLmV4aXN0cyhhUHJvamVjdFJlbGF0aXZlUmVzb3VyY2VQYXRoLHJlc291cmNlRmxhZyk7Ci0JCQlpZiAoIXJlc291cmNlRXhpc3RzICYmIGFQcm9qZWN0UmVsYXRpdmVSZXNvdXJjZVBhdGguc2VnbWVudHMoKS5sZW5ndGggPiAxKSB7IAotCQkJCXJlc291cmNlRXhpc3RzID0gbW9kdWxlLmV4aXN0cyhhUHJvamVjdFJlbGF0aXZlUmVzb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkscmVzb3VyY2VGbGFnKTsKLQkJCX0KLQkJaWYgKHJlc291cmNlRXhpc3RzKQotCQkJcmV0dXJuIG1vZHVsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogPHA+Ci0JICogTG9jYXRlcyB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9cyB0aGF0IGNvbnRhaW4gdGhlIHN1cHBsaWVkIHJlc291cmNlIGluIHRoZWlyIHNvdXJjZQotCSAqIHBhdGguIFRoZXJlIGFyZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIGNvbnRhaW5tZW50IG9mIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1zCi0JICogd2hpY2ggYXJlIHJldHVybmVkLiBUaGUgb25seSBndWFyYW50ZWUgaXMgdGhhdCB0aGUgcmV0dXJuZWQgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogc2FtZSBwcm9qZWN0LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgc291cmNlUGF0aCBvZiBlYWNoIHtAc2VlIENvbXBvbmVudFJlc291cmNlfSZuYnNwO3dpbGwgYmUgbWFwcGVkIHRvIGVpdGhlciBhbiBJRmlsZSBvciBhbgotCSAqIElGb2xkZXIuIEFzIGEgcmVzdWx0LCBpZiB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Jm5ic3A7aXMgYSBjb250YWluZXIgbWFwcGluZywgdGhlIHBhdGgKLQkgKiBvZiB0aGUgc3VwcGxpZWQgcmVzb3VyY2UgbWF5IG5vdCBiZSBpZGVudGljYWwgdGhlIHNvdXJjZVBhdGggb2YgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfS4KLQkgKiA8L3A+IAotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdFJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgQSB2YWxpZCBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgYSBnaXZlbiByZXNvdXJjZQotCSAqICAgICAgICAgcmVzb3VyY2VGbGFnCi0JICogICAgICAgIAkgIEEgYml0IGZsYWcgdGhhdCBkZXRlcm1pbmVzIGlmIFJlc291cmNlcyBzaG91bGQgYmUgY3JlYXRlZCBkdXJpbmcgdGhlIHNlYXJjaAotCSAqICAgICAgICAJCUNSRUFURV9OT05FIAotCSAqIAkJCQlDUkVBVEVfUkVTT1VSQ0VfQUxXQVlTCi0JICogCQkJCUNSRUFURV9UUkVFTk9ERV9JRk5FQwotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIHdoaWNoIGhhdmUgc291cmNlUGF0aHMgdGhhdCBjb250YWluIHRoZSBnaXZlbgotCSAqICAgICAgICAgcmVzb3VyY2UKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChJUGF0aCBhUHJvamVjdFJlbGF0aXZlUGF0aCwgaW50IHJlc291cmNlRmxhZykgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlQcm9qZWN0Q29tcG9uZW50cyBwcm9qZWN0TW9kdWxlcyA9IGdldENvbXBvbmVudE1vZGVsUm9vdCgpOwotCQlpZiAocHJvamVjdE1vZHVsZXM9PW51bGwpCi0JCQlyZXR1cm4gTk9fUkVTT1VSQ0VTOwotCQlFTGlzdCBtb2R1bGVzID0gcHJvamVjdE1vZHVsZXMuZ2V0Q29tcG9uZW50cygpOwotCi0JCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBudWxsOwotCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0JCUxpc3QgZm91bmRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJbW9kdWxlID0gKFdvcmtiZW5jaENvbXBvbmVudCkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlyZXNvdXJjZXMgPSBtb2R1bGUuZmluZFJlc291cmNlc0J5U291cmNlUGF0aChhUHJvamVjdFJlbGF0aXZlUGF0aCxyZXNvdXJjZUZsYWcpOwotCQkJaWYgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlcy5sZW5ndGggIT0gMCkKLQkJCQlmb3VuZFJlc291cmNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZXNvdXJjZXMpKTsKLQkJCWVsc2UgaWYgKGFQcm9qZWN0UmVsYXRpdmVQYXRoLnNlZ21lbnRzKCkubGVuZ3RoID4gMSkgeyAKLQkJCQlyZXNvdXJjZXMgPSBtb2R1bGUuZmluZFJlc291cmNlc0J5U291cmNlUGF0aChhUHJvamVjdFJlbGF0aXZlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLHJlc291cmNlRmxhZyk7Ci0JCQkJaWYgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlcy5sZW5ndGggIT0gMCkKLQkJCQkJZm91bmRSZXNvdXJjZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVzb3VyY2VzKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZvdW5kUmVzb3VyY2VzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKENvbXBvbmVudFJlc291cmNlW10pIGZvdW5kUmVzb3VyY2VzLnRvQXJyYXkobmV3IENvbXBvbmVudFJlc291cmNlW2ZvdW5kUmVzb3VyY2VzLnNpemUoKV0pOwotCQlyZXR1cm4gTk9fUkVTT1VSQ0VTOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtjb250YWluZWQgYnkgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3aXRoIHRoZQotCSAqIGRlcGxveSBuYW1lIGFNb2R1bGVOYW1lLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVOYW1lCi0JICogQHJldHVybiBUaGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fWNvbnRhaW5lZCBieSB0aGUgY3VycmVudCBNb2R1bGVDb3JlIHdpdGggdGhlIGRlcGxveQotCSAqICAgICAgICAgbmFtZSBhTW9kdWxlTmFtZQotCSAqIEBzZWUgV29ya2JlbmNoQ29tcG9uZW50I2dldERlcGxveWVkTmFtZSgpCi0JICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0Q29tcG9uZW50KCkgLSBPbmx5IG9uZSBjb21wb25lbnQgcGVyIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGZpbmRDb21wb25lbnRCeU5hbWUoU3RyaW5nIGFNb2R1bGVOYW1lKSB7Ci0JCXJldHVybiBnZXRDb21wb25lbnRNb2RlbFJvb3QoKSAhPSBudWxsID8gZ2V0Q29tcG9uZW50TW9kZWxSb290KCkuZmluZFdvcmtiZW5jaE1vZHVsZShhTW9kdWxlTmFtZSkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIExvY2F0ZSBhbmQgcmV0dXJuIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7cmVmZXJlbmNlZCBieSB0aGUgZnVsbHktcXVhbGlmaWVkCi0JICogYU1vZHVsZVVSSS4gVGhlIG1ldGhvZCB3aWxsIHdvcmsgY29ycmVjdGx5IGV2ZW4gaWYgdGhlIHJlcXVlc3RlZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Ci0JICogJm5ic3A7aXMgY29udGFpbmVkIGJ5IGFub3RoZXIgcHJvamVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgVVJJCi0JICogQHJldHVybiBUaGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXJlZmVyZW5jZWQgYnkgYU1vZHVsZVVSSQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKiBAc2VlIFdvcmtiZW5jaENvbXBvbmVudCNnZXRIYW5kbGUoKQotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgZmluZENvbXBvbmVudEJ5VVJJKFVSSSBhTW9kdWxlVVJJKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCWlmIChhTW9kdWxlVVJJID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYoYU1vZHVsZVVSSS5zY2hlbWUoKSA9PSBudWxsICYmIGFNb2R1bGVVUkkuc2VnbWVudENvdW50KCkgPT0gMSkKLQkJCXJldHVybiBnZXRDb21wb25lbnQoKTsKLQkJTW9kdWxlVVJJVXRpbC5lbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkkpOwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBhTW9kdWxlVVJJLnNlZ21lbnQoTW9kdWxlVVJJVXRpbC5Nb2R1bGVVUkkuUFJPSkVDVF9OQU1FX0lORFgpOwotCQkvKiBBY2Nlc3NpbmcgYSBsb2NhbCBtb2R1bGUgKi8KLQkJaWYgKGdldFByb2plY3QoKSE9bnVsbCAmJiBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpCi0JCQlyZXR1cm4gZ2V0Q29tcG9uZW50KCk7Ci0JCVN0cnVjdHVyZUVkaXQgZGVwZW5kZW50Q29yZSA9IGdldERlcGVuZGVudE1vZHVsZUNvcmUoYU1vZHVsZVVSSSk7Ci0JCWlmIChkZXBlbmRlbnRDb3JlICE9IG51bGwpCi0JCQlyZXR1cm4gZGVwZW5kZW50Q29yZS5nZXRDb21wb25lbnQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogU2VhcmNoZXMgdGhlIGF2YWlsYWJsZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cyBhcyBhdmFpbGFibGUgdGhyb3VnaAotCSAqIHtAc2VlICNnZXRXb3JrYmVuY2hNb2R1bGVzKCl9Jm5ic3A7Zm9yIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1zIHRoYXQgaGF2ZSBhCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50I2dldE1vZHVsZVR5cGUoKX13aXRoIGEgYSBtb2R1bGUgdHlwZSBJZCBhcyBzcGVjaWZpZWQgYnkKLQkgKiBhTW9kdWxlVHlwZUlkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVR5cGVJZAotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBtb2R1bGUgdHlwZSBpZCAoe0BzZWUgQ29tcG9uZW50VHlwZSNnZXRNb2R1bGVUeXBlSWQoKX0pCi0JICogQHJldHVybiBBIG5vbi1udWxsIGFycmF5IG9mIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBtb2R1bGUgdHlwZQotCSAqICAgICAgICAgaWQKLQkgKi8KLS8vCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnRbXSBmaW5kQ29tcG9uZW50c0J5VHlwZShTdHJpbmcgYU1vZHVsZVR5cGVJZCkgewotLy8JCVdvcmtiZW5jaENvbXBvbmVudFtdIGF2YWlsYWJsZU1vZHVsZXMgPSBnZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0vLwkJQ29tcG9uZW50VHlwZSBtb2R1bGVUeXBlOwotLy8JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZU1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJbW9kdWxlVHlwZSA9IGF2YWlsYWJsZU1vZHVsZXNbaV0uZ2V0Q29tcG9uZW50VHlwZSgpOwotLy8JCQlpZiAobW9kdWxlVHlwZSAhPSBudWxsICYmIGFNb2R1bGVUeXBlSWQuZXF1YWxzKG1vZHVsZVR5cGUuZ2V0Q29tcG9uZW50VHlwZUlkKCkpKQotLy8JCQkJcmVzdWx0cy5hZGQoYXZhaWxhYmxlTW9kdWxlc1tpXSk7Ci0vLwkJfQotLy8JCWlmIChyZXN1bHRzLnNpemUoKSA9PSAwKQotLy8JCQlyZXR1cm4gTk9fTU9EVUxFUzsKLS8vCQlyZXR1cm4gKFdvcmtiZW5jaENvbXBvbmVudFtdKSByZXN1bHRzLnRvQXJyYXkobmV3IFdvcmtiZW5jaENvbXBvbmVudFtyZXN1bHRzLnNpemUoKV0pOwotLy8JfQotCQotCS8qKgotCSAqIEZpbmQgYW5kIHJldHVybiB0aGUgUmVmZXJlbmNlZENvbXBvbmVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGRlcGVkZW5jeSBmcm9tIGFDb21wb25lbnQgdG8gYVJlZmVyZW5jZWRDb21wb25lbnQuCi0JICogPHA+VGhpcyBtZXRob2QgY291bGQgcmV0dXJuIG51bGwuPC9wPgotCSAqIEBwYXJhbSBhQ29tcG9uZW50Ci0JICogQHBhcmFtIGFSZWZlcmVuY2VkQ29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZWZlcmVuY2VkQ29tcG9uZW50IGZpbmRSZWZlcmVuY2VkQ29tcG9uZW50KFdvcmtiZW5jaENvbXBvbmVudCBhQ29tcG9uZW50LCBXb3JrYmVuY2hDb21wb25lbnQgYVJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJaWYoYUNvbXBvbmVudCA9PSBudWxsIHx8IGFSZWZlcmVuY2VkQ29tcG9uZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlQcm9qZWN0IHJlZmVyZW5jZWRQcm9qZWN0ID0gZ2V0Q29udGFpbmluZ1Byb2plY3QoYVJlZmVyZW5jZWRDb21wb25lbnQpOwotCQlFTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IGFDb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQkJU3RyaW5nIGRlcGVuZGVudFByb2plY3ROYW1lID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZENvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSAoUmVmZXJlbmNlZENvbXBvbmVudCkgaXRlci5uZXh0KCk7Ci0JCQlkZXBlbmRlbnRQcm9qZWN0TmFtZSA9IHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0SGFuZGxlKCkuc2VnbWVudChNb2R1bGVVUklVdGlsLk1vZHVsZVVSSS5QUk9KRUNUX05BTUVfSU5EWCk7Ci0JCQlpZihyZWZlcmVuY2VkUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKGRlcGVuZGVudFByb2plY3ROYW1lKSkgCi0JCQkJcmV0dXJuIHJlZmVyZW5jZWRDb21wb25lbnQ7CQkJCi0JCQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHtAc2VlIFJlZmVyZW5jZWRDb21wb25lbnR9Jm5ic3A7cmVmZXJlbmNlcyBhIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0oCi0JICoge0BzZWUgUmVmZXJlbmNlZENvbXBvbmVudCNnZXRIYW5kbGUoKX0pIHdoaWNoIGlzIGNvbnRhaW5lZCBieSB0aGUgcHJvamVjdCB0aGF0IHRoZSBjdXJyZW50Ci0JICogTW9kdWxlQ29yZSBpcyBtYW5hZ2luZy4gVGhlIGZvbGxvd2luZyBtZXRob2Qgd2lsbCBkZXRlcm1pbmUgaWYgdGhlIGRlcGVuZGVuY3kgY2FuIGJlCi0JICogc2F0aXNmaWVkIGJ5IHRoZSBjdXJyZW50IHByb2plY3QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhRGVwZW5kZW50TW9kdWxlCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSB7QHNlZSBSZWZlcmVuY2VkQ29tcG9uZW50fXJlZmVyZW5jZXMgYSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9bWFuYWdlZAotCSAqICAgICAgICAgZGlyZWN0bHkgYnkgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTG9jYWxEZXBlbmRlbmN5KFJlZmVyZW5jZWRDb21wb25lbnQgYURlcGVuZGVudE1vZHVsZSkgewotCQlpZiAoYURlcGVuZGVudE1vZHVsZSA9PSBudWxsIHx8IGFEZXBlbmRlbnRNb2R1bGUuZ2V0SGFuZGxlKCk9PW51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVVSSSBkZXBlbmRlbnRIYW5kbGUgPSBhRGVwZW5kZW50TW9kdWxlLmdldEhhbmRsZSgpOwotCQkvLyB3aXRoIG5vIHNjaGVtZSBhbmQgYSBzaW1wbGUgbmFtZSwgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50IG11c3QgYmUgbG9jYWwKLQkJaWYoZGVwZW5kZW50SGFuZGxlLnNjaGVtZSgpID09IG51bGwgJiYgZGVwZW5kZW50SGFuZGxlLnNlZ21lbnRDb3VudCgpID09IDEpICAKLQkJCXJldHVybiB0cnVlOyAKLQkJdHJ5IHsKLQotCQkJU3RyaW5nIGxvY2FsUHJvamVjdE5hbWUgPSBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkJaWYoTW9kdWxlVVJJVXRpbC5lbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGRlcGVuZGVudEhhbmRsZSwgZmFsc2UpKSB7Ci0JCQkJU3RyaW5nIGRlcGVuZGVudFByb2plY3ROYW1lID0gYURlcGVuZGVudE1vZHVsZS5nZXRIYW5kbGUoKS5zZWdtZW50KE1vZHVsZVVSSVV0aWwuTW9kdWxlVVJJLlBST0pFQ1RfTkFNRV9JTkRYKTsKLQkJCQlyZXR1cm4gbG9jYWxQcm9qZWN0TmFtZS5lcXVhbHMoZGVwZW5kZW50UHJvamVjdE5hbWUpOwotCQkJfQotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkKLQkgKiBAcmV0dXJuIFRoZSBNb2R1bGVDb3JlIGZhY2FkZSBmb3IgdGhlIHN1cHBsaWVkIFVSSQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZUVkaXQgZ2V0RGVwZW5kZW50TW9kdWxlQ29yZShVUkkgYU1vZHVsZVVSSSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlTdHJ1Y3R1cmVFZGl0IGRlcGVuZGVudENvcmUgPSAoU3RydWN0dXJlRWRpdCkgZGVwZW5kZW50Q29yZXMuZ2V0KGFNb2R1bGVVUkkpOwotCQlpZiAoZGVwZW5kZW50Q29yZSAhPSBudWxsKQotCQkJcmV0dXJuIGRlcGVuZGVudENvcmU7Ci0JCXN5bmNocm9uaXplZCAoZGVwZW5kZW50Q29yZXMpIHsKLQkJCWRlcGVuZGVudENvcmUgPSAoU3RydWN0dXJlRWRpdCkgZGVwZW5kZW50Q29yZXMuZ2V0KGFNb2R1bGVVUkkpOwotCQkJaWYgKGRlcGVuZGVudENvcmUgPT0gbnVsbCkgewotCQkJCUlQcm9qZWN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5pbmdQcm9qZWN0KGFNb2R1bGVVUkkpOwotCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQlkZXBlbmRlbnRDb3JlID0gZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoY29udGFpbmVyKTsKLQkJCQkJZGVwZW5kZW50Q29yZXMucHV0KGFNb2R1bGVVUkksIGRlcGVuZGVudENvcmUpOwotCQkJCX0gZWxzZQotCQkJCQl0aHJvdyBuZXcgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihhTW9kdWxlVVJJKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVwZW5kZW50Q29yZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyb3dBdHRlbXB0ZWRSZWFkT25seU1vZGlmaWNhdGlvbigpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byBtb2RpZnkgYSBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIHRoYXQgd2FzIGxvYWRlZCBhcyByZWFkLW9ubHkuIik7Ci0JfQotCi0JLyoqCi0JICogdGVtcG9yYXJ5IG1ldGhvZCB0byByZXR1cm4gZmlyc3QgbW9kdWxlIGluIHRoZSBwcm9qZWN0Ci0JICogCi0JICogQHJldHVybiBmaXJzdCBtb2R1bGUgaW4gdGhlIHByb2plY3QKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgZ2V0Rmlyc3RNb2R1bGUoKSB7Ci0JCXJldHVybiBnZXRDb21wb25lbnQoKTsKLQl9Ci0JLyoqCi0JICogcmV0dXJucyB0aGUgb25lIGFuZCBvbmx5IGNvbXBvbmVudCBpbiB0aGUgcHJvamVjdAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCBpbiB0aGUgcHJvamVjdCBpZiBleGlzdHMgb3IgbnVsbAotCSAqIAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlXb3JrYmVuY2hDb21wb25lbnRbXSBjb21wcyA9IGdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLQkJaWYgKGNvbXBzLmxlbmd0aCA+IDApCi0JCQlyZXR1cm4gY29tcHNbMF07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUNvbXBvbmVudFVSSShJUHJvamVjdCBhQ29udGFpbmluZ1Byb2plY3QsIFN0cmluZyBhQ29tcG9uZW50TmFtZSkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uTU9EVUxFX1BST1RPQ09MICsgSVBhdGguU0VQQVJBVE9SICsgUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLlJFU09VUkNFX01PRFVMRSArIGFDb250YWluaW5nUHJvamVjdC5nZXROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKyBhQ29tcG9uZW50TmFtZSk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBhUHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIE1vZHVsZVN0cnVjdHVyYWxNb2RlbCBnZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoKSB7Ci0JCXJldHVybiBzdHJ1Y3R1cmFsTW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIGVkaXQgZm9yIHJlc291cmNlIHN0YXRlCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFZGl0KCkgewotCQlJVmFsaWRhdGVFZGl0Q29udGV4dCB2YWxpZGF0b3IgPSAoSVZhbGlkYXRlRWRpdENvbnRleHQpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoSVZhbGlkYXRlRWRpdENvbnRleHQuQ0xBU1NfS0VZKTsKLQkJcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0ZVN0YXRlKGdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvV29ya2JlbmNoQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvV29ya2JlbmNoQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDc1ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1dvcmtiZW5jaENvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gKiBBbiBFTUYgcmVwcmVzZW50YXRpb24gb2YgYSBkZXZlbG9wbWVudC10aW1lIG1vZHVsZSBjb250YWluZWQgYnkgYW4gRWNsaXBzZSBwcm9qZWN0LiAKLSAqIDxwPiAKLSAqIFNlZSB0aGUgcGFja2FnZSBvdmVydmlldyBmb3IgYW4gPGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm92ZXJ2aWV3IG9mIHRoZSBtb2RlbCBjb21wb25lbnRzPC9hPi4KLSAqIDwvcD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRDb21wb25lbnRUeXBlIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRSZWZlcmVuY2VkQ29tcG9uZW50cyA8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0TWV0YWRhdGFSZXNvdXJjZXMgPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFdvcmtiZW5jaENvbXBvbmVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrYmVuY2hDb21wb25lbnQgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRXb3JrYmVuY2hDb21wb25lbnRfTmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZX0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldENvbXBvbmVudCA8ZW0+Q29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRXb3JrYmVuY2hDb21wb25lbnRfUmVzb3VyY2VzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRDb21wb25lbnQKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlIiBvcHBvc2l0ZT0iY29tcG9uZW50IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21wb25lbnQgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbXBvbmVudFR5cGUoQ29tcG9uZW50VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRXb3JrYmVuY2hDb21wb25lbnRfQ29tcG9uZW50VHlwZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tcG9uZW50VHlwZSBnZXRDb21wb25lbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldENvbXBvbmVudFR5cGUgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb25lbnQgVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tcG9uZW50VHlwZShDb21wb25lbnRUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29tcG9uZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRXb3JrYmVuY2hDb21wb25lbnRfUmVmZXJlbmNlZENvbXBvbmVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFdvcmtiZW5jaENvbXBvbmVudF9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRhZGF0YSBSZXNvdXJjZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGh9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFdvcmtiZW5jaENvbXBvbmVudF9NZXRhZGF0YVJlc291cmNlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5JUGF0aCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKTsKLQotCVVSSSBnZXRIYW5kbGUoKTsKLQotCUNvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoSVBhdGggYURlcGxveVBhdGgpOwotCQotCUNvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChJUGF0aCBhU291cmNlUGF0aCwgaW50IHJlc291cmNlRmxhZyk7Ci0JCi0JYm9vbGVhbiBleGlzdHMoSVBhdGggYVNvdXJjZVBhdGgsIGludCByZXNvdXJjZUZsYWcpOwotCi19IC8vIFdvcmtiZW5jaENvbXBvbmVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvRGVwZW5kZW5jeUdyYXBoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQzNDFmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElEZXBlbmRlbmN5R3JhcGh9Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5R3JhcGggewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVwZW5kZW5jeUdyYXBoIElOU1RBTkNFID0gbmV3IERlcGVuZGVuY3lHcmFwaCgpOwotCi0JcHVibGljIHN0YXRpYyBEZXBlbmRlbmN5R3JhcGggZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3RbXSBnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoSVByb2plY3QgdGFyZ2V0KSB7Ci0JCVNldDxJUHJvamVjdD4gcmVmZXJlbmNpbmdDb21wb25lbnRzID0gSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHModGFyZ2V0KTsKLQkJcmV0dXJuIChJUHJvamVjdFtdKSByZWZlcmVuY2luZ0NvbXBvbmVudHMudG9BcnJheShuZXcgSVByb2plY3RbcmVmZXJlbmNpbmdDb21wb25lbnRzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZShJUHJvamVjdCB0YXJnZXQsIElQcm9qZWN0IHJlZmVyZW5jaW5nQ29tcG9uZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZlcmVuY2UoSVByb2plY3QgdGFyZ2V0LCBJUHJvamVjdCByZWZlcmVuY2luZ0NvbXBvbmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIFNldCBpbnRlcm5hbEdldFJlZmVyZW5jaW5nQ29tcG9uZW50cyhJUHJvamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTY4YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvRGVwZW5kZW5jeUdyYXBoSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5R3JhcGhJbXBsIGltcGxlbWVudHMgSURlcGVuZGVuY3lHcmFwaCB7Ci0KLQkvKioKLQkgKiBEb24ndCByZWFkIG9yIHdyaXRlIHRoZSBncmFwaCB3aXRob3V0IGZpcnN0IG9idGFpbmluZyB0aGUgZ3JhcGhMb2NrLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdyYXBoTG9jayA9IG5ldyBPYmplY3QoKTsKLQotCS8qKgotCSAqIElmIHByb2plY3RzIGFuZCBhbmQgQiBib3RoIGRlcGVuZCBvbiBDIGFuIGVudHJ5IGluIHRoaXMgZ3JhcGggd291bGQgYmUge0MgLT4KLQkgKiB7QSwgQn0gfQotCSAqLwotCXByaXZhdGUgTWFwPElQcm9qZWN0LCBTZXQ8SVByb2plY3Q+PiBncmFwaCA9IG51bGw7Ci0KLQlwcml2YXRlIGxvbmcgbW9kU3RhbXAgPSAwOwotCi0JLyoqCi0JICogVGhpcyBpcyBub3QgcHVibGljOyBvbmx5IHtAbGluayBJRGVwZW5kZW5jeUdyYXBoI0lOU1RBTkNFfSBzaG91bGQgYmUKLQkgKiB1c2VkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgSURlcGVuZGVuY3lHcmFwaCBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IERlcGVuZGVuY3lHcmFwaEltcGwoKTsKLQkJCWluc3RhbmNlLmluaXRHcmFwaCgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZXBlbmRlbmN5R3JhcGhJbXBsIGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgRGVwZW5kZW5jeUdyYXBoSW1wbCgpIHsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRNb2RTdGFtcCgpIHsKLQkJc3luY2hyb25pemVkIChncmFwaExvY2spIHsKLQkJCXJldHVybiBtb2RTdGFtcDsKLQkJfQotCX0KLQotCXB1YmxpYyBTZXQ8SVByb2plY3Q+IGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cyhJUHJvamVjdCB0YXJnZXRQcm9qZWN0KSB7Ci0JCXdhaXRGb3JBbGxVcGRhdGVzKG51bGwpOwotCQlzeW5jaHJvbml6ZWQgKGdyYXBoTG9jaykgewotCQkJU2V0PElQcm9qZWN0PiBzZXQgPSBncmFwaC5nZXQodGFyZ2V0UHJvamVjdCk7Ci0JCQlpZiAoc2V0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKEl0ZXJhdG9yPElQcm9qZWN0PiBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJU2V0PElQcm9qZWN0PiBjb3B5ID0gbmV3IEhhc2hTZXQ8SVByb2plY3Q+KCk7Ci0JCQkJY29weS5hZGRBbGwoc2V0KTsKLQkJCQlyZXR1cm4gY29weTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRGVwZW5kZW5jeUdyYXBoUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy8gb25seSByZWdpc3RlcmVkIGZvciBwb3N0IGNoYW5nZSBldmVudHMKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0cnkgewotCQkJCXByZVVwZGF0ZSgpOwotCQkJCWV2ZW50LmdldERlbHRhKCkuYWNjZXB0KHRoaXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJcG9zdFVwZGF0ZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQkJY2FzZSBJUmVzb3VyY2UuUk9PVDoKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1Q6IHsKLQkJCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCQlpZiAoKElSZXNvdXJjZURlbHRhLkFEREVEICYga2luZCkgIT0gMCkgewotCQkJCQlxdWV1ZVByb2plY3RBZGRlZCgoSVByb2plY3QpIHJlc291cmNlKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoKElSZXNvdXJjZURlbHRhLlJFTU9WRUQgJiBraW5kKSAhPSAwKSB7Ci0JCQkJCXF1ZXVlUHJvamVjdERlbGV0ZWQoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgaWYgKChJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYga2luZCkgIT0gMCkgewotCQkJCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwotCQkJCQlpZiAoKElSZXNvdXJjZURlbHRhLk9QRU4gJiBmbGFncykgIT0gMCkgewotCQkJCQkJYm9vbGVhbiBpc09wZW4gPSAoKElQcm9qZWN0KSByZXNvdXJjZSkuaXNPcGVuKCk7Ci0JCQkJCQlpZiAoaXNPcGVuKSB7Ci0JCQkJCQkJcXVldWVQcm9qZWN0QWRkZWQoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXF1ZXVlUHJvamVjdERlbGV0ZWQoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWNhc2UgSVJlc291cmNlLkZPTERFUjoKLQkJCQlpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscygiLnNldHRpbmdzIikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgSVJlc291cmNlLkZJTEU6Ci0JCQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKFdUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkuV1RQX01PRFVMRVNfU0hPUlRfTkFNRSkpIHsKLQkJCQkJdXBkYXRlKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQkJfQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBEZXBlbmRlbmN5R3JhcGhSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZ3JhcGggaXMgYnVpbHQgbGF6aWx5IG9uY2UuIEFmdGVyd2FyZHMsIHRoZSBncmFwaCBpcyB1cGRhdGVkIGFzCi0JICogbmVjZXNzYXJ5LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0R3JhcGgoKSB7Ci0JCXN5bmNocm9uaXplZCAoZ3JhcGhMb2NrKSB7Ci0JCQl0cnkgewotCQkJCXByZVVwZGF0ZSgpOwotCQkJCWdyYXBoID0gbmV3IEhhc2hNYXA8SVByb2plY3QsIFNldDxJUHJvamVjdD4+KCk7Ci0JCQkJbGlzdGVuZXIgPSBuZXcgRGVwZW5kZW5jeUdyYXBoUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIoKTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQkJCUlQcm9qZWN0W10gYWxsUHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJZm9yIChJUHJvamVjdCBzb3VyY2VQcm9qZWN0IDogYWxsUHJvamVjdHMpIHsKLQkJCQkJcXVldWVQcm9qZWN0QWRkZWQoc291cmNlUHJvamVjdCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlwb3N0VXBkYXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsUmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN5bmNocm9uaXplZCAoZ3JhcGhMb2NrKSB7Ci0JCQlncmFwaC5yZW1vdmUocHJvamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPFNldDxJUHJvamVjdD4+IGl0ZXJhdG9yID0gZ3JhcGgudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCWl0ZXJhdG9yLm5leHQoKS5yZW1vdmUocHJvamVjdCk7Ci0JCQl9Ci0JCQltb2RTdGFtcCsrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVJlZmVyZW5jZShJUHJvamVjdCBzb3VyY2VQcm9qZWN0LCBJUHJvamVjdCB0YXJnZXRQcm9qZWN0KSB7Ci0JCXN5bmNocm9uaXplZCAoZ3JhcGhMb2NrKSB7Ci0JCQlTZXQ8SVByb2plY3Q+IHJlZmVyZW5jaW5nUHJvamVjdHMgPSBncmFwaC5nZXQodGFyZ2V0UHJvamVjdCk7Ci0JCQlpZiAocmVmZXJlbmNpbmdQcm9qZWN0cyAhPSBudWxsKSB7Ci0JCQkJcmVmZXJlbmNpbmdQcm9qZWN0cy5yZW1vdmUoc291cmNlUHJvamVjdCk7Ci0JCQl9Ci0JCQltb2RTdGFtcCsrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJlZmVyZW5jZShJUHJvamVjdCBzb3VyY2VQcm9qZWN0LCBJUHJvamVjdCB0YXJnZXRQcm9qZWN0KSB7Ci0JCXN5bmNocm9uaXplZCAoZ3JhcGhMb2NrKSB7Ci0JCQlTZXQ8SVByb2plY3Q+IHJlZmVyZW5jaW5nUHJvamVjdHMgPSBncmFwaC5nZXQodGFyZ2V0UHJvamVjdCk7Ci0JCQlpZiAocmVmZXJlbmNpbmdQcm9qZWN0cyA9PSBudWxsKSB7Ci0JCQkJcmVmZXJlbmNpbmdQcm9qZWN0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOwotCQkJCWdyYXBoLnB1dCh0YXJnZXRQcm9qZWN0LCByZWZlcmVuY2luZ1Byb2plY3RzKTsKLQkJCX0KLQkJCXJlZmVyZW5jaW5nUHJvamVjdHMuYWRkKHNvdXJjZVByb2plY3QpOwotCQkJbW9kU3RhbXArKzsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEdSQVBIX1VQREFURV9KT0JfRkFNSUxZID0gbmV3IE9iamVjdCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpPQl9ERUxBWSA9IDEwMDsKLQotCXByaXZhdGUgZmluYWwgR3JhcGhVcGRhdGVKb2IgZ3JhcGhVcGRhdGVKb2IgPSBuZXcgR3JhcGhVcGRhdGVKb2IoKTsKLQlwcml2YXRlIGZpbmFsIE9iamVjdCBqb2JMb2NrID0gbmV3IE9iamVjdCgpOwotCi0JcHJpdmF0ZSBjbGFzcyBHcmFwaFVwZGF0ZUpvYiBleHRlbmRzIEpvYiB7Ci0KLQkJcHVibGljIEdyYXBoVXBkYXRlSm9iKCkgewotCQkJc3VwZXIoIkdyYXBoIFVwZGF0ZSBKb2IiKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNldFJ1bGUobnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJaWYgKGZhbWlseSA9PSBHUkFQSF9VUERBVEVfSk9CX0ZBTUlMWSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmJlbG9uZ3NUbyhmYW1pbHkpOwotCQl9Ci0KLQkJLy8gV2UgdXNlIHRoZSBsaXN0ZW5lciBsaXN0IGFzIGEgdGhyZWFkIHNhZmUgcXVldWUuCi0JCXByaXZhdGUgY2xhc3MgUXVldWUgZXh0ZW5kcyBMaXN0ZW5lckxpc3QgewotCQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3RbXSBnZXRMaXN0ZW5lcnMoKSB7Ci0JCQkJT2JqZWN0W10gZGF0YSA9IHN1cGVyLmdldExpc3RlbmVycygpOwotCQkJCWNsZWFyKCk7Ci0JCQkJcmV0dXJuIGRhdGE7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJCXJldHVybiBzdXBlci5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBRdWV1ZSBwcm9qZWN0c0FkZGVkID0gbmV3IFF1ZXVlKCk7Ci0KLQkJcHJpdmF0ZSBRdWV1ZSBwcm9qZWN0c1JlbW92ZWQgPSBuZXcgUXVldWUoKTsKLQotCQlwcml2YXRlIFF1ZXVlIHByb2plY3RzVXBkYXRlZCA9IG5ldyBRdWV1ZSgpOwotCi0JCXB1YmxpYyB2b2lkIHF1ZXVlUHJvamVjdEFkZGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXN5bmNocm9uaXplZCAoZ3JhcGhMb2NrKSB7Ci0JCQkJbW9kU3RhbXArKzsKLQkJCX0KLQkJCXByb2plY3RzQWRkZWQuYWRkKHByb2plY3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcXVldWVQcm9qZWN0RGVsZXRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGdyYXBoTG9jaykgewotCQkJCW1vZFN0YW1wKys7Ci0JCQl9Ci0JCQlwcm9qZWN0c1JlbW92ZWQuYWRkKHByb2plY3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcXVldWVQcm9qZWN0VXBkYXRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGdyYXBoTG9jaykgewotCQkJCW1vZFN0YW1wKys7Ci0JCQl9Ci0JCQlwcm9qZWN0c1VwZGF0ZWQuYWRkKHByb2plY3QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFNjaGVkdWxlKCkgewotCQkJYm9vbGVhbiBpc0VtcHR5ID0gcHJvamVjdHNBZGRlZC5pc0VtcHR5KCkgJiYgcHJvamVjdHNSZW1vdmVkLmlzRW1wdHkoKSAmJiBwcm9qZWN0c1VwZGF0ZWQuaXNFbXB0eSgpOwotCQkJcmV0dXJuICFpc0VtcHR5OwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJZmluYWwgT2JqZWN0W10gcmVtb3ZlZCA9IHByb2plY3RzUmVtb3ZlZC5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZpbmFsIE9iamVjdFtdIHVwZGF0ZWQgPSBwcm9qZWN0c1VwZGF0ZWQuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmaW5hbCBPYmplY3RbXSBhZGRlZCA9IHByb2plY3RzQWRkZWQuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlpZiAocmVtb3ZlZC5sZW5ndGggPT0gMCAmJiB1cGRhdGVkLmxlbmd0aCA9PSAwICYmIGFkZGVkLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKGdyYXBoTG9jaykgewotCQkJCW1vZFN0YW1wKys7Ci0JCQl9Ci0JCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJLy8gdGhpcyBpcyB0aGUgc2ltcGxlIGNhc2U7IGp1c3QgcmVtb3ZlIHRoZW0gYWxsCi0JCQkJCXN5bmNocm9uaXplZCAoZ3JhcGhMb2NrKSB7Ci0JCQkJCQlmb3IgKE9iamVjdCBvIDogcmVtb3ZlZCkgewotCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG87Ci0JCQkJCQkJcmVtb3ZlQWxsUmVmZXJlbmNlcyhwcm9qZWN0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBnZXQgdGhlIHVwZGF0ZWQgcXVldWUgaW4gY2FzZSB0aGVyZSBhcmUgYW55IGFkZHMKLQkJCQkJLy8gaWYgdGhlcmUgYXJlIGFueSBhZGRlZCBwcm9qZWN0cywgdGhlbiB1bmZvcnR1bmF0ZWx5IHRoZQotCQkJCQkvLyBlbnRpcmUgd29ya3NwYWNlIG5lZWRzIHRvIGJlIHByb2Nlc3NlZAotCQkJCQlpZiAoYWRkZWQubGVuZ3RoID4gMCkgewotCQkJCQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCQkJCWZvciAoSVByb2plY3Qgc291cmNlUHJvamVjdCA6IGFsbFByb2plY3RzKSB7Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoc291cmNlUHJvamVjdCk7Ci0JCQkJCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJCQkJCWZvciAoSVZpcnR1YWxSZWZlcmVuY2UgcmVmIDogcmVmZXJlbmNlcykgewotCQkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCQkJCWlmICh0YXJnZXRDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCQkJCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSB0YXJnZXRDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJCWlmICh0YXJnZXRQcm9qZWN0ICE9IG51bGwgJiYgIXRhcmdldFByb2plY3QuZXF1YWxzKHNvdXJjZVByb2plY3QpKSB7Ci0JCQkJCQkJCQkJCWFkZFJlZmVyZW5jZShzb3VyY2VQcm9qZWN0LCB0YXJnZXRQcm9qZWN0KTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAodXBkYXRlZC5sZW5ndGggPiAwKSB7Ci0JCQkJCQlJUHJvamVjdFtdIGFsbFByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJCQkJU2V0PElQcm9qZWN0PiB2YWxpZFJlZnMgPSBuZXcgSGFzaFNldDxJUHJvamVjdD4oKTsKLQkJCQkJCWZvciAoT2JqZWN0IG8gOiB1cGRhdGVkKSB7Ci0JCQkJCQkJSVByb2plY3Qgc291cmNlUHJvamVjdCA9IChJUHJvamVjdCkgbzsKLQkJCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChzb3VyY2VQcm9qZWN0KTsKLQkJCQkJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJdmFsaWRSZWZzLmNsZWFyKCk7Ci0JCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJCQkJCWZvciAoSVZpcnR1YWxSZWZlcmVuY2UgcmVmIDogcmVmZXJlbmNlcykgewotCQkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCQkJCWlmICh0YXJnZXRDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCQkJCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSB0YXJnZXRDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJCWlmICh0YXJnZXRQcm9qZWN0ICE9IG51bGwgJiYgIXRhcmdldFByb2plY3QuZXF1YWxzKHNvdXJjZVByb2plY3QpKSB7Ci0JCQkJCQkJCQkJCXZhbGlkUmVmcy5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCXN5bmNocm9uaXplZCAoZ3JhcGhMb2NrKSB7Ci0JCQkJCQkJCQlmb3IgKElQcm9qZWN0IHRhcmdldFByb2plY3QgOiBhbGxQcm9qZWN0cykgewotCQkJCQkJCQkJCS8vIGlmIHRoZSByZWZlcmVuY2Ugd2FzIGlkZW50aWZpZWQKLQkJCQkJCQkJCQkvLyBhYm92ZSwgYmUgc3VyZSB0byBhZGQgaXQKLQkJCQkJCQkJCQkvLyBvdGhlcndpc2UsIHJlbW92ZSBpdAotCQkJCQkJCQkJCWlmICh2YWxpZFJlZnMucmVtb3ZlKHRhcmdldFByb2plY3QpKSB7Ci0JCQkJCQkJCQkJCWFkZFJlZmVyZW5jZShzb3VyY2VQcm9qZWN0LCB0YXJnZXRQcm9qZWN0KTsKLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQlyZW1vdmVSZWZlcmVuY2Uoc291cmNlUHJvamVjdCwgdGFyZ2V0UHJvamVjdCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gaWYgdGhpcyBwcm9qZWN0IGlzIG5vdCBhIGNvbXBvbmVudCwgdGhlbiBpdAotCQkJCQkJCQkvLyBzaG91bGQgYmUgY29tcGxldGVseSByZW1vdmVkLgotCQkJCQkJCQlyZW1vdmVBbGxSZWZlcmVuY2VzKHNvdXJjZVByb2plY3QpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKElEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjdXBkYXRlKElQcm9qZWN0LCBpbnQpfQotCSAqLwotCXB1YmxpYyB2b2lkIHF1ZXVlUHJvamVjdEFkZGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdXBkYXRlKHByb2plY3QsIElEZXBlbmRlbmN5R3JhcGguQURERUQpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3VwZGF0ZShJUHJvamVjdCwgaW50KX0KLQkgKi8KLQlwdWJsaWMgdm9pZCBxdWV1ZVByb2plY3REZWxldGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdXBkYXRlKHByb2plY3QsIElEZXBlbmRlbmN5R3JhcGguUkVNT1ZFRCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjdXBkYXRlKElQcm9qZWN0LCBpbnQpfQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXVwZGF0ZShwcm9qZWN0LCBJRGVwZW5kZW5jeUdyYXBoLk1PRElGSUVEKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSVByb2plY3QgcHJvamVjdCwgZmluYWwgaW50IHVwZGF0ZVR5cGUpewotCQlzd2l0Y2godXBkYXRlVHlwZSl7Ci0JCWNhc2UgSURlcGVuZGVuY3lHcmFwaC5NT0RJRklFRDoKLQkJCWdyYXBoVXBkYXRlSm9iLnF1ZXVlUHJvamVjdFVwZGF0ZWQocHJvamVjdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBJRGVwZW5kZW5jeUdyYXBoLkFEREVEOgotCQkJZ3JhcGhVcGRhdGVKb2IucXVldWVQcm9qZWN0QWRkZWQocHJvamVjdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBJRGVwZW5kZW5jeUdyYXBoLlJFTU9WRUQ6Ci0JCQlncmFwaFVwZGF0ZUpvYi5xdWV1ZVByb2plY3REZWxldGVkKHByb2plY3QpOwotCQkJYnJlYWs7Ci0JCX0KLQkJc3luY2hyb25pemVkIChqb2JMb2NrKSB7Ci0JCQlpZiAocGF1c2VDb3VudCA+IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZ3JhcGhVcGRhdGVKb2Iuc2NoZWR1bGUoSk9CX0RFTEFZKTsKLQl9Ci0JCi0JCi0JCi0JcHJpdmF0ZSBpbnQgcGF1c2VDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBQYXVzZXMgdXBkYXRlczsgYW55IGNhbGxlciBvZiB0aGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aHJvdWdoIGEKLQkgKiB0cnkvZmluYWxseSBibG9jayB0aGF0IHJlc3VtZVVwZGF0ZXMgaXMgc3Vic2VxdWVudGx5IGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVVcGRhdGUoKSB7Ci0JCXN5bmNocm9uaXplZCAoam9iTG9jaykgewotCQkJcGF1c2VDb3VudCsrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcG9zdFVwZGF0ZSgpIHsKLQkJc3luY2hyb25pemVkIChqb2JMb2NrKSB7Ci0JCQlpZiAocGF1c2VDb3VudCA+IDApIHsKLQkJCQlwYXVzZUNvdW50LS07Ci0JCQl9Ci0JCQlpZiAocGF1c2VDb3VudCA+IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZ3JhcGhVcGRhdGVKb2Iuc2NoZWR1bGUoSk9CX0RFTEFZKTsKLQl9Ci0KLQkvKioKLQkgKiBCbG9ja3MgdW50aWwgdGhlIGdyYXBoIGlzIGZpbmlzaGVkIHVwZGF0aW5nCi0JICovCi0JcHVibGljIHZvaWQgd2FpdEZvckFsbFVwZGF0ZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmKGdyYXBoVXBkYXRlSm9iLnNob3VsZFNjaGVkdWxlKCkpewotCQkJZ3JhcGhVcGRhdGVKb2IucnVuKG1vbml0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkIChncmFwaExvY2spIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigiRGVwZW5kZW5jeSBHcmFwaDpcbntcbiIpOwotCQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8SVByb2plY3QsIFNldDxJUHJvamVjdD4+PiBpdGVyYXRvciA9IGdyYXBoLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeTxJUHJvamVjdCwgU2V0PElQcm9qZWN0Pj4gZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJYnVmZi5hcHBlbmQoIiAgIiArIGVudHJ5LmdldEtleSgpLmdldE5hbWUoKSArICIgLT4geyIpOwotCQkJCWZvciAoSXRlcmF0b3I8SVByb2plY3Q+IG1hcHBlZFByb2plY3RzID0gZW50cnkuZ2V0VmFsdWUoKS5pdGVyYXRvcigpOyBtYXBwZWRQcm9qZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQkJCWJ1ZmYuYXBwZW5kKG1hcHBlZFByb2plY3RzLm5leHQoKS5nZXROYW1lKCkpOwotCQkJCQlpZiAobWFwcGVkUHJvamVjdHMuaGFzTmV4dCgpKSB7Ci0JCQkJCQlidWZmLmFwcGVuZCgiLCAiKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlidWZmLmFwcGVuZCgifVxuIik7Ci0JCQl9Ci0JCQlidWZmLmFwcGVuZCgifSIpOwotCQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjc1YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvRGVwZW5kZW5jeUdyYXBoTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBJRGVwZW5kZW5jeUdyYXBofQotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUdyYXBoTWFuYWdlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBEZXBlbmRlbmN5R3JhcGhNYW5hZ2VyIElOU1RBTkNFID0gbnVsbDsKLQotCXByaXZhdGUgRGVwZW5kZW5jeUdyYXBoTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBmaW5hbCBEZXBlbmRlbmN5R3JhcGhNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkKLQkJCUlOU1RBTkNFID0gbmV3IERlcGVuZGVuY3lHcmFwaE1hbmFnZXIoKTsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbnN0cnVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlcGVuZGVuY3kgZ3JhcGggd2hpY2ggd2FzIGluaXRpYWxpemVkIGlmIG5lZWQgYmUgaW4gdGhlCi0JICogc2luZ2xldG9uIG1hbmFnZXIgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBEZXBlbmRlbmN5R3JhcGggZ2V0RGVwZW5kZW5jeUdyYXBoKCkgewotCQlyZXR1cm4gRGVwZW5kZW5jeUdyYXBoLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9yY2VSZWZyZXNoKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGxvbmcgZ2V0TW9kU3RhbXAoKSB7Ci0JCXJldHVybiBJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLmdldE1vZFN0YW1wKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tJZlN0aWxsVmFsaWQobG9uZyB0aW1lU3RhbXApIHsKLQkJcmV0dXJuIElEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UuZ2V0TW9kU3RhbXAoKSA9PSB0aW1lU3RhbXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvSURlcGVuZGVuY3lHcmFwaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvSURlcGVuZGVuY3lHcmFwaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTRmNThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0lEZXBlbmRlbmN5R3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIFRoaXMgZ3JhcGggcHJvdmlkZXMgYSBiYWNrd2FyZCBtYXBwaW5nIG9mIHByb2plY3QgY29tcG9uZW50IGRlcGVuZGVuY2llcy4gSXQKLSAqIHByb3ZpZGVzIGEgcHJvamVjdCBsaW1pdGVkIGludmVyc2Ugb2YKLSAqIHtAbGluayBJVmlydHVhbENvbXBvbmVudCNnZXRSZWZlcmVuY2VzKCl9LgotICogCi0gKiBGb3IgZXhhbXBsZToKLSAqIDx1bD4KLSAqIDxsaT5pZiB0aGUgSVZpcnR1YWxDb21wb25lbnQgZm9yIHByb2plY3QgQSBoYXMgYSBkZXBlbmRlbmN5IG9uIHRoZQotICogSVZpcnR1YWxDb21wb25lbnQgZm9yIHByb2plY3QgQiwgdGhlbiBjYWxsaW5nCi0gKiB7QGxpbmsgI2dldFJlZmVyZW5jaW5nQ29tcG9uZW50cyhJUHJvamVjdCl9IG9uIHByb2plY3QgQiB3aWxsIHJldHVybiBwcm9qZWN0Ci0gKiBBLiA8L2xpPgotICogPGxpPmlmIHRoZSBJVmlydHVhbENvbXBvbmVudCBmb3IgcHJvamVjdCBBIGhhcyBhIGRlcGVuZGVuY3kgb24gb24gdGhlCi0gKiBJVmlydHVhbENvbXBvbmVudCBmb3IgYSBqYXIgaW4gcHJvamVjdCBCLCB0aGVuIGNhbGxpbmcKLSAqIHtAbGluayAjZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKElQcm9qZWN0KX0gZm9yIHByb2plY3QgQiB3aWxsIHJldHVybiBwcm9qZWN0Ci0gKiBBLiBUaGlzIGlzIHRydWUgZXZlbiBpZiBwcm9qZWN0IEIgaXMgbm90IGRlZmluZWQgYXMgYW4gSVZpcnR1YWxDb21wb25lbnQuCi0gKiA8L2xpPgotICogPC91bD4KLSAqIAotICogQW55IGNhbGwgdG8ge0BsaW5rICNnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoSVByb2plY3QpfSBpcyBhbHdheXMgZXhwZWN0ZWQgdG8KLSAqIGJlIHVwIHRvIGRhdGUuIFRoZSBvbmx5IGNhc2Ugd2hlcmUgYSBjbGllbnQgbWF5IG5lZWQgdG8gZm9yY2UgYW4gdXBkYXRlIGlzIGlmCi0gKiB0aGF0IGNsaWVudCBpcyBhbHNvIGRlZmluaW5nIGR5bmFtaWMgSVZpcnR1YWxDb21wb25lbnQgZGVwZW5kZW5jaWVzLCBpLmUuIHRoZQotICogY2xpZW50IGlzIHVzaW5nIHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuY29tcG9uZW50aW1wbCBleHRlbnNpb24KLSAqIHBvaW50LiBPbmx5IGluIHRoaXMgY2FzZSBzaG91bGQgYSBjbGllbnQgYmUgY2FsbGluZyBhbnkgb2YKLSAqIHtAbGluayAjcHJlVXBkYXRlKCl9LCB7QGxpbmsgI3Bvc3RVcGRhdGUoKX0sIG9yIHtAbGluayAjdXBkYXRlKElQcm9qZWN0KX0KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZXBlbmRlbmN5R3JhcGggewotCi0JLyoqCi0JICogRmxhZyB1c2VkIGJ5IHtAbGluayAjdXBkYXRlKElQcm9qZWN0LCBpbnQpfSB0byBzcGVjaWZ5IHRoYXQgc29tZXRoaW5nIGhhcwotCSAqIG1vZGlmaWVkIGluIGEgcHJvamVjdCB3aGljaCBoYXMgY2hhbmdlZCB0aGUgY29tcG9uZW50IGRlcGVuZGVuY2llcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RJRklFRCA9IDA7Ci0KLQkvKioKLQkgKiBGbGFnIHVzZWQgYnkge0BsaW5rICN1cGRhdGUoSVByb2plY3QsIGludCl9IHRvIHNwZWNpZnkgYSBwcm9qZWN0IGhhcyBiZWVuCi0JICogYWRkZWQgb3Igb3BlbmVkLiBUaGlzIGZsYWcgc2hvdWxkIGJlIHVzZWQgYXMgc3BhcmluZ2x5IGFzIHBvc3NpYmxlCi0JICogYmVjYXVzZSB0aGVyZSBhcmUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEID0gMTsKLQotCS8qKgotCSAqIEZsYWcgdXNlZCBieSB7QGxpbmsgI3VwZGF0ZShJUHJvamVjdCwgaW50KX0gdG8gc3BlY2lmeSBhIHByb2plY3QgaGFzIGJlZW4KLQkgKiByZW1vdmVkIG9yIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEID0gMjsKLQotCS8qKgotCSAqIFRoZSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhpcyBncmFwaAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURlcGVuZGVuY3lHcmFwaCBJTlNUQU5DRSA9IERlcGVuZGVuY3lHcmFwaEltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldCBvZiBjb21wb25lbnQgcHJvamVjdHMgcmVmZXJlbmNpbmcgdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXRQcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTZXQ8SVByb2plY3Q+IGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cyhJUHJvamVjdCB0YXJnZXRQcm9qZWN0KTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBtb2RpZmljYXRpb24gc3RhbXAuIFRoaXMgbW9kaWZpY2F0aW9uIHN0YW1wIHdpbGwgYmUgZGlmZmVyZW50Ci0JICogaWYgdGhlIHByb2plY3QgZGVwZW5kZW5jaWVzIGV2ZXIgY2hhbmdlLgotCSAqLwotCXB1YmxpYyBsb25nIGdldE1vZFN0YW1wKCk7Ci0KLQkvKioKLQkgKiBXQVJOSU5HOiB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBpbXBsZW1lbnRvcnMgb2YgdGhlCi0JICogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmNvbXBvbmVudGltcGwgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHVwZGF0ZSBBUEkuCi0JICogCi0JICogQHNlZSB7QGxpbmsgI3VwZGF0ZShJUHJvamVjdCl9Ci0JICovCi0JcHVibGljIHZvaWQgcHJlVXBkYXRlKCk7Ci0KLQkvKioKLQkgKiBXQVJOSU5HOiB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBpbXBsZW1lbnRvcnMgb2YgdGhlCi0JICogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmNvbXBvbmVudGltcGwgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHVwZGF0ZSBBUEkuCi0JICogCi0JICogQHNlZSB7QGxpbmsgI3VwZGF0ZShJUHJvamVjdCl9Ci0JICovCi0JcHVibGljIHZvaWQgcG9zdFVwZGF0ZSgpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjdXBkYXRlKElQcm9qZWN0LCBpbnQpIHVzaW5nIHRoZSAjTU9ESUZJRUQgZmxhZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSVByb2plY3Qgc291cmNlUHJvamVjdCk7Ci0KLQkvKioKLQkgKiBXQVJOSU5HOiB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBpbXBsZW1lbnRvcnMgb2YgdGhlCi0JICogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmNvbXBvbmVudGltcGwgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBjaGFuZ2UgaXMgZGV0ZWN0ZWQgd2hpY2ggd2lsbAotCSAqIGFmZmVjdCBob3cgZGVwZW5kZW5jaWVzIGJlaGF2ZS4gRm9yIGV4YW1wbGUsIHRoZSBjb3JlIElWaXJ0dWFsQ29tcG9uZW50Ci0JICogZnJhbWV3b3JrIHVwZGF0ZXMgd2hlbiBjaGFuZ2VzIGFyZSBtYWRlIHRvIHRoZQotCSAqIC5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCBmaWxlIGNoYW5nZXMsIGFuZCBhbHNvIHdoZW4KLQkgKiBJUHJvamVjdHMgYXJlIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NwYWNlLiBJbiB0aGUgY2FzZSBmb3IgSjJFRSwKLQkgKiB0aGlzIG9jY3VycyB3aGVuIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIE1FVEEtSU5GL01BTklGRVNULk1GIGZpbGUuIEluCi0JICogZ2VuZXJhbCBhIGNhbGwgdG8gdXBkYXRlIHNob3VsZCBvbmx5IGJlIG1hZGUgZnJvbSBhIGZhc3QKLQkgKiB7QGxpbmsgSVJlc291cmNlRGVsdGFWaXNpdG9yfS4KLQkgKiAKLQkgKiBJbiBvcmRlciB0byBpbXByb3ZlIGVmZmljaWVuY3kgYW5kIGF2b2lkIHVubmVjZXNzYXJ5IHVwZGF0ZSBwcm9jZXNzaW5nLAotCSAqIGl0IGlzIG5lY2Vzc2FyeSB0byBhbHdheXMgcHJvY2VlZCBjYWxscyB0byB1cGRhdGUoKSB3aXRoIGEgY2FsbCB0bwotCSAqIHByZVVwZGF0ZSgpIGFuZCBmb2xsb3cgd2l0aCBhIGNhbGwgdG8gcG9zdFVwZGF0ZSgpIHVzaW5nIGEgdHJ5IGZpbmFsbHkKLQkgKiBibG9jayBhcyBmb2xsb3dzOiA8Y29kZT4KLQkgKiB0cnkgewotCSAqICAgICBwcmVVcGRhdGUoKTsKLQkgKiAgICAgLy8gcGVyZm9ybSAwIG9yIG1vcmUgdXBkYXRlKCkgY2FsbHMgaGVyZQotCSAqIH0gZmluYWxseSB7Ci0JICogICAgIElEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UucG9zdFVwZGF0ZSgpOwotCSAqIH0gICAgCi0JICogPC9jb2RlPgotCSAqIAotCSAqIFZhbGlkIHVwZGF0ZVR5cGUgZmxhZ3MgYXJlIHtAbGluayAjTU9ESUZJRUR9LCB7QGxpbmsgI0FEREVEfSwgYW5kCi0JICoge0BsaW5rICNSRU1PVkVEfQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShJUHJvamVjdCBzb3VyY2VQcm9qZWN0LCBpbnQgdXBkYXRlVHlwZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0FydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzU3ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeSBleHRlbmRzIEVkaXRNb2RlbEZhY3RvcnkgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9FRElUX01PREVMX0lEID0gIm9yZy5lY2xpcHNlLndzdC5tb2R1bGVjb3JlLmVkaXRNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9NT0RVTEVfVVJJID0gIk1PRFVMRV9VUkkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUk9PVF9VUkkgPSAiUk9PVF9VUkkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUk9PVF9DT05URU5UX1RZUEUgPSAiUk9PVF9DT05URU5UX1RZUEUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSNjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKSB7Ci0JCVVSSSBtb2R1bGVVUkkgPSAoVVJJKSAoKHBhcmFtcyAhPSBudWxsKSA/IHBhcmFtcy5nZXQoUEFSQU1fTU9EVUxFX1VSSSkgOiBudWxsKTsKLQkJVVJJIHJvb3RVUkkgPSAoVVJJKSAoKHBhcmFtcyAhPSBudWxsKSA/IHBhcmFtcy5nZXQoUEFSQU1fUk9PVF9VUkkpIDogbnVsbCk7Ci0JCVN0cmluZyByb290Q29udGVudFR5cGUgPSAoU3RyaW5nKSAoKHBhcmFtcyAhPSBudWxsKSA/IHBhcmFtcy5nZXQoUEFSQU1fUk9PVF9DT05URU5UX1RZUEUpIDogbnVsbCk7Ci0JCWlmKG1vZHVsZVVSSSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQSBNb2R1bGUgVVJJIG11c3QgYmUgcHJvdmlkZWQiKTsKLQkJCi0JCXJldHVybiAgbmV3IEFydGlmYWN0RWRpdE1vZGVsKGVkaXRNb2RlbElELCBjb250ZXh0LCB0cnVlLCBtb2R1bGVVUkksIHJvb3RVUkksIHJvb3RDb250ZW50VHlwZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dCwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKSB7Ci0JCVVSSSBtb2R1bGVVUkkgPSAoVVJJKSAoKHBhcmFtcyAhPSBudWxsKSA/IHBhcmFtcy5nZXQoUEFSQU1fTU9EVUxFX1VSSSkgOiBudWxsKTsKLQkJVVJJIHJvb3RVUkkgPSAoVVJJKSAoKHBhcmFtcyAhPSBudWxsKSA/IHBhcmFtcy5nZXQoUEFSQU1fUk9PVF9VUkkpIDogbnVsbCk7Ci0JCVN0cmluZyByb290Q29udGVudFR5cGUgPSAoU3RyaW5nKSAoKHBhcmFtcyAhPSBudWxsKSA/IHBhcmFtcy5nZXQoUEFSQU1fUk9PVF9DT05URU5UX1RZUEUpIDogbnVsbCk7Ci0JCWlmKG1vZHVsZVVSSSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQSBNb2R1bGUgVVJJIG11c3QgYmUgcHJvdmlkZWQiKTsKLQkJcmV0dXJuICBuZXcgQXJ0aWZhY3RFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIGNvbnRleHQsIGZhbHNlLCBtb2R1bGVVUkksIHJvb3RVUkksIHJvb3RDb250ZW50VHlwZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjZ2V0Q2FjaGVJRChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsgCi0JCVVSSSBtb2R1bGVVUkkgPSAoVVJJKXBhcmFtcy5nZXQoUEFSQU1fTU9EVUxFX1VSSSk7Ci0JCWlmKG1vZHVsZVVSSSAhPSBudWxsKQotCQkJcmV0dXJuIGVkaXRNb2RlbElEKyI6Iittb2R1bGVVUkkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZWRpdE1vZGVsSUQrIjpOT1VSSSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudENvcmVVUklDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudENvcmVVUklDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI3MjJiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRDb3JlVVJJQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJTWFwcGluZ1JlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Db21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRDb3JlVVJJQ29udmVydGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwgewotCQotCXByaXZhdGUgSVByb2plY3QgY29udGFpbmluZ1Byb2plY3Q7Ci0vLwlwcml2YXRlIElGb2xkZXIgYXJjaGl2ZVJvb3Q7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRDb3JlVVJJQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbklucHV0Q29udGFpbmVyCi0JICovCi0JcHVibGljIENvbXBvbmVudENvcmVVUklDb252ZXJ0ZXIoSVByb2plY3QgYUNvbnRhaW5pbmdQcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbnRhaW5pbmdQcm9qZWN0ID0gYUNvbnRhaW5pbmdQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhQ29udGFpbmVyCi0JICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlcihJUHJvamVjdCBhQ29udGFpbmluZ1Byb2plY3QsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKLQkJc3VwZXIoYUNvbnRhaW5pbmdQcm9qZWN0LCBhU3luY2hyb25pemVyKTsKLQkJY29udGFpbmluZ1Byb2plY3QgPSBhQ29udGFpbmluZ1Byb2plY3Q7Ci0JfSAKLSAKLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZmluZENvbXBvbmVudChJUmVzb3VyY2UgcmVzKSB7Ci0JCQotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmV4aXN0cygpKQotCQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHJlcy5nZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsI25vcm1hbGl6ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSBhVVJJKSB7Ci0JCVVSSSBub3JtYWxpemVkVVJJID0gbnVsbDsKLQkJaWYoUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLk1PRFVMRS5lcXVhbHMoYVVSSS5zY2hlbWUoKSkpIHsgCQkKLQkJCXRyeSB7Ci0JCQkJbm9ybWFsaXplZFVSSSA9IFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5yZXNvbHZlKGFVUkkpOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQlpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IAotCQl9IGVsc2UgewotCQkJbm9ybWFsaXplZFVSSSA9IHN1cGVyLm5vcm1hbGl6ZShhVVJJKTsKLQkJfQotCQlpZihub3JtYWxpemVkVVJJID09IG51bGwpIHsKLQkJCW5vcm1hbGl6ZWRVUkkgPSBuZXdQbGF0Zm9ybVVSSShhVVJJKTsKLQkJfQotCQllbHNlIGlmKG5vcm1hbGl6ZWRVUkkuc2NoZW1lKCkgPT0gbnVsbCB8fCBub3JtYWxpemVkVVJJLnNjaGVtZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCW5vcm1hbGl6ZWRVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShnZXRJbnB1dENvbnRhaW5lcigpLmdldEZ1bGxQYXRoKCkuYXBwZW5kKG5vcm1hbGl6ZWRVUkkudG9TdHJpbmcoKSkudG9TdHJpbmcoKSk7CQotCQl9Ci0JCXJldHVybiBub3JtYWxpemVkVVJJOwotCX0KLQkKLQlwcml2YXRlIFVSSSBuZXdQbGF0Zm9ybVVSSShVUkkgYU5ld1VSSSkgewotCQkKLQkJdHJ5IHsKLS8vCQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBTdHJ1Y3R1cmVFZGl0LmdldERlcGxveWVkTmFtZShhTmV3VVJJKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGNvbnRhaW5pbmdQcm9qZWN0KTsKLQotCQkJVVJJIGRlcGxveVBhdGhTZWdtZW50ID0gTW9kdWxlVVJJVXRpbC50cmltVG9EZXBsb3lQYXRoU2VnbWVudChhTmV3VVJJKTsKLQkJCQotCQkJLy9JVmlydHVhbEZpbGUgbmV3RmlsZSA9IGNvbXBvbmVudC5nZXRGaWxlKG5ldyBQYXRoKGRlcGxveVBhdGhTZWdtZW50LnBhdGgoKSkpOwkJCQotCQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQlJVmlydHVhbEZpbGUgbmV3RmlsZSA9IHJvb3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChkZXBsb3lQYXRoU2VnbWVudC5wYXRoKCkpKTsKLQkJCQotCQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG5ld0ZpbGUuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkgCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy54bWkuaGVscGVycy5Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyI2RlTm9ybWFsaXplKFVSSSkKLQkgKi8KLQlwdWJsaWMgVVJJIGRlTm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQbGF0Zm9ybUZpbGUodXJpKTsKLQkJCQotCQkJaWYgKGFGaWxlICE9IG51bGwpIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRDb250YWluaW5nUHJvamVjdCgpKTsKLQkJCQkKLQkJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQkJSVByb2plY3QgZmlsZVByb2plY3QgPSBnZXRDb250YWluaW5nUHJvamVjdCgpOwotCQkJCQkKLQkJCQkJaWYgKHJlc291cmNlU2V0U3luY2hyb25pemVyLmdldFByb2plY3QoKSA9PSBmaWxlUHJvamVjdCl7Ci0JCQkJCQlMaXN0IGxpc3QgPSBBcnJheXMuYXNMaXN0KGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKSk7Ci0JCQkJCQlJUGF0aCBwYXRoID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFBhdGhGcm9tQ29udGFpbmVycyhsaXN0LCBhRmlsZS5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkocGF0aC50b1N0cmluZygpKTsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybiBzdXBlci5kZU5vcm1hbGl6ZSh1cmkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCQotCXByb3RlY3RlZCBVUkkgZ2V0Q29udGFpbmVyUmVsYXRpdmVVUkkoSUZpbGUgYUZpbGUpIHsKLQkJSVBhdGggcGF0aCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRQYXRoRnJvbUNvbnRhaW5lcnMoaW5wdXRDb250YWluZXJzLCBhRmlsZS5nZXRGdWxsUGF0aCgpKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKHBhdGgudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcm90ZWN0ZWQgVVJJIGdldEFyY2hpdmVSZWxhdGl2ZVVSSShJRmlsZSBhRmlsZSwgSUNvbnRhaW5lciBhQ29udGFpbmVyKSB7Ci0JCUlQYXRoIHBhdGggPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UGF0aEZyb21Db250YWluZXJzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYUNvbnRhaW5lciksIGFGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAocGF0aCAhPSBudWxsKQotCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkocGF0aC50b1N0cmluZygpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldENvbnRhaW5pbmdQcm9qZWN0KCkgewotCQlyZXR1cm4gY29udGFpbmluZ1Byb2plY3Q7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFVSSU1hcCBnZXRJbnRlcm5hbFVSSU1hcCgpIHsKLQotCSAgICBpZiAodXJpTWFwID09IG51bGwpCi0JICAgIHsKLQkgICAgICBVUklNYXBwaW5nUmVnaXN0cnlJbXBsIG1hcHBpbmdSZWdpc3RyeUltcGwgPSAKLQkgICAgICAgIG5ldyBVUklNYXBwaW5nUmVnaXN0cnlJbXBsKCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkgICAgICAgICAgQE92ZXJyaWRlCi0JICAgICAgICAgIHByb3RlY3RlZCBVUkkgZGVsZWdhdGVkR2V0VVJJKFVSSSB1cmkpCi0JICAgICAgICAgIHsKLQkgICAgICAgIAlpZiAoTW9kdWxlVVJJVXRpbC5oYXNDb250ZW50VHlwZU5hbWUodXJpKSkKLQkgICAgICAgIAkJcmV0dXJuIG5ld1BsYXRmb3JtVVJJKHVyaSk7Ci0JICAgICAgICAgICAgcmV0dXJuIFVSSU1hcHBpbmdSZWdpc3RyeUltcGwuSU5TVEFOQ0UuZ2V0VVJJKHVyaSk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH07Ci0KLQkgICAgICB1cmlNYXAgPSAoVVJJTWFwKW1hcHBpbmdSZWdpc3RyeUltcGwubWFwKCk7Ci0JICAgIH0KLQotCSAgICBVUklNYXAgdXJpQ29udmVydGVySW1wbFVSSU1hcCA9IG51bGw7Ci0JICAgIGlmICh1cmlNYXAgaW5zdGFuY2VvZiBVUklNYXApCi0JICAgIHsKLQkgICAgCXVyaUNvbnZlcnRlckltcGxVUklNYXAgPSAoVVJJTWFwKXVyaU1hcDsKLQkgICAgfQotCSAgICByZXR1cm4gdXJpQ29udmVydGVySW1wbFVSSU1hcDsKLQkgIAotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQ3NDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9uZW50UmVzb3VyY2VJbXBsLmphdmEsdiAxLjMgMjAwNi8wMS8xMSAxODo0MDozMSBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29ya2JlbmNoIE1vZHVsZSBSZXNvdXJjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsI2dldFNvdXJjZVBhdGggPGVtPlNvdXJjZSBQYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRSZXNvdXJjZUltcGwjZ2V0UnVudGltZVBhdGggPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsI2dldEV4Y2x1c2lvbnMgPGVtPkV4Y2x1c2lvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFJlc291cmNlSW1wbCNnZXRDb21wb25lbnQgPGVtPkNvbXBvbmVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsI2dldFJlc291cmNlVHlwZSA8ZW0+UmVzb3VyY2UgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFJlc291cmNlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29tcG9uZW50UmVzb3VyY2UgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2VQYXRoKCkgPGVtPlNvdXJjZSBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2VQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElQYXRoIFNPVVJDRV9QQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZVBhdGgoKSA8ZW0+U291cmNlIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvdXJjZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBzb3VyY2VQYXRoID0gU09VUkNFX1BBVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UnVudGltZVBhdGgoKSA8ZW0+UnVudGltZSBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSdW50aW1lUGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUGF0aCBSVU5USU1FX1BBVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UnVudGltZVBhdGgoKSA8ZW0+UnVudGltZSBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSdW50aW1lUGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIHJ1bnRpbWVQYXRoID0gUlVOVElNRV9QQVRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjbHVzaW9ucygpIDxlbT5FeGNsdXNpb25zPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4Y2x1c2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleGNsdXNpb25zID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VUeXBlKCkgPGVtPlJlc291cmNlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfVFlQRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VUeXBlKCkgPGVtPlJlc291cmNlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVR5cGUgPSBSRVNPVVJDRV9UWVBFX0VERUZBVUxUOwotCi0JcHJvdGVjdGVkIElQcm9qZWN0IG93bmluZ1Byb2plY3Q7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVklSVFVBTCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVEID0gMTsKLQkKLQlwcml2YXRlIGludCB0eXBlID0gUEVSU0lTVEVEOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvbmVudFJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRTb3VyY2VQYXRoKCkgewotCQlyZXR1cm4gc291cmNlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VQYXRoKElQYXRoIG5ld1NvdXJjZVBhdGgpIHsKLQkJSVBhdGggb2xkU291cmNlUGF0aCA9IHNvdXJjZVBhdGg7Ci0JCXNvdXJjZVBhdGggPSBuZXdTb3VyY2VQYXRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1NPVVJDRV9QQVRILCBvbGRTb3VyY2VQYXRoLCBzb3VyY2VQYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKCkgewotCQlyZXR1cm4gcnVudGltZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVBhdGgoSVBhdGggbmV3UnVudGltZVBhdGgpIHsKLQkJSVBhdGggb2xkUnVudGltZVBhdGggPSBydW50aW1lUGF0aDsKLQkJcnVudGltZVBhdGggPSBuZXdSdW50aW1lUGF0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19SVU5USU1FX1BBVEgsIG9sZFJ1bnRpbWVQYXRoLCBydW50aW1lUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeGNsdXNpb25zKCkgewotCQlpZiAoZXhjbHVzaW9ucyA9PSBudWxsKSB7Ci0JCQlleGNsdXNpb25zID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19FWENMVVNJT05TKTsKLQkJfQotCQlyZXR1cm4gZXhjbHVzaW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdvcmtiZW5jaENvbXBvbmVudCllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudChXb3JrYmVuY2hDb21wb25lbnQgbmV3Q29tcG9uZW50KSB7Ci0JCWlmIChuZXdDb21wb25lbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCAmJiBuZXdDb21wb25lbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdDb21wb25lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0NvbXBvbmVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb21wb25lbnQpLmVJbnZlcnNlQWRkKHRoaXMsIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUywgV29ya2JlbmNoQ29tcG9uZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdDb21wb25lbnQsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5ULCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5ULCBuZXdDb21wb25lbnQsIG5ld0NvbXBvbmVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShTdHJpbmcgbmV3UmVzb3VyY2VUeXBlKSB7Ci0JCVN0cmluZyBvbGRSZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7Ci0JCXJlc291cmNlVHlwZSA9IG5ld1Jlc291cmNlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19SRVNPVVJDRV9UWVBFLCBvbGRSZXNvdXJjZVR5cGUsIHJlc291cmNlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQ6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUywgV29ya2JlbmNoQ29tcG9uZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19TT1VSQ0VfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0U291cmNlUGF0aCgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JVTlRJTUVfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0UnVudGltZVBhdGgoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19FWENMVVNJT05TOgotCQkJCXJldHVybiBnZXRFeGNsdXNpb25zKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5UOgotCQkJCXJldHVybiBnZXRDb21wb25lbnQoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19SRVNPVVJDRV9UWVBFOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fU09VUkNFX1BBVEg6Ci0JCQkJc2V0U291cmNlUGF0aCgoSVBhdGgpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19SVU5USU1FX1BBVEg6Ci0JCQkJc2V0UnVudGltZVBhdGgoKElQYXRoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fRVhDTFVTSU9OUzoKLQkJCQlnZXRFeGNsdXNpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFeGNsdXNpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5UOgotCQkJCXNldENvbXBvbmVudCgoV29ya2JlbmNoQ29tcG9uZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fUkVTT1VSQ0VfVFlQRToKLQkJCQlzZXRSZXNvdXJjZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19TT1VSQ0VfUEFUSDoKLQkJCQlzZXRTb3VyY2VQYXRoKFNPVVJDRV9QQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fUlVOVElNRV9QQVRIOgotCQkJCXNldFJ1bnRpbWVQYXRoKFJVTlRJTUVfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0VYQ0xVU0lPTlM6Ci0JCQkJZ2V0RXhjbHVzaW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVDoKLQkJCQlzZXRDb21wb25lbnQoKFdvcmtiZW5jaENvbXBvbmVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fUkVTT1VSQ0VfVFlQRToKLQkJCQlzZXRSZXNvdXJjZVR5cGUoUkVTT1VSQ0VfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fU09VUkNFX1BBVEg6Ci0JCQkJcmV0dXJuIFNPVVJDRV9QQVRIX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2VQYXRoICE9IG51bGwgOiAhU09VUkNFX1BBVEhfRURFRkFVTFQuZXF1YWxzKHNvdXJjZVBhdGgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JVTlRJTUVfUEFUSDoKLQkJCQlyZXR1cm4gUlVOVElNRV9QQVRIX0VERUZBVUxUID09IG51bGwgPyBydW50aW1lUGF0aCAhPSBudWxsIDogIVJVTlRJTUVfUEFUSF9FREVGQVVMVC5lcXVhbHMocnVudGltZVBhdGgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0VYQ0xVU0lPTlM6Ci0JCQkJcmV0dXJuIGV4Y2x1c2lvbnMgIT0gbnVsbCAmJiAhZXhjbHVzaW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5UOgotCQkJCXJldHVybiBnZXRDb21wb25lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEU6Ci0JCQkJcmV0dXJuIFJFU09VUkNFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVHlwZSAhPSBudWxsIDogIVJFU09VUkNFX1RZUEVfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzb3VyY2VQYXRoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzb3VyY2VQYXRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBydW50aW1lUGF0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocnVudGltZVBhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4Y2x1c2lvbnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4Y2x1c2lvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVzb3VyY2VUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRPd25pbmdQcm9qZWN0KCkgewotCQlyZXR1cm4gb3duaW5nUHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25pbmdQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCW93bmluZ1Byb2plY3QgPSBhUHJvamVjdDsKLQl9Ci0JCi0KLX0gLy9Db21wb25lbnRSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMyZjIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb25lbnRUeXBlSW1wbC5qYXZhLHYgMS4xIDIwMDUvMDQvMDQgMDc6MDQ6NTkgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TW9kdWxlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFR5cGVJbXBsI2dldENvbXBvbmVudFR5cGVJZCA8ZW0+Q29tcG9uZW50IFR5cGUgSWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFR5cGVJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFR5cGVJbXBsI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFR5cGVJbXBsI2dldE1ldGFkYXRhUmVzb3VyY2VzIDxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29tcG9uZW50VHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBvbmVudFR5cGVJZCgpIDxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZUlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfVFlQRV9JRF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9uZW50VHlwZUlkKCkgPGVtPkNvbXBvbmVudCBUeXBlIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcG9uZW50VHlwZUlkID0gQ09NUE9ORU5UX1RZUEVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByb3BlcnRpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKSA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGFkYXRhUmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0YWRhdGFSZXNvdXJjZXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvbmVudFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGVJZCgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlSWQoU3RyaW5nIG5ld0NvbXBvbmVudFR5cGVJZCkgewotCQlTdHJpbmcgb2xkQ29tcG9uZW50VHlwZUlkID0gY29tcG9uZW50VHlwZUlkOwotCQljb21wb25lbnRUeXBlSWQgPSBuZXdDb21wb25lbnRUeXBlSWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19DT01QT05FTlRfVFlQRV9JRCwgb2xkQ29tcG9uZW50VHlwZUlkLCBjb21wb25lbnRUeXBlSWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKSB7Ci0JCWlmIChtZXRhZGF0YVJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQltZXRhZGF0YVJlc291cmNlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChJUGF0aC5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGFkYXRhUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQcm9wZXJ0aWVzKCkgewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChQcm9wZXJ0eS5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEOgotCQkJCXJldHVybiBnZXRDb21wb25lbnRUeXBlSWQoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19DT01QT05FTlRfVFlQRV9JRDoKLQkJCQlzZXRDb21wb25lbnRUeXBlSWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fTUVUQURBVEFfUkVTT1VSQ0VTOgotCQkJCWdldE1ldGFkYXRhUmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRhZGF0YVJlc291cmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEOgotCQkJCXNldENvbXBvbmVudFR5cGVJZChDT01QT05FTlRfVFlQRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fTUVUQURBVEFfUkVTT1VSQ0VTOgotCQkJCWdldE1ldGFkYXRhUmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEOgotCQkJCXJldHVybiBDT01QT05FTlRfVFlQRV9JRF9FREVGQVVMVCA9PSBudWxsID8gY29tcG9uZW50VHlwZUlkICE9IG51bGwgOiAhQ09NUE9ORU5UX1RZUEVfSURfRURFRkFVTFQuZXF1YWxzKGNvbXBvbmVudFR5cGVJZCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fTUVUQURBVEFfUkVTT1VSQ0VTOgotCQkJCXJldHVybiBtZXRhZGF0YVJlc291cmNlcyAhPSBudWxsICYmICFtZXRhZGF0YVJlc291cmNlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21wb25lbnRUeXBlSWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbXBvbmVudFR5cGVJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0YWRhdGFSZXNvdXJjZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGFkYXRhUmVzb3VyY2VzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29tcG9uZW50VHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudGNvcmVGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiY2FiMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb25lbnRjb3JlRmFjdG9yeUltcGwuamF2YSx2IDEuOCAyMDA2LzA0LzI3IDA0OjE3OjQwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQ29tcG9uZW50Y29yZUZhY3RvcnkgewotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvbmVudGNvcmVGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlDb21wb25lbnRjb3JlRmFjdG9yeSB0aGVDb21wb25lbnRjb3JlRmFjdG9yeSA9IChDb21wb25lbnRjb3JlRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiY29tcG9uZW50Y29yZS54bWkiKTsgCi0JCQlpZiAodGhlQ29tcG9uZW50Y29yZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVDb21wb25lbnRjb3JlRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21wb25lbnRjb3JlRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRjb3JlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVDogcmV0dXJuIGNyZWF0ZVdvcmtiZW5jaENvbXBvbmVudCgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0U6IHJldHVybiBjcmVhdGVDb21wb25lbnRSZXNvdXJjZSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRTogcmV0dXJuIGNyZWF0ZUNvbXBvbmVudFR5cGUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFk6IHJldHVybiBjcmVhdGVQcm9wZXJ0eSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVDogcmV0dXJuIGNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTOiByZXR1cm4gY3JlYXRlUHJvamVjdENvbXBvbmVudHMoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkRFUEVOREVOQ1lfVFlQRTogewotCQkJCURlcGVuZGVuY3lUeXBlIHJlc3VsdCA9IERlcGVuZGVuY3lUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLklQQVRIOgotCQkJCXJldHVybiBjcmVhdGVJUGF0aEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5VUkk6Ci0JCQkJcmV0dXJuIGNyZWF0ZVVSSUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuREVQRU5ERU5DWV9UWVBFOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5JUEFUSDoKLQkJCQlyZXR1cm4gY29udmVydElQYXRoVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuVVJJOgotCQkJCXJldHVybiBjb252ZXJ0VVJJVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgY3JlYXRlV29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlXb3JrYmVuY2hDb21wb25lbnRJbXBsIHdvcmtiZW5jaENvbXBvbmVudCA9IG5ldyBXb3JrYmVuY2hDb21wb25lbnRJbXBsKCk7Ci0JCXJldHVybiB3b3JrYmVuY2hDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlIGNyZWF0ZUNvbXBvbmVudFJlc291cmNlKCkgewotCQlDb21wb25lbnRSZXNvdXJjZUltcGwgY29tcG9uZW50UmVzb3VyY2UgPSBuZXcgQ29tcG9uZW50UmVzb3VyY2VJbXBsKCk7Ci0JCXJldHVybiBjb21wb25lbnRSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50VHlwZSBjcmVhdGVDb21wb25lbnRUeXBlKCkgewotCQlDb21wb25lbnRUeXBlSW1wbCBjb21wb25lbnRUeXBlID0gbmV3IENvbXBvbmVudFR5cGVJbXBsKCk7Ci0JCXJldHVybiBjb21wb25lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eSgpIHsKLQkJUHJvcGVydHlJbXBsIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gcHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlZmVyZW5jZWRDb21wb25lbnQgY3JlYXRlUmVmZXJlbmNlZENvbXBvbmVudCgpIHsKLQkJUmVmZXJlbmNlZENvbXBvbmVudEltcGwgcmVmZXJlbmNlZENvbXBvbmVudCA9IG5ldyBSZWZlcmVuY2VkQ29tcG9uZW50SW1wbCgpOwotCQlyZXR1cm4gcmVmZXJlbmNlZENvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvamVjdENvbXBvbmVudHMgY3JlYXRlUHJvamVjdENvbXBvbmVudHMoKSB7Ci0JCVByb2plY3RDb21wb25lbnRzSW1wbCBwcm9qZWN0Q29tcG9uZW50cyA9IG5ldyBQcm9qZWN0Q29tcG9uZW50c0ltcGwoKTsKLQkJcmV0dXJuIHByb2plY3RDb21wb25lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGF0aCBjcmVhdGVJUGF0aEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKElQYXRoKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydElQYXRoVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgY3JlYXRlVVJJRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoVVJJKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFVSSVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50Y29yZVBhY2thZ2UgZ2V0Q29tcG9uZW50Y29yZVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoQ29tcG9uZW50Y29yZVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50Y29yZVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Db21wb25lbnRjb3JlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudGNvcmVQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OGJhNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb25lbnRjb3JlUGFja2FnZUltcGwuamF2YSx2IDEuOSAyMDA2LzA0LzI3IDA0OjE3OjQwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ29tcG9uZW50Y29yZVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtiZW5jaENvbXBvbmVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb21wb25lbnRSZXNvdXJjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb21wb25lbnRUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb3BlcnR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvamVjdENvbXBvbmVudHNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkZXBlbmRlbmN5VHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGlQYXRoRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVyaUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50Y29yZVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENvbXBvbmVudGNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbXBvbmVudGNvcmVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsIHRoZUNvbXBvbmVudGNvcmVQYWNrYWdlID0gKENvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21wb25lbnRjb3JlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBDb21wb25lbnRjb3JlUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUNvbXBvbmVudGNvcmVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlQ29tcG9uZW50Y29yZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQ29tcG9uZW50Y29yZVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUNvbXBvbmVudGNvcmVQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlyZXR1cm4gd29ya2JlbmNoQ29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtiZW5jaENvbXBvbmVudF9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya2JlbmNoQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Jlc291cmNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdvcmtiZW5jaENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtiZW5jaENvbXBvbmVudF9Db21wb25lbnRUeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd29ya2JlbmNoQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya2JlbmNoQ29tcG9uZW50X1JlZmVyZW5jZWRDb21wb25lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd29ya2JlbmNoQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrYmVuY2hDb21wb25lbnRfTWV0YWRhdGFSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbXBvbmVudFJlc291cmNlKCkgewotCQlyZXR1cm4gY29tcG9uZW50UmVzb3VyY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50UmVzb3VyY2VfU291cmNlUGF0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvbmVudFJlc291cmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50UmVzb3VyY2VfUnVudGltZVBhdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb25lbnRSZXNvdXJjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX0V4Y2x1c2lvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb25lbnRSZXNvdXJjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbXBvbmVudFJlc291cmNlX0NvbXBvbmVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbXBvbmVudFJlc291cmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50UmVzb3VyY2VfUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbXBvbmVudFR5cGUoKSB7Ci0JCXJldHVybiBjb21wb25lbnRUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvbmVudFR5cGVfQ29tcG9uZW50VHlwZUlkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcG9uZW50VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvbmVudFR5cGVfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvbmVudFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb21wb25lbnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50VHlwZV9NZXRhZGF0YVJlc291cmNlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvbmVudFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb3BlcnR5KCkgewotCQlyZXR1cm4gcHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9IYW5kbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9SdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVuY3lUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVmZXJlbmNlZENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlZmVyZW5jZWRDb21wb25lbnRfRGVwZW5kZW50T2JqZWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVmZXJlbmNlZENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlZmVyZW5jZWRDb21wb25lbnRfQXJjaGl2ZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9qZWN0Q29tcG9uZW50cygpIHsKLQkJcmV0dXJuIHByb2plY3RDb21wb25lbnRzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RDb21wb25lbnRzX1Byb2plY3ROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvamVjdENvbXBvbmVudHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0Q29tcG9uZW50c19Db21wb25lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvamVjdENvbXBvbmVudHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0Q29tcG9uZW50c19WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvamVjdENvbXBvbmVudHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RGVwZW5kZW5jeVR5cGUoKSB7Ci0JCXJldHVybiBkZXBlbmRlbmN5VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SVBhdGgoKSB7Ci0JCXJldHVybiBpUGF0aEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50Y29yZUZhY3RvcnkgZ2V0Q29tcG9uZW50Y29yZUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQ29tcG9uZW50Y29yZUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJd29ya2JlbmNoQ29tcG9uZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktCRU5DSF9DT01QT05FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtiZW5jaENvbXBvbmVudEVDbGFzcywgV09SS0JFTkNIX0NPTVBPTkVOVF9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya2JlbmNoQ29tcG9uZW50RUNsYXNzLCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19SRVNPVVJDRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtiZW5jaENvbXBvbmVudEVDbGFzcywgV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtiZW5jaENvbXBvbmVudEVDbGFzcywgV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVGRVJFTkNFRF9DT01QT05FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdPUktCRU5DSF9DT01QT05FTlRfX1BST1BFUlRJRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtiZW5jaENvbXBvbmVudEVDbGFzcywgV09SS0JFTkNIX0NPTVBPTkVOVF9fTUVUQURBVEFfUkVTT1VSQ0VTKTsKLQotCQljb21wb25lbnRSZXNvdXJjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT01QT05FTlRfUkVTT1VSQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBvbmVudFJlc291cmNlRUNsYXNzLCBDT01QT05FTlRfUkVTT1VSQ0VfX1NPVVJDRV9QQVRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb25lbnRSZXNvdXJjZUVDbGFzcywgQ09NUE9ORU5UX1JFU09VUkNFX19SVU5USU1FX1BBVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBvbmVudFJlc291cmNlRUNsYXNzLCBDT01QT05FTlRfUkVTT1VSQ0VfX0VYQ0xVU0lPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbXBvbmVudFJlc291cmNlRUNsYXNzLCBDT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MsIENPTVBPTkVOVF9SRVNPVVJDRV9fUkVTT1VSQ0VfVFlQRSk7Ci0KLQkJY29tcG9uZW50VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT01QT05FTlRfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9uZW50VHlwZUVDbGFzcywgQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb25lbnRUeXBlRUNsYXNzLCBDT01QT05FTlRfVFlQRV9fVkVSU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29tcG9uZW50VHlwZUVDbGFzcywgQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBvbmVudFR5cGVFQ2xhc3MsIENPTVBPTkVOVF9UWVBFX19NRVRBREFUQV9SRVNPVVJDRVMpOwotCi0JCXByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fVkFMVUUpOwotCi0JCXJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVGRVJFTkNFRF9DT01QT05FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MsIFJFRkVSRU5DRURfQ09NUE9ORU5UX19IQU5ETEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MsIFJFRkVSRU5DRURfQ09NUE9ORU5UX19SVU5USU1FX1BBVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MsIFJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTkNZX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MsIFJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTlRfT0JKRUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fQVJDSElWRV9OQU1FKTsKLQotCQlwcm9qZWN0Q29tcG9uZW50c0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9KRUNUX0NPTVBPTkVOVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2plY3RDb21wb25lbnRzRUNsYXNzLCBQUk9KRUNUX0NPTVBPTkVOVFNfX1BST0pFQ1RfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvamVjdENvbXBvbmVudHNFQ2xhc3MsIFBST0pFQ1RfQ09NUE9ORU5UU19fQ09NUE9ORU5UUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvamVjdENvbXBvbmVudHNFQ2xhc3MsIFBST0pFQ1RfQ09NUE9ORU5UU19fVkVSU0lPTik7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWRlcGVuZGVuY3lUeXBlRUVudW0gPSBjcmVhdGVFRW51bShERVBFTkRFTkNZX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCWlQYXRoRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKElQQVRIKTsKLQkJdXJpRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFVSSSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdvcmtiZW5jaENvbXBvbmVudC5jbGFzcywgIldvcmtiZW5jaENvbXBvbmVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya2JlbmNoQ29tcG9uZW50X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCAiIiwgMSwgMSwgV29ya2JlbmNoQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXb3JrYmVuY2hDb21wb25lbnRfUmVzb3VyY2VzKCksIHRoaXMuZ2V0Q29tcG9uZW50UmVzb3VyY2UoKSwgdGhpcy5nZXRDb21wb25lbnRSZXNvdXJjZV9Db21wb25lbnQoKSwgInJlc291cmNlcyIsIG51bGwsIDAsIC0xLCBXb3JrYmVuY2hDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXb3JrYmVuY2hDb21wb25lbnRfQ29tcG9uZW50VHlwZSgpLCB0aGlzLmdldENvbXBvbmVudFR5cGUoKSwgbnVsbCwgImNvbXBvbmVudFR5cGUiLCBudWxsLCAxLCAxLCBXb3JrYmVuY2hDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXb3JrYmVuY2hDb21wb25lbnRfUmVmZXJlbmNlZENvbXBvbmVudHMoKSwgdGhpcy5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCksIG51bGwsICJyZWZlcmVuY2VkQ29tcG9uZW50cyIsIG51bGwsIDAsIC0xLCBXb3JrYmVuY2hDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXb3JrYmVuY2hDb21wb25lbnRfUHJvcGVydGllcygpLCB0aGlzLmdldFByb3BlcnR5KCksIG51bGwsICJwcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIFdvcmtiZW5jaENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya2JlbmNoQ29tcG9uZW50X01ldGFkYXRhUmVzb3VyY2VzKCksIHRoaXMuZ2V0SVBhdGgoKSwgIm1ldGFkYXRhUmVzb3VyY2VzIiwgbnVsbCwgMCwgLTEsIFdvcmtiZW5jaENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbXBvbmVudFJlc291cmNlRUNsYXNzLCBDb21wb25lbnRSZXNvdXJjZS5jbGFzcywgIkNvbXBvbmVudFJlc291cmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb25lbnRSZXNvdXJjZV9Tb3VyY2VQYXRoKCksIHRoaXMuZ2V0SVBhdGgoKSwgInNvdXJjZVBhdGgiLCBudWxsLCAxLCAxLCBDb21wb25lbnRSZXNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9uZW50UmVzb3VyY2VfUnVudGltZVBhdGgoKSwgdGhpcy5nZXRJUGF0aCgpLCAicnVudGltZVBhdGgiLCBudWxsLCAxLCAxLCBDb21wb25lbnRSZXNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9uZW50UmVzb3VyY2VfRXhjbHVzaW9ucygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXhjbHVzaW9ucyIsICIiLCAwLCAtMSwgQ29tcG9uZW50UmVzb3VyY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbXBvbmVudFJlc291cmNlX0NvbXBvbmVudCgpLCB0aGlzLmdldFdvcmtiZW5jaENvbXBvbmVudCgpLCB0aGlzLmdldFdvcmtiZW5jaENvbXBvbmVudF9SZXNvdXJjZXMoKSwgImNvbXBvbmVudCIsIG51bGwsIDEsIDEsIENvbXBvbmVudFJlc291cmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvbmVudFJlc291cmNlX1Jlc291cmNlVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VUeXBlIiwgIiIsIDEsIDEsIENvbXBvbmVudFJlc291cmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29tcG9uZW50VHlwZUVDbGFzcywgQ29tcG9uZW50VHlwZS5jbGFzcywgIkNvbXBvbmVudFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvbmVudFR5cGVfQ29tcG9uZW50VHlwZUlkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21wb25lbnRUeXBlSWQiLCAiIiwgMSwgMSwgQ29tcG9uZW50VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9uZW50VHlwZV9WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgIiIsIDEsIDEsIENvbXBvbmVudFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbXBvbmVudFR5cGVfUHJvcGVydGllcygpLCB0aGlzLmdldFByb3BlcnR5KCksIG51bGwsICJwcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIENvbXBvbmVudFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvbmVudFR5cGVfTWV0YWRhdGFSZXNvdXJjZXMoKSwgdGhpcy5nZXRJUGF0aCgpLCAibWV0YWRhdGFSZXNvdXJjZXMiLCBudWxsLCAwLCAtMSwgQ29tcG9uZW50VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb3BlcnR5RUNsYXNzLCBQcm9wZXJ0eS5jbGFzcywgIlByb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgIiIsIDEsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmFsdWUiLCAiIiwgMSwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLCBSZWZlcmVuY2VkQ29tcG9uZW50LmNsYXNzLCAiUmVmZXJlbmNlZENvbXBvbmVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9IYW5kbGUoKSwgdGhpcy5nZXRVUkkoKSwgImhhbmRsZSIsIG51bGwsIDEsIDEsIFJlZmVyZW5jZWRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlZmVyZW5jZWRDb21wb25lbnRfUnVudGltZVBhdGgoKSwgdGhpcy5nZXRJUGF0aCgpLCAicnVudGltZVBhdGgiLCBudWxsLCAxLCAxLCBSZWZlcmVuY2VkQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVuY3lUeXBlKCksIHRoaXMuZ2V0RGVwZW5kZW5jeVR5cGUoKSwgImRlcGVuZGVuY3lUeXBlIiwgbnVsbCwgMSwgMSwgUmVmZXJlbmNlZENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbnRPYmplY3QoKSwgZWNvcmVQYWNrYWdlLmdldEVPYmplY3QoKSwgbnVsbCwgImRlcGVuZGVudE9iamVjdCIsIG51bGwsIDAsIDEsIFJlZmVyZW5jZWRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlZmVyZW5jZWRDb21wb25lbnRfQXJjaGl2ZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImFyY2hpdmVOYW1lIiwgbnVsbCwgMCwgMSwgUmVmZXJlbmNlZENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2plY3RDb21wb25lbnRzRUNsYXNzLCBQcm9qZWN0Q29tcG9uZW50cy5jbGFzcywgIlByb2plY3RDb21wb25lbnRzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9qZWN0Q29tcG9uZW50c19Qcm9qZWN0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJvamVjdE5hbWUiLCAiIiwgMSwgMSwgUHJvamVjdENvbXBvbmVudHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2plY3RDb21wb25lbnRzX0NvbXBvbmVudHMoKSwgdGhpcy5nZXRXb3JrYmVuY2hDb21wb25lbnQoKSwgbnVsbCwgImNvbXBvbmVudHMiLCBudWxsLCAwLCAtMSwgUHJvamVjdENvbXBvbmVudHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9qZWN0Q29tcG9uZW50c19WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMSwgMSwgUHJvamVjdENvbXBvbmVudHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGRlcGVuZGVuY3lUeXBlRUVudW0sIERlcGVuZGVuY3lUeXBlLmNsYXNzLCAiRGVwZW5kZW5jeVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRlcGVuZGVuY3lUeXBlRUVudW0sIERlcGVuZGVuY3lUeXBlLlVTRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkZXBlbmRlbmN5VHlwZUVFbnVtLCBEZXBlbmRlbmN5VHlwZS5DT05TVU1FU19MSVRFUkFMKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZShpUGF0aEVEYXRhVHlwZSwgSVBhdGguY2xhc3MsICJJUGF0aCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFRGF0YVR5cGUodXJpRURhdGFUeXBlLCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLmNsYXNzLCAiVVJJIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGtleXdvcmRzCi0JCWNyZWF0ZUtleXdvcmRzQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmtleXdvcmRzPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVLZXl3b3Jkc0Fubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImtleXdvcmRzIjsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGlQYXRoRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAiZGF0YXR5cGUiLCBudWxsCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodXJpRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAiZGF0YXR5cGUiLCBudWxsCi0JCSAgIH0pOwotCX0KLQotfSAvL0NvbXBvbmVudGNvcmVQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvSU1vZHVsZVN0cnVjdHVyZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9JTW9kdWxlU3RydWN0dXJlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhOTdkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9JTW9kdWxlU3RydWN0dXJlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVTdHJ1Y3R1cmVMaXN0ZW5lciB7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RydWN0dXJlQ2hhbmdlZChNb2R1bGVTdHJ1Y3R1cmVFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0lSZXNvdXJjZUZhY3RvcnlFeHRQdENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvSVJlc291cmNlRmFjdG9yeUV4dFB0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTFhNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvSVJlc291cmNlRmFjdG9yeUV4dFB0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VGYWN0b3J5RXh0UHRDb25zdGFudHMgewotCQotCi0JU3RyaW5nIEVYVFBUX1JFU09VUkNFX0ZBQ1RPUklFUyA9ICJyZXNvdXJjZUZhY3RvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgVEFHX1JFU09VUkNFX0ZBQ1RPUlkgPSAicmVzb3VyY2VGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEFUVF9TSE9SVF9TRUdNRU5UID0gInNob3J0U2VnbWVudCI7IC8vJE5PTi1OTFMtMSQgCi0JCi0JU3RyaW5nIFRBR19DT05URU5UVFlQRSA9ICJjb250ZW50VHlwZUJpbmRpbmciOyAvLyROT04tTkxTLTEkIAotCQotCVN0cmluZyBBVFRfQ09OVEVOVFRZUEVJRCA9ICJjb250ZW50VHlwZUlkIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQlTdHJpbmcgQVRUX0lTREVGQVVMVCA9ICJpc0RlZmF1bHQiOyAvLyROT04tTkxTLTEkIAotCQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTWFwcGVkQ29tcG9uZW50WE1JSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9NYXBwZWRDb21wb25lbnRYTUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwY2NiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9NYXBwZWRDb21wb25lbnRYTUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLk1hcHBlZFhNSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotcHVibGljIGNsYXNzIE1hcHBlZENvbXBvbmVudFhNSUhlbHBlciBleHRlbmRzIE1hcHBlZFhNSUhlbHBlciB7Ci0KLQlwdWJsaWMgTWFwcGVkQ29tcG9uZW50WE1JSGVscGVyKFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgcHJlZml4ZXNUb1VSSXMpIHsKLQkJc3VwZXIocmVzb3VyY2UsIHByZWZpeGVzVG9VUklzKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIHJlc29sdmUoVVJJIHJlbGF0aXZlLCBVUkkgYmFzZSkgewotCQlVUkkgcmVzb2x2ZWQgPSBudWxsOwotCQlpZiAoIWlzTWFwcGVkKHJlbGF0aXZlKSkKLQkJCXJlc29sdmVkID0gcmVzb2x2ZVVSSUZyb21Db21wb25lbnQocmVsYXRpdmUsYmFzZSk7Ci0JCWVsc2UKLQkJCXJlc29sdmVkID0gcmVsYXRpdmU7Ci0JCQotCQlyZXR1cm4gcmVzb2x2ZWQgPT0gbnVsbCA/IHN1cGVyLnJlc29sdmUocmVsYXRpdmUsIGJhc2UpIDogcmVzb2x2ZWQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc01hcHBlZChVUkkgcmVsYXRpdmUpIHsKLQkJYm9vbGVhbiBpc01hcHBlZCA9IGZhbHNlOwotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJVVJJIGxvY2FscmVzb3VyY2VVUkkgPSByZWxhdGl2ZTsKLQkJCWlmIChyZWxhdGl2ZS5oYXNGcmFnbWVudCgpKQotCQkJCWxvY2FscmVzb3VyY2VVUkkgPSByZWxhdGl2ZS50cmltRnJhZ21lbnQoKTsKLQkJCWlzTWFwcGVkID0gISgoVVJJQ29udmVydGVySW1wbC5VUklNYXApIHNldC5nZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKGxvY2FscmVzb3VyY2VVUkkpLmVxdWFscyhsb2NhbHJlc291cmNlVVJJKTsKLQkJfQotCQlyZXR1cm4gaXNNYXBwZWQ7Ci0JfQotCQotCXByaXZhdGUgVVJJIHJlc29sdmVVUklGcm9tQ29tcG9uZW50KFVSSSByZWxhdGl2ZSwgVVJJIGJhc2UpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KGJhc2UpOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRmlsZSB2aXJ0dWFsRmlsZSA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChyZWxhdGl2ZS50b1N0cmluZygpKSk7Ci0JCQlpZiAodmlydHVhbEZpbGUgIT0gbnVsbCkgewotCQkJCUlQYXRoIHJlc29sdmluZ1BhdGggPSB2aXJ0dWFsRmlsZS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJCQlpZiAocmVzb2x2aW5nUGF0aCAhPW51bGwpIAotCQkJCQlyZXR1cm4gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocmVzb2x2aW5nUGF0aC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoVVJJIGJhc2UpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ID09IG51bGwgfHwgc2V0LmdldFVSSUNvbnZlcnRlcigpPT1udWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVVSSSBub3JtYWxpemVkID0gc2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZShiYXNlKTsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkobm9ybWFsaXplZCkpIHsKLQkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQbGF0Zm9ybUZpbGUobm9ybWFsaXplZCk7Ci0JCQlpZiAoZmlsZSAhPW51bGwpIHsKLQkJCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGZpbGUpOwotCQkJCWlmICh2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aD4wKQotCQkJCQlyZXR1cm4gdmlydHVhbFJlc291cmNlc1swXS5nZXRDb21wb25lbnQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbmRleGluZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUluZGV4aW5nQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ2ZTUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUluZGV4aW5nQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVJbmRleGluZ0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBNT0RVTEVfSU5ERVhJTkdfQURBUFRFUl9DTEFTUyA9IE1vZHVsZUluZGV4aW5nQWRhcHRlci5jbGFzczsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBhTm90aWZpY2F0aW9uKSB7Ci0JCWlmIChhTm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IG5vdGlmaWVyID0gKEVPYmplY3QpIGFOb3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllci5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSA9PSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFMpIHsKLQkJCQlQcm9qZWN0Q29tcG9uZW50c0ltcGwgcHJvamVjdE1vZHVsZXMgPSAoUHJvamVjdENvbXBvbmVudHNJbXBsKSBub3RpZmllcjsKLQkJCQlzeW5jaHJvbml6ZWQgKHByb2plY3RNb2R1bGVzLmdldE1vZHVsZXNJbmRleCgpKSB7Ci0JCQkJCXN3aXRjaCAoYU5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQkJCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gKFdvcmtiZW5jaENvbXBvbmVudCkgYU5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQkJCXByb2plY3RNb2R1bGVzLmdldE1vZHVsZXNJbmRleCgpLnB1dChtb2R1bGUuZ2V0TmFtZSgpLCBtb2R1bGUpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCX0KLQkJfSAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gTU9EVUxFX0lOREVYSU5HX0FEQVBURVJfQ0xBU1M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlU3RydWN0dXJhbE1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlU3RydWN0dXJhbE1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTIyMjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZVN0cnVjdHVyYWxNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGYWN0b3J5IGV4dGVuZHMgRWRpdE1vZGVsRmFjdG9yeSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1NUUlVDVFVSQUxfTU9ERUxfSUQgPSAib3JnLmVjbGlwc2Uud3N0Lm1vZHVsZWNvcmUuc3RydWN0dXJhbE1vZGVsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSNjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBNYXAgdGhlUGFyYW1zKSB7Ci0JCXJldHVybiBuZXcgTW9kdWxlU3RydWN0dXJhbE1vZGVsKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0cnVlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSNjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgYUNvbnRleHQsIE1hcCB0aGVQYXJhbXMpIHsKLQkJcmV0dXJuIG5ldyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoYW5FZGl0TW9kZWxJZCwgYUNvbnRleHQsIGZhbHNlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVTdHJ1Y3R1cmVFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlU3RydWN0dXJlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5MmUzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVTdHJ1Y3R1cmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjYsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotCi0vL2luIHByb2dyZXNzLi4uCi0KLXB1YmxpYyBjbGFzcyBNb2R1bGVTdHJ1Y3R1cmVFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLSAgICAvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIENvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzOwotCi0gICAgcHVibGljIE1vZHVsZVN0cnVjdHVyZUV2ZW50KE9iamVjdCBzb3VyY2UpIHsKLSAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1vZHVsZVN0cnVjdHVyZUV2ZW50KE9iamVjdCBzb3VyY2UsIENvbXBvbmVudFJlc291cmNlW10gdGhlTW9kdWxlUmVzb3VyY2VzKSB7Ci0gICAgICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgICAgIHJlc291cmNlcyA9IHRoZU1vZHVsZVJlc291cmNlczsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZ2V0TW91ZGxlUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VzOwotICAgIH0KLSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVVUklVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVVUklVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGM1MTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlVVJJVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVVSSVV0aWwgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfVVJJX1BST1RPQ09MID0gUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLk1PRFVMRV9QUk9UT0NPTCtJUGF0aC5TRVBBUkFUT1IrUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLlJFU09VUkNFX01PRFVMRStJUGF0aC5TRVBBUkFUT1I7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX1VSSV9QUk9UT0NPTCA9IFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5NT0RVTEVfUFJPVE9DT0wrSVBhdGguU0VQQVJBVE9SK1BsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5DTEFTU1BBVEggK0lQYXRoLlNFUEFSQVRPUjsKLQkKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBNb2R1bGVVUkkgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJfUFJPVE9DT0xfSU5EWCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0pFQ1RfTkFNRV9JTkRYID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9EVUxFX05BTUVfSU5EWCA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRV9JTkRYID0gMzsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1NDSEVNRSA9ICJwbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9QUk9UT0NPTCA9ICJyZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIDxwPgotCSAqIEEgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkgd2lsbCBjb250YWluIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgdGhlIGRlcGxveWVkIG5hbWUKLQkgKiBvZiB0aGUgbW9kdWxlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkKLQkgKiBAcmV0dXJuIFRoZSBkZXBsb3llZCBuYW1lIG9mIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cmVmZXJlbmNlZCBieSB0aGUgbW9kdWxlIFVSSQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKi8gCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVwbG95ZWROYW1lKFVSSSBhTW9kdWxlVVJJKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCWVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkoYU1vZHVsZVVSSSk7Ci0JCXJldHVybiBhTW9kdWxlVVJJLnNlZ21lbnQoTW9kdWxlVVJJLk1PRFVMRV9OQU1FX0lORFgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKFVSSSBhTW9kdWxlVVJJKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkksIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKFVSSSBhTW9kdWxlVVJJLCBib29sZWFuIHRvVGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlpZiAoYU1vZHVsZVVSSS5zZWdtZW50Q291bnQoKSA8IDMpIHsKLQkJCWlmKHRvVGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeSkKLQkJCQl0aHJvdyBuZXcgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihhTW9kdWxlVVJJKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShVUkkgYU1vZHVsZVVSSSkgewotCQlpZiAoYU1vZHVsZVVSSS5zZWdtZW50Q291bnQoKSA8IDMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZFBsYXRmb3JtVVJJKFVSSSBhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSSwgYm9vbGVhbiB0b1Rocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJaWYgKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLnNlZ21lbnRDb3VudCgpIDwgMiB8fCAhUExBVEZPUk1fU0NIRU1FLmVxdWFscyhhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSS5zY2hlbWUoKSkgfHwgIVJFU09VUkNFX1BST1RPQ09MLmVxdWFscyhhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSS5zZWdtZW50KDApKSkgewotCQkJaWYgKHRvVGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeSkKLQkJCQl0aHJvdyBuZXcgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRQbGF0Zm9ybVVSSShVUkkgYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkkpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZFBsYXRmb3JtVVJJKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSB0cmltTW9kdWxlUmVzb3VyY2VQYXRoVG9Nb2R1bGVVUkkoVVJJIGFNb2R1bGVSZXNvdXJjZVBhdGgpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShhTW9kdWxlUmVzb3VyY2VQYXRoKTsKLQkJaW50IHRyaW1JbmRleCA9IChoYXNDb250ZW50VHlwZU5hbWUoYU1vZHVsZVJlc291cmNlUGF0aCkgPyA0IDogMyk7Ci0JCXJldHVybiBhTW9kdWxlUmVzb3VyY2VQYXRoLnRyaW1TZWdtZW50cyhhTW9kdWxlUmVzb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpIC0gdHJpbUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSB0cmltV29ya3NwYWNlUGF0aFRvUHJvamVjdFJlbGF0aXZlVVJJKFVSSSBhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlVUkkgcHJvamVjdFJlbGF0aXZlUGF0aCA9IG51bGw7Ci0JCS8qIENoZWNrIGZvciBhIG5vbi1oaWVyYWNoaWNhbCBXb3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCBvZiB0aGUgZm9ybSBwbGF0Zm9ybTovcmVzb3VyY2UvPHByb2plY3Q+Ly4uLiovCi0JCWlmIChlbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkUGxhdGZvcm1VUkkoYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkksIGZhbHNlKSkgewotCQkJaWYgKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLnNlZ21lbnRDb3VudCgpID09IDIpCi0JCQkJLyogVGhlIFVSSSBwb2ludHMgdG8gYSBwcm9qZWN0LCByZXNvbHZlIHRvIGFuIGVtcHR5IFVSSSAqLwotCQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvKgotCQkJICogVGhlIFVSSSBoYXMgdG8gYmUgPiAyIHNpbmNlIHRoZSB2YWxpZGF0aW9uIG1ldGhvZCBhYm92ZSBjaGVja3MgZm9yIDwgMiwgYW5kIGp1c3QKLQkJCSAqIGNoZWNrZWQgZm9yID09IDIgc28gaWYgWCBOT1QgPCAyIGFuZCBYIE5PVCA9PSAyLCBUSEVOID4gMgotCQkJICovCi0JCQlwcm9qZWN0UmVsYXRpdmVQYXRoID0gdHJpbVRvUmVsYXRpdmVQYXRoKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLCAyKTsKLQotCQl9IGVsc2UgaWYoYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkkuaXNIaWVyYXJjaGljYWwoKSAmJiBhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSS5wYXRoKCkuc3RhcnRzV2l0aCgiIitJUGF0aC5TRVBBUkFUT1IpKSB7Ci0JCQlwcm9qZWN0UmVsYXRpdmVQYXRoID0gdHJpbVRvUmVsYXRpdmVQYXRoKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLCAxKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJKTsKLQkJfQotCQlyZXR1cm4gcHJvamVjdFJlbGF0aXZlUGF0aDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBVUkkgdHJpbVRvUmVsYXRpdmVQYXRoKFVSSSBhVVJJLCBpbnQgYVN0YXJ0SW5kZXgpIHsKLQkJU3RyaW5nQnVmZmVyIHJlbGF0aXZlUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgc2VnbWVudEluZGV4ID0gYVN0YXJ0SW5kZXg7IHNlZ21lbnRJbmRleCA8IGFVUkkuc2VnbWVudENvdW50KCk7IHNlZ21lbnRJbmRleCsrKSB7Ci0JCQlyZWxhdGl2ZVBhdGguYXBwZW5kKGFVUkkuc2VnbWVudChzZWdtZW50SW5kZXgpKTsKLQkJCWlmIChzZWdtZW50SW5kZXggPCAoYVVSSS5zZWdtZW50Q291bnQoKSAtIDEpKQotCQkJCXJlbGF0aXZlUGF0aC5hcHBlbmQoSVBhdGguU0VQQVJBVE9SKTsKLQkJfQotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShyZWxhdGl2ZVBhdGgudG9TdHJpbmcoKSk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBwYXJhbSBhTW9kdWxlUmVzb3VyY2VQYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJJIHRyaW1Ub0RlcGxveVBhdGhTZWdtZW50KFVSSSBhRnVsbHlRdWFsaWZpZWRNb2R1bGVSZXNvdXJjZVBhdGgpIHsKLQkJaW50IHNlZ21lbnRDb3VudCA9IGFGdWxseVF1YWxpZmllZE1vZHVsZVJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJVVJJIHVyaTsKLQkJaW50IHRyaW1JbmRleCA9IChoYXNDb250ZW50VHlwZU5hbWUoYUZ1bGx5UXVhbGlmaWVkTW9kdWxlUmVzb3VyY2VQYXRoKSA/IDUgOiA0KTsKLQkJaWYoc2VnbWVudENvdW50ID4gdHJpbUluZGV4KXsKLQkJCXVyaSA9IGFGdWxseVF1YWxpZmllZE1vZHVsZVJlc291cmNlUGF0aC5kZXJlc29sdmUoYUZ1bGx5UXVhbGlmaWVkTW9kdWxlUmVzb3VyY2VQYXRoLnRyaW1TZWdtZW50cyhzZWdtZW50Q291bnQgLSB0cmltSW5kZXgpLCBmYWxzZSxmYWxzZSx0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXVyaSA9IFVSSS5jcmVhdGVVUkkoYUZ1bGx5UXVhbGlmaWVkTW9kdWxlUmVzb3VyY2VQYXRoLnNlZ21lbnQoc2VnbWVudENvdW50LTEpKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGNvbmNhdChVUkkgdXJpMSwgVVJJIHVyaTIpewotCSAgICBVUkkgY29uY2F0VVJJID0gdXJpMS5hcHBlbmRTZWdtZW50cyh1cmkyLnNlZ21lbnRzKCkpOwotCSAgICByZXR1cm4gY29uY2F0VVJJOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSSSBmdWxseVF1YWxpZnlVUkkoV29ya2JlbmNoQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmKGVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkoYUNvbXBvbmVudC5nZXRIYW5kbGUoKSwgZmFsc2UpKQotCQkJCXJldHVybiBhQ29tcG9uZW50LmdldEhhbmRsZSgpOyAKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGFDb21wb25lbnQpOwotCQkJaWYocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoUkVTT1VSQ0VfVVJJX1BST1RPQ09MICsgcHJvamVjdC5nZXROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKyBhQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCQl9IAotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOyAKLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIFVSSSBmdWxseVF1YWxpZnlVUkkoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoUkVTT1VSQ0VfVVJJX1BST1RPQ09MICsgYVByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgYVByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBVUkkgZnVsbHlRdWFsaWZ5VVJJKElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgY29udGVudFR5cGVEZXNjcmliZXIpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoUkVTT1VSQ0VfVVJJX1BST1RPQ09MICsgYVByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgYVByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgY29udGVudFR5cGVEZXNjcmliZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGFyY2hpdmVDb21wb25lbnRmdWxseVF1YWxpZnlVUkkoU3RyaW5nIGFDb21wb25lbnROYW1lKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKEFSQ0hJVkVfVVJJX1BST1RPQ09MICsgYUNvbXBvbmVudE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGFzc1BhdGhVUkkoVVJJIHVyaSl7Ci0JCWlmKHVyaSE9bnVsbCAmJiBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uQ0xBU1NQQVRILmVxdWFscyh1cmkuc2VnbWVudCgwKSApKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXJjaGl2ZVR5cGUoVVJJIGFNb2R1bGVVUkkpdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQllbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkkpOwotCQlyZXR1cm4gYU1vZHVsZVVSSS5zZWdtZW50KE1vZHVsZVVSSS5QUk9KRUNUX05BTUVfSU5EWCk7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoVVJJIGFNb2R1bGVVUkkpdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQllbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkkpOwotCQlVUkkgdXJpID0gdHJpbVRvUmVsYXRpdmVQYXRoKGFNb2R1bGVVUkksIE1vZHVsZVVSSS5NT0RVTEVfTkFNRV9JTkRYKTsKLQkJcmV0dXJuIHVyaS50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIYW5kbGVTdHJpbmcoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCl7Ci0JCWlmIChhQ29tcG9uZW50LmlzQmluYXJ5KCkpCi0JCQlyZXR1cm4gTW9kdWxlVVJJVXRpbC5hcmNoaXZlQ29tcG9uZW50ZnVsbHlRdWFsaWZ5VVJJKGFDb21wb25lbnQuZ2V0TmFtZSgpKS50b1N0cmluZygpOwotCQllbHNlCi0JCQlyZXR1cm4gIlsiICsgYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSArICJdOiIgKyBhQ29tcG9uZW50LmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGVOYW1lKFVSSSB1cmkpIHsKLQkJCi0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkgfHwgIWlzVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSSh1cmkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlkZW50aWZpZXIgPSAodXJpLnNlZ21lbnRDb3VudCgpID4gMyA/IHVyaS5zZWdtZW50KE1vZHVsZVVSSS5DT05URU5UX1RZUEVfSU5EWCkgOiBudWxsKTsKLQkJaWYgKGNvbnRlbnRUeXBlSWRlbnRpZmllciAhPSBudWxsICYmIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKHVyaS5zZWdtZW50KE1vZHVsZVVSSS5DT05URU5UX1RZUEVfSU5EWCkpICE9IG51bGwpCi0JCQlyZXR1cm4gY29udGVudFR5cGVJZGVudGlmaWVyOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRlbnRUeXBlTmFtZShVUkkgdXJpKSB7Ci0JCQotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgY29udGVudFR5cGVJZGVudGlmaWVyID0gKHVyaS5zZWdtZW50Q291bnQoKSA+IDMgPyB1cmkuc2VnbWVudChNb2R1bGVVUkkuQ09OVEVOVF9UWVBFX0lORFgpIDogbnVsbCk7Ci0JCWlmIChjb250ZW50VHlwZUlkZW50aWZpZXIgIT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZSh1cmkuc2VnbWVudChNb2R1bGVVUkkuQ09OVEVOVF9UWVBFX0lORFgpKSAhPSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9QbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1BsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDMzNjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1BsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIwLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LlBsYXRmb3JtVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QuUGxhdGZvcm1VUkxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbiBleHRlbmRzIFBsYXRmb3JtVVJMQ29ubmVjdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEUgPSAibW9kdWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9QUk9UT0NPTCA9IE1PRFVMRSArIFBsYXRmb3JtVVJMSGFuZGxlci5QUk9UT0NPTF9TRVBBUkFUT1I7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIID0gImNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX01PRFVMRSA9ICJyZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUllfTU9EVUxFID0gImJpbmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbihVUkwgYVVSTCkgewotCQlzdXBlcihhVVJMKTsKLQl9Ci0gCi0JcHVibGljIHN0YXRpYyBVUkkgcmVzb2x2ZShVUkkgYU1vZHVsZVJlc291cmNlUnVudGltZVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBjb21wb25lbnRQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChhTW9kdWxlUmVzb3VyY2VSdW50aW1lUGF0aCk7Ci0JCQkvL1N0cmluZyBjb21wb25lbnROYW1lID0gTW9kdWxlVVJJVXRpbC5nZXREZXBsb3llZE5hbWUoYU1vZHVsZVJlc291cmNlUnVudGltZVBhdGgpOwotCQkJVVJJIHJ1bnRpbWVVUkkgPSBNb2R1bGVVUklVdGlsLnRyaW1Ub0RlcGxveVBhdGhTZWdtZW50KGFNb2R1bGVSZXNvdXJjZVJ1bnRpbWVQYXRoKTsKLQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gbmV3IFBhdGgocnVudGltZVVSSS5wYXRoKCkpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50UHJvamVjdCk7Ci0JCQkvL0lWaXJ0dWFsRmlsZSB2RmlsZSA9IGNvbXBvbmVudC5nZXRGaWxlKHJ1bnRpbWVQYXRoKTsKLQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJaW50IG1hdGNoaW5nU2VncyA9IHJ1bnRpbWVQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhyb290Rm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCQlpZihtYXRjaGluZ1NlZ3MgPiAwKQotCQkJCXJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhtYXRjaGluZ1NlZ3MpOwotCQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gcm9vdEZvbGRlci5nZXRGaWxlKHJ1bnRpbWVQYXRoKTsKLQkJCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSSh2RmlsZS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gYU1vZHVsZVJlc291cmNlUnVudGltZVBhdGg7Ci0JCSAKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIFVSSSBub3JtYWxpemVUb1dvcmtzcGFjZVJlbGF0aXZlKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHNvdXJjZVBhdGgsIFVSSSBtb2R1bGVSZXNvdXJjZURlcGxveVBhdGgpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLS8vCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKLS8vCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShwcm9qZWN0TmFtZSArICcvJyArIHNvdXJjZVBhdGgudG9TdHJpbmcoKSk7Ci0vLwl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC5QbGF0Zm9ybVVSTENvbm5lY3Rpb24jcmVzb2x2ZSgpCi0JICovCi0JcHJvdGVjdGVkIFVSTCByZXNvbHZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVUkw6ICIgKyBnZXRVUkwoKSk7Ci0JCS8vSVBhdGggbW9kdWxlUmVsYXRpdmVQYXRoID0gbmV3IFBhdGgoZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCS8vU3RyaW5nIG1vZHVsZU5hbWUgPSBtb2R1bGVSZWxhdGl2ZVBhdGguc2VnbWVudCgxKTsKLQotCQlJUGF0aCByZXNvbHZlZFBhdGggPSBudWxsOyAvLyBoYW5kbGUuZ2V0UmVzb2x2ZWRQYXRoKCkuYXBwZW5kKG1vZHVsZVJlbGF0aXZlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpKTsKLQotCQlpbnQgY291bnQgPSByZXNvbHZlZFBhdGguc2VnbWVudENvdW50KCk7Ci0JCS8vIGlmIHRoZXJlIGFyZSB0d28gc2VnbWVudHMgdGhlbiB0aGUgc2Vjb25kIGlzIGEgcHJvamVjdCBuYW1lLgotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHJlc29sdmVkUGF0aC5zZWdtZW50KDApKTsKLQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkvLyBUT0RPIEZpeCB0aGlzIHN0cmluZwotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQ291bGQgbm90IHJlc29sdmUgVVJMIjsgLy9Qb2xpY3kuYmluZCgidXJsLmNvdWxkTm90UmVzb2x2ZSIsIHByb2plY3QuZ2V0TmFtZSgpLCB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihtZXNzYWdlKTsKLQkJfQotCQlJUGF0aCByZXN1bHQgPSBudWxsOwotCQlpZiAoY291bnQgPT0gMikKLQkJCXJlc3VsdCA9IHByb2plY3QuZ2V0TG9jYXRpb24oKTsKLQkJZWxzZSB7Ci0JCQlyZXNvbHZlZFBhdGggPSByZXNvbHZlZFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygyKTsKLQkJCXJlc3VsdCA9IHByb2plY3QuZ2V0RmlsZShyZXNvbHZlZFBhdGgpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBVUkwoImZpbGUiLCAiIiwgcmVzdWx0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlQbGF0Zm9ybVVSTEhhbmRsZXIucmVnaXN0ZXIoUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLk1PRFVMRSwgUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLmNsYXNzKTsKLQl9Ci0KLQkvLyBwcml2YXRlIElQcm9qZWN0IGdldFJlbGV2YW50UHJvamVjdChVUkkgYU1vZHVsZVVSSSkgewotCS8vIGFNb2R1bGVVUkkuc2VnbWVudCgpCi0JLy8gfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUHJvamVjdENvbXBvbmVudHNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Qcm9qZWN0Q29tcG9uZW50c0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2NDVkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Qcm9qZWN0Q29tcG9uZW50c0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2plY3RDb21wb25lbnRzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDQvMjcgMDQ6MTc6NDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2plY3QgTW9kdWxlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvamVjdENvbXBvbmVudHNJbXBsI2dldFByb2plY3ROYW1lIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb2plY3RDb21wb25lbnRzSW1wbCNnZXRDb21wb25lbnRzIDxlbT5Db21wb25lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9qZWN0Q29tcG9uZW50c0ltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RDb21wb25lbnRzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHJvamVjdENvbXBvbmVudHMgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0TmFtZSgpIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0TmFtZSgpIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0TmFtZSA9IFBST0pFQ1RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBvbmVudHMoKSA8ZW0+Q29tcG9uZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29tcG9uZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIjEuMC4wIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0luZGV4ZWQ7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcCBtb2R1bGVzSW5kZXggPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9qZWN0Q29tcG9uZW50c0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tcG9uZW50Y29yZVBhY2thZ2UuTGl0ZXJhbHMuUFJPSkVDVF9DT01QT05FTlRTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBuZXdQcm9qZWN0TmFtZSkgewotCQlTdHJpbmcgb2xkUHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLQkJcHJvamVjdE5hbWUgPSBuZXdQcm9qZWN0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19QUk9KRUNUX05BTUUsIG9sZFByb2plY3ROYW1lLCBwcm9qZWN0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb21wb25lbnRzKCkgewotCQlpZiAoY29tcG9uZW50cyA9PSBudWxsKSB7Ci0JCQljb21wb25lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdvcmtiZW5jaENvbXBvbmVudC5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19DT01QT05FTlRTKTsKLQkJfQotCQlyZXR1cm4gY29tcG9uZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb21wb25lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX1BST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdE5hbWUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19DT01QT05FTlRTOgotCQkJCXJldHVybiBnZXRDb21wb25lbnRzKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fUFJPSkVDVF9OQU1FOgotCQkJCXNldFByb2plY3ROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19DT01QT05FTlRTOgotCQkJCWdldENvbXBvbmVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbXBvbmVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19QUk9KRUNUX05BTUU6Ci0JCQkJc2V0UHJvamVjdE5hbWUoUFJPSkVDVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fQ09NUE9ORU5UUzoKLQkJCQlnZXRDb21wb25lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX1BST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0TmFtZSAhPSBudWxsIDogIVBST0pFQ1RfTkFNRV9FREVGQVVMVC5lcXVhbHMocHJvamVjdE5hbWUpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFM6Ci0JCQkJcmV0dXJuIGNvbXBvbmVudHMgIT0gbnVsbCAmJiAhY29tcG9uZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByb2plY3ROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm9qZWN0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgZmluZFdvcmtiZW5jaE1vZHVsZShTdHJpbmcgYURlcGxveU5hbWUpIHsKLQkJaWYgKGdldENvbXBvbmVudHMoKS5zaXplKCkgPT0gMSkKLQkJCXJldHVybiAoKFdvcmtiZW5jaENvbXBvbmVudClnZXRDb21wb25lbnRzKCkuZ2V0KDApKS5nZXROYW1lKCkuZXF1YWxzKGFEZXBsb3lOYW1lKSA/IChXb3JrYmVuY2hDb21wb25lbnQpZ2V0Q29tcG9uZW50cygpLmdldCgwKSA6IG51bGw7Ci0JCWlmICghaXNJbmRleGVkKCkpIAotCQkJaW5kZXhNb2R1bGVzKCk7IAotCQlyZXR1cm4gKFdvcmtiZW5jaENvbXBvbmVudCkgZ2V0TW9kdWxlc0luZGV4KCkuZ2V0KGFEZXBsb3lOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5kZXhlZCgpIHsKLQkJcmV0dXJuIGlzSW5kZXhlZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhNb2R1bGVzKCkgewotCQlpZiAoaXNJbmRleGVkKQotCQkJcmV0dXJuOwotCi0JCXN5bmNocm9uaXplZCAobW9kdWxlc0luZGV4KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSBFY29yZVV0aWwuZ2V0QWRhcHRlcihlQWRhcHRlcnMoKSwgTW9kdWxlSW5kZXhpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwpIAotCQkJCWVBZGFwdGVycygpLmFkZCgoYWRhcHRlciA9IG5ldyBNb2R1bGVJbmRleGluZ0FkYXB0ZXIoKSkpOwotCQkJCi0JCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gbnVsbDsKLQkJCWZvcihJdGVyYXRvciBpdGVyID0gZ2V0Q29tcG9uZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQltb2R1bGUgPSAoV29ya2JlbmNoQ29tcG9uZW50KSBpdGVyLm5leHQoKTsKLQkJCQltb2R1bGVzSW5kZXgucHV0KG1vZHVsZS5nZXROYW1lKCksIG1vZHVsZSk7Ci0JCQl9Ci0JCX0KLQkJaXNJbmRleGVkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JLyogcGFja2FnZSAqLyBNYXAgZ2V0TW9kdWxlc0luZGV4KCkgewotCQlyZXR1cm4gbW9kdWxlc0luZGV4OwotCX0KLQotfSAvLyBQcm9qZWN0Q29tcG9uZW50c0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZThhOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9wZXJ0eUltcGwuamF2YSx2IDEuMSAyMDA1LzA0LzA0IDA3OjA0OjU5IGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb3BlcnR5SW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByb3BlcnR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb3BlcnR5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb3BlcnR5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVmZXJlbmNlZENvbXBvbmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1JlZmVyZW5jZWRDb21wb25lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxN2IzZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVmZXJlbmNlZENvbXBvbmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlZmVyZW5jZWRDb21wb25lbnRJbXBsLmphdmEsdiAxLjQgMjAwNy8wMi8xNCAxNjowMDo1MiBqc2hvbGwgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXBlbmRlbnQgTW9kdWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZWZlcmVuY2VkQ29tcG9uZW50SW1wbCNnZXRIYW5kbGUgPGVtPkhhbmRsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVmZXJlbmNlZENvbXBvbmVudEltcGwjZ2V0UnVudGltZVBhdGggPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVmZXJlbmNlZENvbXBvbmVudEltcGwjZ2V0RGVwZW5kZW5jeVR5cGUgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVmZXJlbmNlZENvbXBvbmVudEltcGwjZ2V0RGVwZW5kZW50T2JqZWN0IDxlbT5EZXBlbmRlbnQgT2JqZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZWZlcmVuY2VkQ29tcG9uZW50SW1wbCNnZXRBcmNoaXZlTmFtZSA8ZW0+QXJjaGl2ZSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZENvbXBvbmVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlZmVyZW5jZWRDb21wb25lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGUoKSA8ZW0+SGFuZGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIEhBTkRMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGUoKSA8ZW0+SGFuZGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBVUkkgaGFuZGxlID0gSEFORExFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJ1bnRpbWVQYXRoKCkgPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UnVudGltZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggUlVOVElNRV9QQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJ1bnRpbWVQYXRoKCkgPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UnVudGltZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBydW50aW1lUGF0aCA9IFJVTlRJTUVfUEFUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXBlbmRlbmN5VHlwZSgpIDxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlcGVuZGVuY3lUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERlcGVuZGVuY3lUeXBlIERFUEVOREVOQ1lfVFlQRV9FREVGQVVMVCA9IERlcGVuZGVuY3lUeXBlLlVTRVNfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlcGVuZGVuY3lUeXBlKCkgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVwZW5kZW5jeVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEZXBlbmRlbmN5VHlwZSBkZXBlbmRlbmN5VHlwZSA9IERFUEVOREVOQ1lfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlcGVuZGVudE9iamVjdCgpIDxlbT5EZXBlbmRlbnQgT2JqZWN0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXBlbmRlbnRPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGRlcGVuZGVudE9iamVjdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJjaGl2ZU5hbWUoKSA8ZW0+QXJjaGl2ZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcmNoaXZlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJDSElWRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFyY2hpdmVOYW1lKCkgPGVtPkFyY2hpdmUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXJjaGl2ZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXJjaGl2ZU5hbWUgPSBBUkNISVZFX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVmZXJlbmNlZENvbXBvbmVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgZ2V0SGFuZGxlKCkgewotCQlyZXR1cm4gaGFuZGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhbmRsZShVUkkgbmV3SGFuZGxlKSB7Ci0JCVVSSSBvbGRIYW5kbGUgPSBoYW5kbGU7Ci0JCWhhbmRsZSA9IG5ld0hhbmRsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0hBTkRMRSwgb2xkSGFuZGxlLCBoYW5kbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoKSB7Ci0JCXJldHVybiBydW50aW1lUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lUGF0aChJUGF0aCBuZXdSdW50aW1lUGF0aCkgewotCQlJUGF0aCBvbGRSdW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoOwotCQlydW50aW1lUGF0aCA9IG5ld1J1bnRpbWVQYXRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fUlVOVElNRV9QQVRILCBvbGRSdW50aW1lUGF0aCwgcnVudGltZVBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeVR5cGUgZ2V0RGVwZW5kZW5jeVR5cGUoKSB7Ci0JCXJldHVybiBkZXBlbmRlbmN5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBlbmRlbmN5VHlwZShEZXBlbmRlbmN5VHlwZSBuZXdEZXBlbmRlbmN5VHlwZSkgewotCQlEZXBlbmRlbmN5VHlwZSBvbGREZXBlbmRlbmN5VHlwZSA9IGRlcGVuZGVuY3lUeXBlOwotCQlkZXBlbmRlbmN5VHlwZSA9IG5ld0RlcGVuZGVuY3lUeXBlID09IG51bGwgPyBERVBFTkRFTkNZX1RZUEVfRURFRkFVTFQgOiBuZXdEZXBlbmRlbmN5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOQ1lfVFlQRSwgb2xkRGVwZW5kZW5jeVR5cGUsIGRlcGVuZGVuY3lUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwZW5kZW50T2JqZWN0KCkgewotCQlpZiAoZGVwZW5kZW50T2JqZWN0ICE9IG51bGwgJiYgZGVwZW5kZW50T2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCUVPYmplY3Qgb2xkRGVwZW5kZW50T2JqZWN0ID0gZGVwZW5kZW50T2JqZWN0OwotCQkJZGVwZW5kZW50T2JqZWN0ID0gZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWRlcGVuZGVudE9iamVjdCk7Ci0JCQlpZiAoZGVwZW5kZW50T2JqZWN0ICE9IG9sZERlcGVuZGVudE9iamVjdCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTlRfT0JKRUNULCBvbGREZXBlbmRlbnRPYmplY3QsIGRlcGVuZGVudE9iamVjdCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZXBlbmRlbnRPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgYmFzaWNHZXREZXBlbmRlbnRPYmplY3QoKSB7Ci0JCXJldHVybiBkZXBlbmRlbnRPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVwZW5kZW50T2JqZWN0KEVPYmplY3QgbmV3RGVwZW5kZW50T2JqZWN0KSB7Ci0JCUVPYmplY3Qgb2xkRGVwZW5kZW50T2JqZWN0ID0gZGVwZW5kZW50T2JqZWN0OwotCQlkZXBlbmRlbnRPYmplY3QgPSBuZXdEZXBlbmRlbnRPYmplY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTlRfT0JKRUNULCBvbGREZXBlbmRlbnRPYmplY3QsIGRlcGVuZGVudE9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoKSB7Ci0JCXJldHVybiBhcmNoaXZlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlTmFtZShTdHJpbmcgbmV3QXJjaGl2ZU5hbWUpIHsKLQkJU3RyaW5nIG9sZEFyY2hpdmVOYW1lID0gYXJjaGl2ZU5hbWU7Ci0JCWFyY2hpdmVOYW1lID0gbmV3QXJjaGl2ZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19BUkNISVZFX05BTUUsIG9sZEFyY2hpdmVOYW1lLCBhcmNoaXZlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0hBTkRMRToKLQkJCQlyZXR1cm4gZ2V0SGFuZGxlKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19SVU5USU1FX1BBVEg6Ci0JCQkJcmV0dXJuIGdldFJ1bnRpbWVQYXRoKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTkNZX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERlcGVuZGVuY3lUeXBlKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTlRfT0JKRUNUOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVwZW5kZW50T2JqZWN0KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RGVwZW5kZW50T2JqZWN0KCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19BUkNISVZFX05BTUU6Ci0JCQkJcmV0dXJuIGdldEFyY2hpdmVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fSEFORExFOgotCQkJCXNldEhhbmRsZSgoVVJJKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19SVU5USU1FX1BBVEg6Ci0JCQkJc2V0UnVudGltZVBhdGgoKElQYXRoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTkNZX1RZUEU6Ci0JCQkJc2V0RGVwZW5kZW5jeVR5cGUoKERlcGVuZGVuY3lUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTlRfT0JKRUNUOgotCQkJCXNldERlcGVuZGVudE9iamVjdCgoRU9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fQVJDSElWRV9OQU1FOgotCQkJCXNldEFyY2hpdmVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19IQU5ETEU6Ci0JCQkJc2V0SGFuZGxlKEhBTkRMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fUlVOVElNRV9QQVRIOgotCQkJCXNldFJ1bnRpbWVQYXRoKFJVTlRJTUVfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5DWV9UWVBFOgotCQkJCXNldERlcGVuZGVuY3lUeXBlKERFUEVOREVOQ1lfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5UX09CSkVDVDoKLQkJCQlzZXREZXBlbmRlbnRPYmplY3QoKEVPYmplY3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fQVJDSElWRV9OQU1FOgotCQkJCXNldEFyY2hpdmVOYW1lKEFSQ0hJVkVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19IQU5ETEU6Ci0JCQkJcmV0dXJuIEhBTkRMRV9FREVGQVVMVCA9PSBudWxsID8gaGFuZGxlICE9IG51bGwgOiAhSEFORExFX0VERUZBVUxULmVxdWFscyhoYW5kbGUpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fUlVOVElNRV9QQVRIOgotCQkJCXJldHVybiBSVU5USU1FX1BBVEhfRURFRkFVTFQgPT0gbnVsbCA/IHJ1bnRpbWVQYXRoICE9IG51bGwgOiAhUlVOVElNRV9QQVRIX0VERUZBVUxULmVxdWFscyhydW50aW1lUGF0aCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTkNZX1RZUEU6Ci0JCQkJcmV0dXJuIGRlcGVuZGVuY3lUeXBlICE9IERFUEVOREVOQ1lfVFlQRV9FREVGQVVMVDsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGRlcGVuZGVudE9iamVjdCAhPSBudWxsOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fQVJDSElWRV9OQU1FOgotCQkJCXJldHVybiBBUkNISVZFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGFyY2hpdmVOYW1lICE9IG51bGwgOiAhQVJDSElWRV9OQU1FX0VERUZBVUxULmVxdWFscyhhcmNoaXZlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChoYW5kbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGhhbmRsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcnVudGltZVBhdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJ1bnRpbWVQYXRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXBlbmRlbmN5VHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVwZW5kZW5jeVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFyY2hpdmVOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhcmNoaXZlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JlZmVyZW5jZWRDb21wb25lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMTU3YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVmZXJlbmNlZENvbXBvbmVudFhNSVJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZENvbXBvbmVudFhNSVJlc291cmNlRmFjdG9yeSBleHRlbmRzCi0JCVJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCB7Ci0KLQlwdWJsaWMgUmVmZXJlbmNlZENvbXBvbmVudFhNSVJlc291cmNlRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIGEgbmV3IFJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZG9DcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBuZXcgUmVmZXJlbmNlZENvbXBvbmVudFhNSVJlc291cmNlSW1wbCh1cmkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVmZXJlbmNlZENvbXBvbmVudFhNSVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVmZXJlbmNlZENvbXBvbmVudFhNSVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNiNGIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1JlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLk1hcHBlZFhNSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZENvbXBvbmVudFhNSVJlc291cmNlSW1wbCBleHRlbmRzCi0JCVJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBSZXNvdXJjZSB7Ci0KLQlwdWJsaWMgUmVmZXJlbmNlZENvbXBvbmVudFhNSVJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIFJlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JcHJvdGVjdGVkIE1hcHBlZFhNSUhlbHBlciBkb0NyZWF0ZVhNTEhlbHBlcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBwZWRDb21wb25lbnRYTUlIZWxwZXIodGhpcywgZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlVHJlZU5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlVHJlZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhYjQxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVRyZWVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklQYXRoUHJvdmlkZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VUcmVlTm9kZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFX05PTkUgPSAweDA7Ci0JLyoqIAotCSAqIFR5cGUgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDEpIHdoaWNoIGlkZW50aWZpZXMgY3JlYXRpbmcgY2hpbGQgbm9kZXMuCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfVFJFRU5PREVfSUZORUMgPSAweDE7Ci0KLQkvKioKLQkgKiBUeXBlIGNvbnN0YW50IChiaXQgbWFzayB2YWx1ZSAyKSB3aGljaCBpZGVudGlmaWVzIGFsd2F5cyBjcmVhdGluZyBhIHZpcnR1YWwgcmVzb3VyY2UuCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfUkVTT1VSQ0VfQUxXQVlTID0gMHgyOwotCi0JcHJpdmF0ZSBmaW5hbCBTZXQgbW9kdWxlUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KG5ldyBMaW5rZWRIYXNoU2V0KCkpOwkKLQlwcml2YXRlIGZpbmFsIE1hcCBjaGlsZHJlbiA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgTGlua2VkSGFzaE1hcCgpKTsKLQlwcml2YXRlIGZpbmFsIE1hcCB0cmFuc2llbnRDaGlsZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgTGlua2VkSGFzaE1hcCgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRSZXNvdXJjZVtdIE5PX01PRFVMRV9SRVNPVVJDRVMgPSBuZXcgQ29tcG9uZW50UmVzb3VyY2VbXXt9OwotCXByaXZhdGUgSVBhdGhQcm92aWRlciBwYXRoUHJvdmlkZXI7Ci0vLwlwcml2YXRlIFJlc291cmNlVHJlZU5vZGUgcGFyZW50OwotCXByaXZhdGUgU3RyaW5nIHBhdGhTZWdtZW50OwotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUoU3RyaW5nIGFQYXRoU2VnbWVudCwgUmVzb3VyY2VUcmVlTm9kZSBwYXJlbnQsIElQYXRoUHJvdmlkZXIgYVBhdGhQcm92aWRlcikgewotCQlwYXRoU2VnbWVudCA9IGFQYXRoU2VnbWVudDsKLQkJcGF0aFByb3ZpZGVyID0gYVBhdGhQcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VUcmVlTm9kZSBhZGRDaGlsZChSZXNvdXJjZVRyZWVOb2RlIGFDaGlsZCkgewotCQljaGlsZHJlbi5wdXQoYUNoaWxkLmdldFBhdGhTZWdtZW50KCksIGFDaGlsZCk7Ci0JCXJldHVybiBhQ2hpbGQ7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgYWRkQ2hpbGQoQ29tcG9uZW50UmVzb3VyY2UgYU1vZHVsZVJlc291cmNlKSB7Ci0JCVJlc291cmNlVHJlZU5vZGUgbmV3Q2hpbGQgPSBmaW5kQ2hpbGQoZ2V0UGF0aFByb3ZpZGVyKCkuZ2V0UGF0aChhTW9kdWxlUmVzb3VyY2UpLCBDUkVBVEVfVFJFRU5PREVfSUZORUMpOwotCQlpZihuZXdDaGlsZCAhPSBudWxsKSB7Ci0JCQluZXdDaGlsZC5hZGRNb2R1bGVSZXNvdXJjZShhTW9kdWxlUmVzb3VyY2UpOwotCQkJcmV0dXJuIG5ld0NoaWxkOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVRyZWVOb2RlIHJlbW92ZUNoaWxkKFJlc291cmNlVHJlZU5vZGUgYUNoaWxkKSB7Ci0JCXJldHVybiAoUmVzb3VyY2VUcmVlTm9kZSkgY2hpbGRyZW4ucmVtb3ZlKGFDaGlsZC5nZXRQYXRoU2VnbWVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VUcmVlTm9kZSByZW1vdmVDaGlsZChDb21wb25lbnRSZXNvdXJjZSBhTW9kdWxlUmVzb3VyY2UpIHsgCi0JCVJlc291cmNlVHJlZU5vZGUgY29udGFpbmluZ0NoaWxkID0gZmluZENoaWxkKGdldFBhdGhQcm92aWRlcigpLmdldFBhdGgoYU1vZHVsZVJlc291cmNlKSwgQ1JFQVRFX05PTkUpOwotCQlpZihjb250YWluaW5nQ2hpbGQgIT0gbnVsbCkgewotCQkJY29udGFpbmluZ0NoaWxkLnJlbW92ZVJlc291cmNlKGFNb2R1bGVSZXNvdXJjZSk7Ci0JCQlpZihjb250YWluaW5nQ2hpbGQuaGFzTW9kdWxlUmVzb3VyY2VzKCkpCi0JCQkJcmV0dXJuIGNvbnRhaW5pbmdDaGlsZDsKLQkJCXJldHVybiByZW1vdmVDaGlsZChjb250YWluaW5nQ2hpbGQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVRyZWVOb2RlIHJlbW92ZUNoaWxkKElQYXRoIHRhcmdldFBhdGgsIENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSkgeyAKLQkJUmVzb3VyY2VUcmVlTm9kZSBjb250YWluaW5nQ2hpbGQgPSBmaW5kQ2hpbGQodGFyZ2V0UGF0aCwgQ1JFQVRFX05PTkUpOwotCQlpZihjb250YWluaW5nQ2hpbGQgIT0gbnVsbCkgewotCQkJY29udGFpbmluZ0NoaWxkLnJlbW92ZVJlc291cmNlKGFNb2R1bGVSZXNvdXJjZSk7Ci0JCQlpZihjb250YWluaW5nQ2hpbGQuaGFzTW9kdWxlUmVzb3VyY2VzKCkpCi0JCQkJcmV0dXJuIGNvbnRhaW5pbmdDaGlsZDsKLQkJCXJldHVybiByZW1vdmVDaGlsZChjb250YWluaW5nQ2hpbGQpOwotCQl9Ci0JCXJldHVybiBudWxsOwkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZShDb21wb25lbnRSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJbW9kdWxlUmVzb3VyY2VzLnJlbW92ZShhUmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVRyZWVOb2RlIGZpbmRDaGlsZChJUGF0aCBhUGF0aCkgewotCQlyZXR1cm4gZmluZENoaWxkKGFQYXRoLCBDUkVBVEVfVFJFRU5PREVfSUZORUMpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVRyZWVOb2RlIGZpbmRDaGlsZChJUGF0aCBhUGF0aCwgaW50IGNyZWF0aW9uRmxhZ3MpIHsKLQkJaWYoYVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlSZXNvdXJjZVRyZWVOb2RlIGNoaWxkID0gdGhpczsKLQkJaWYgKGFQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJY2hpbGQgPSBmaW5kQ2hpbGQoYVBhdGguc2VnbWVudCgwKSwgY3JlYXRpb25GbGFncyk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChhUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKQotCQkJCXJldHVybiBjaGlsZDsKLQkJCWNoaWxkID0gY2hpbGQuZmluZENoaWxkKGFQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSksIGNyZWF0aW9uRmxhZ3MpOwotCi0JCX0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVRyZWVOb2RlIGZpbmRDaGlsZChTdHJpbmcgYVBhdGhTZWdtZW50KSB7Ci0JCWlmIChhUGF0aFNlZ21lbnQgPT0gbnVsbCB8fCBhUGF0aFNlZ21lbnQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiB0aGlzOwotCQlyZXR1cm4gZmluZENoaWxkKGFQYXRoU2VnbWVudCwgQ1JFQVRFX05PTkUpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVRyZWVOb2RlIGZpbmRDaGlsZChTdHJpbmcgYVBhdGhTZWdtZW50LCBpbnQgY3JlYXRpb25GbGFncykgewotCQlib29sZWFuIHRvQ3JlYXRlQ2hpbGRJZk5lY2Vzc2FyeSA9IChjcmVhdGlvbkZsYWdzICYgQ1JFQVRFX1RSRUVOT0RFX0lGTkVDKSA9PSBDUkVBVEVfVFJFRU5PREVfSUZORUM7Ci0JCVJlc291cmNlVHJlZU5vZGUgY2hpbGROb2RlID0gKFJlc291cmNlVHJlZU5vZGUpIGNoaWxkcmVuLmdldChhUGF0aFNlZ21lbnQpOwotCQlpZiAoY2hpbGROb2RlID09IG51bGwgJiYgdG9DcmVhdGVDaGlsZElmTmVjZXNzYXJ5KQotCQkJY2hpbGROb2RlID0gYWRkQ2hpbGQoYVBhdGhTZWdtZW50KTsKLQkJcmV0dXJuIGNoaWxkTm9kZTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50UmVzb3VyY2VbXSBmaW5kTW9kdWxlUmVzb3VyY2VzKElQYXRoIGFQYXRoLCBpbnQgY3JlYXRpb25GbGFncykgewotCi0JCVNldCBmb3VuZE1vZHVsZVJlc291cmNlcyA9IGZpbmRNb2R1bGVSZXNvdXJjZXNTZXQoYVBhdGgsIGFQYXRoLCBjcmVhdGlvbkZsYWdzKTsKLQkJaWYgKGZvdW5kTW9kdWxlUmVzb3VyY2VzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIE5PX01PRFVMRV9SRVNPVVJDRVM7Ci0JCXJldHVybiAoQ29tcG9uZW50UmVzb3VyY2VbXSkgZm91bmRNb2R1bGVSZXNvdXJjZXMudG9BcnJheShuZXcgQ29tcG9uZW50UmVzb3VyY2VbZm91bmRNb2R1bGVSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGV4aXN0cyhJUGF0aCBhUGF0aCwgaW50IGNyZWF0aW9uRmxhZ3MpIHsKLQotCQlTZXQgZm91bmRNb2R1bGVSZXNvdXJjZXMgPSBmaW5kTW9kdWxlUmVzb3VyY2VzU2V0KGFQYXRoLCBhUGF0aCwgY3JlYXRpb25GbGFncyk7Ci0JCWlmIChmb3VuZE1vZHVsZVJlc291cmNlcy5zaXplKCkgPT0gMCkgewotCQkJaWYgKHRydWUpIHsKLQkJCQlSZXNvdXJjZVRyZWVOb2RlIGNoaWxkID0gZmluZENoaWxkKGFQYXRoLnNlZ21lbnQoMCksIGNyZWF0aW9uRmxhZ3MpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNb2R1bGVSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2R1bGVSZXNvdXJjZXMuc2l6ZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50UmVzb3VyY2VbXSBnZXRNb2R1bGVSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiAoQ29tcG9uZW50UmVzb3VyY2VbXSkgbW9kdWxlUmVzb3VyY2VzLnRvQXJyYXkobmV3IENvbXBvbmVudFJlc291cmNlW21vZHVsZVJlc291cmNlcy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIFNldCBmaW5kTW9kdWxlUmVzb3VyY2VzU2V0KElQYXRoIGFGdWxsUGF0aCwgSVBhdGggYVBhdGgsIGludCBjcmVhdGlvbkZsYWdzKSB7Ci0KLQkJaWYgKGFQYXRoLnNlZ21lbnRDb3VudCgpID09IDApIHsKLQkJCVNldCByZXNvdXJjZXMgPSBhZ2dyZWdhdGVSZXNvdXJjZXMobmV3IExpbmtlZEhhc2hTZXQoKSk7Ci0JCQlyZXR1cm4gcmVzb3VyY2VzOwotCQl9Ci0JCVJlc291cmNlVHJlZU5vZGUgY2hpbGQgPSBmaW5kQ2hpbGQoYVBhdGguc2VnbWVudCgwKSwgY3JlYXRpb25GbGFncyk7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIGZpbmRNYXRjaGluZ1ZpcnR1YWxQYXRoc1NldChhRnVsbFBhdGgsIGFQYXRoLCBjcmVhdGlvbkZsYWdzKTsKLQkJU2V0IGZvdW5kUmVzb3VyY2VzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJZm91bmRSZXNvdXJjZXMuYWRkQWxsKGNoaWxkLmZpbmRNb2R1bGVSZXNvdXJjZXNTZXQoYUZ1bGxQYXRoLCBhUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLCBjcmVhdGlvbkZsYWdzKSk7Ci0JCWZvdW5kUmVzb3VyY2VzLmFkZEFsbChmaW5kTWF0Y2hpbmdWaXJ0dWFsUGF0aHNTZXQoYUZ1bGxQYXRoLCBhUGF0aCwgY3JlYXRpb25GbGFncykpOwotCQlyZXR1cm4gZm91bmRSZXNvdXJjZXM7Ci0JfQotCi0JcHJpdmF0ZSBTZXQgZmluZE1hdGNoaW5nVmlydHVhbFBhdGhzU2V0KElQYXRoIGFGdWxsUGF0aCwgSVBhdGggYVBhdGgsIGludCBjcmVhdGlvbkZsYWdzKSB7Ci0JCWJvb2xlYW4gdG9DcmVhdGVSZXNvdXJjZUFsd2F5cyA9IChjcmVhdGlvbkZsYWdzICYgQ1JFQVRFX1JFU09VUkNFX0FMV0FZUykgPT0gQ1JFQVRFX1JFU09VUkNFX0FMV0FZUzsKLQkJaWYgKGhhc01vZHVsZVJlc291cmNlcygpKSB7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSBtb2R1bGVSZXNvdXJjZSA9IG51bGw7Ci0JCQlJUmVzb3VyY2UgZWNsaXBzZVJlc291cmNlID0gbnVsbDsKLQkJCUlDb250YWluZXIgZWNsaXBzZUNvbnRhaW5lciA9IG51bGw7Ci0JCQlTZXQgcmVzdWx0U2V0ID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgcmVzb3VyY2VJdGVyID0gbW9kdWxlUmVzb3VyY2VzLml0ZXJhdG9yKCk7IHJlc291cmNlSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJbW9kdWxlUmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpIHJlc291cmNlSXRlci5uZXh0KCk7Ci0JCQkJaWYobW9kdWxlUmVzb3VyY2UuZ2V0UnVudGltZVBhdGgoKSAhPSBudWxsICYmIG1vZHVsZVJlc291cmNlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJZWNsaXBzZVJlc291cmNlID0gU3RydWN0dXJlRWRpdC5nZXRFY2xpcHNlUmVzb3VyY2UobW9kdWxlUmVzb3VyY2UpOwotCQkJCQkKLQkJCQkJaWYgKGVjbGlwc2VSZXNvdXJjZSAhPSBudWxsICYmIChlY2xpcHNlUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgfHwgZWNsaXBzZVJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkpIHsKLQkJCQkJCWVjbGlwc2VDb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWNsaXBzZVJlc291cmNlOwotCQkJCSAKLQkJCQkJCUlQYXRoIHJ1bnRpbWVVUkkgPSBtb2R1bGVSZXNvdXJjZS5nZXRSdW50aW1lUGF0aCgpLmFwcGVuZChhUGF0aCk7Ci0JCQkJCQlJUGF0aCBzcmNQYXRoID0gZWNsaXBzZUNvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuYXBwZW5kKGFQYXRoKTsKLQkJCQkJCQotCQkJCQkJLy8gY2hlY2sgZm9yIGV4aXN0aW5nIHN1YnBhdGggaW4gdHJlZQotCQkJCQkJQ29tcG9uZW50UmVzb3VyY2UgbmV3UmVzb3VyY2UgPSBmaW5kRXhpc3RpbmdDb21wb25lbnRSZXNvdXJjZShtb2R1bGVSZXNvdXJjZS5nZXRDb21wb25lbnQoKSwgcnVudGltZVVSSSwgc3JjUGF0aCk7Ci0JCQkJCQkKLQkJCQkJCS8vIGFkZCBuZXcgcmVzb3VyY2UgaWYgbnVsbAotCQkJCQkJaWYobmV3UmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQkJCS8vIGZsZXNoIG91dCB0aGUgdHJlZQotCQkJCQkJCUlSZXNvdXJjZSBlY2xpcHNlUmVzID0gZWNsaXBzZUNvbnRhaW5lci5maW5kTWVtYmVyKGFQYXRoKTsKLQkJCQkJCQlpZiAoKHRvQ3JlYXRlUmVzb3VyY2VBbHdheXMpIHx8IChlY2xpcHNlUmVzICE9IG51bGwpKSB7Ci0JCQkJCQkJCW5ld1Jlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKXRyYW5zaWVudENoaWxkUmVzb3VyY2VzLmdldChzcmNQYXRoKTsKLQkJCQkJCQkJaWYgKG5ld1Jlc291cmNlID09IG51bGwpIHsKLQkJCQkJCQkJbmV3UmVzb3VyY2UgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50Y29yZUZhY3RvcnkoKS5jcmVhdGVDb21wb25lbnRSZXNvdXJjZSgpOwotCQkJCQkJCQkvLyBOb3Qgc2V0dGluZyB0aGUgcGFyZW50IG9uIHRoaXMgdHJhbnNpZW50IGNoaWxkIHJlc291cmNlCi0JCQkJCQkJCS8vIG5ld1Jlc291cmNlLnNldENvbXBvbmVudChtb2R1bGVSZXNvdXJjZS5nZXRDb21wb25lbnQoKSk7Ci0JCQkJCQkJCW5ld1Jlc291cmNlLnNldFJ1bnRpbWVQYXRoKHJ1bnRpbWVVUkkpOwotCQkJCQkJCQluZXdSZXNvdXJjZS5zZXRTb3VyY2VQYXRoKHNyY1BhdGgpOwotCQkJCQkJCQlpZiAoZWNsaXBzZVJlcyAhPSBudWxsKQotCQkJCQkJCQkJbmV3UmVzb3VyY2Uuc2V0T3duaW5nUHJvamVjdChlY2xpcHNlUmVzLmdldFByb2plY3QoKSk7Ci0JCQkJCQkJCXRyYW5zaWVudENoaWxkUmVzb3VyY2VzLnB1dChzcmNQYXRoLG5ld1Jlc291cmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlyZXN1bHRTZXQuYWRkKG5ld1Jlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdFNldC5zaXplKCkgPiAwID8gcmVzdWx0U2V0IDogQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnRSZXNvdXJjZSBmaW5kRXhpc3RpbmdDb21wb25lbnRSZXNvdXJjZShXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50LCBJUGF0aCBydW50aW1lVVJJLCBJUGF0aCBzcmNQYXRoKSB7IAotCQlMaXN0IHJlc291cmNlcyA9IGNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29tcG9uZW50UmVzb3VyY2UgZWxlbWVudCA9IChDb21wb25lbnRSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihydW50aW1lVVJJLmVxdWFscyhlbGVtZW50LmdldFJ1bnRpbWVQYXRoKCkpICYmIHNyY1BhdGguZXF1YWxzKGVsZW1lbnQuZ2V0U291cmNlUGF0aCgpKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU2V0IGFnZ3JlZ2F0ZVJlc291cmNlcyhTZXQgYW5BZ2dyZWdhdGlvblNldCkgewotCQlpZiAoaGFzTW9kdWxlUmVzb3VyY2VzKCkpCi0JCQlhbkFnZ3JlZ2F0aW9uU2V0LmFkZEFsbChtb2R1bGVSZXNvdXJjZXMpOwotCQlSZXNvdXJjZVRyZWVOb2RlIGNoaWxkTm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgY2hpbGRyZW5JdGVyYXRvciA9IGNoaWxkcmVuLnZhbHVlcygpLml0ZXJhdG9yKCk7IGNoaWxkcmVuSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJY2hpbGROb2RlID0gKFJlc291cmNlVHJlZU5vZGUpIGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpOwotCQkJY2hpbGROb2RlLmFnZ3JlZ2F0ZVJlc291cmNlcyhhbkFnZ3JlZ2F0aW9uU2V0KTsKLQkJfQotCQlyZXR1cm4gYW5BZ2dyZWdhdGlvblNldDsKLQl9Ci0KLQlwdWJsaWMgaW50IGNoaWxkcmVuQ291bnQoKSB7Ci0JCXJldHVybiBjaGlsZHJlbi5zaXplKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRoU2VnbWVudCgpIHsKLQkJcmV0dXJuIHBhdGhTZWdtZW50OwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZVRyZWVOb2RlIGFkZENoaWxkKFN0cmluZyBhUGF0aFNlZ21lbnQpIHsKLQkJUmVzb3VyY2VUcmVlTm9kZSBuZXdDaGlsZCA9IG51bGw7Ci0JCWlmICgobmV3Q2hpbGQgPSAoUmVzb3VyY2VUcmVlTm9kZSkgY2hpbGRyZW4uZ2V0KGFQYXRoU2VnbWVudCkpID09IG51bGwpIHsKLQkJCW5ld0NoaWxkID0gbmV3IFJlc291cmNlVHJlZU5vZGUoYVBhdGhTZWdtZW50LCB0aGlzLCBwYXRoUHJvdmlkZXIpOwotCQkJY2hpbGRyZW4ucHV0KG5ld0NoaWxkLmdldFBhdGhTZWdtZW50KCksIG5ld0NoaWxkKTsKLQkJfQotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlVHJlZU5vZGUgcmVtb3ZlQ2hpbGQoU3RyaW5nIGFQYXRoU2VnbWVudCkgewotCQlyZXR1cm4gKFJlc291cmNlVHJlZU5vZGUpIGNoaWxkcmVuLnJlbW92ZShhUGF0aFNlZ21lbnQpOwotCX0KLQotCS8qIHBhY2thZ2UgKi92b2lkIGFkZE1vZHVsZVJlc291cmNlKENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSkgewotCQltb2R1bGVSZXNvdXJjZXMuYWRkKGFNb2R1bGVSZXNvdXJjZSk7Ci0JfQotCi0JLyogcGFja2FnZSAqL0lQYXRoUHJvdmlkZXIgZ2V0UGF0aFByb3ZpZGVyKCkgewotCQlyZXR1cm4gcGF0aFByb3ZpZGVyOwotCX0KLQkKLQlwdWJsaWMgTWFwIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlUm9vdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlUm9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzI5M2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlVHJlZVJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklQYXRoUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVHJlZVJvb3QgZXh0ZW5kcyBSZXNvdXJjZVRyZWVOb2RlIHsKLQkKLQlwcml2YXRlIGNsYXNzIFJlc291cmNlVHJlZVJlc291cmNlTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJCi0JCQlpZihtc2cuZ2V0RmVhdHVyZSgpID09IENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrYmVuY2hDb21wb25lbnRfUmVzb3VyY2VzKCkpIHsKLQkJCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQkJc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJcmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKQotCQkJCQkJcmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKGdldFJlc291cmNlUGF0aExpc3RlbmVyQWRhcHRlcigpKTsJCQkJCQotCQkJCQlicmVhazsgCi0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUxpc3QgbmV3VmFsdWVzID0gKExpc3QpIG1zZy5nZXROZXdWYWx1ZSgpOwkJCQkJCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3VmFsdWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlyZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgbmV3VmFsdWVzLmdldChpKTsKLQkJCQkJCXJlc291cmNlLmVBZGFwdGVycygpLmFkZChnZXRSZXNvdXJjZVBhdGhMaXN0ZW5lckFkYXB0ZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlyZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmKHJlc291cmNlICE9IG51bGwpewotCQkJCQkJcmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGdldFJlc291cmNlUGF0aExpc3RlbmVyQWRhcHRlcigpKTsKLQkJCQkJCXJlbW92ZUNoaWxkKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJTGlzdCByZW1vdmVkVmFsdWVzID0gKExpc3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAocmVtb3ZlZFZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZWRWYWx1ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlyZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgcmVtb3ZlZFZhbHVlcy5nZXQoaSk7Ci0JCQkJCQkJcmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGdldFJlc291cmNlUGF0aExpc3RlbmVyQWRhcHRlcigpKTsKLQkJCQkJCQlyZW1vdmVDaGlsZChyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VQYXRoTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCQlpZihuZXdUYXJnZXQgaW5zdGFuY2VvZiBDb21wb25lbnRSZXNvdXJjZSkgewkJCQkKLS8vCQkJCWlmKGdldFRhcmdldCgpICE9IG51bGwpIHsKLS8vCQkJCQlpZihnZXRQYXRoUHJvdmlkZXIoKS5nZXRQYXRoKChDb21wb25lbnRSZXNvdXJjZSlnZXRUYXJnZXQoKSkgIT0gbnVsbCkKLS8vCQkJCQkJcmVtb3ZlQ2hpbGQoKENvbXBvbmVudFJlc291cmNlKWdldFRhcmdldCgpKTsKLS8vCQkJCX0KLQkJCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgbmV3VGFyZ2V0OwotCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJaWYoZ2V0UGF0aFByb3ZpZGVyKCkuZ2V0UGF0aChyZXNvdXJjZSkgIT0gbnVsbCkKLQkJCQkJCWFkZENoaWxkKHJlc291cmNlKTsJCQkJCQotCQkJCX0JCQotCQkJfQotCQkJc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJCi0JCQlpZihtc2cuZ2V0RmVhdHVyZSgpID09IGdldFBhdGhQcm92aWRlcigpLmdldEZlYXR1cmUoKSkgewotCQkJCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSBtc2cuZ2V0Tm90aWZpZXIoKTsKLQkJCQlzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQkKLQkJCQkJLy8gcmVtb3ZlIHRoZSBvbGQgdmFsdWUgCi0JCQkJCUlQYXRoIG9sZFBhdGggPSAoSVBhdGgpbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmKG9sZFBhdGghPW51bGwpCi0JCQkJCQlyZW1vdmVDaGlsZChvbGRQYXRoLCByZXNvdXJjZSk7Ci0JCQkJCQotCQkJCQlJUGF0aCBuZXdQYXRoID0gKElQYXRoKW1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZihuZXdQYXRoIT1udWxsKQotCQkJCQkJYWRkQ2hpbGQocmVzb3VyY2UpOwotCQkJCQlicmVhazsgCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gVE9ETyBUaGUgc291cmNlIHRyZWUgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIHRoZSBwcm9qZWN0IG1vZHVsZXMgcm9vdCwgbm90IGVhY2ggbW9kdWxlLgotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VUcmVlUm9vdCBnZXRTb3VyY2VSZXNvdXJjZVRyZWVSb290KFdvcmtiZW5jaENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCVJlc291cmNlVHJlZVJvb3RBZGFwdGVyIHJlc291cmNlVHJlZUFkYXB0ZXIgPSAoUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIpIEV4dGVuZGVkRWNvcmVVdGlsLmdldEFkYXB0ZXIoYU1vZHVsZSwgYU1vZHVsZS5lQWRhcHRlcnMoKSwgUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIuU09VUkNFX0FEQVBURVJfVFlQRSk7Ci0JCWlmIChyZXNvdXJjZVRyZWVBZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzb3VyY2VUcmVlQWRhcHRlci5nZXRSZXNvdXJjZVRyZWVSb290KCk7Ci0JCXJlc291cmNlVHJlZUFkYXB0ZXIgPSBuZXcgUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIoUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIuU09VUkNFX1RSRUUpOwotCQlhTW9kdWxlLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZVRyZWVBZGFwdGVyKTsKLQkJcmV0dXJuIHJlc291cmNlVHJlZUFkYXB0ZXIuZ2V0UmVzb3VyY2VUcmVlUm9vdCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VUcmVlUm9vdCBnZXREZXBsb3lSZXNvdXJjZVRyZWVSb290KFdvcmtiZW5jaENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCVJlc291cmNlVHJlZVJvb3RBZGFwdGVyIHJlc291cmNlVHJlZUFkYXB0ZXIgPSAoUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIpIEV4dGVuZGVkRWNvcmVVdGlsLmdldEFkYXB0ZXIoYU1vZHVsZSwgYU1vZHVsZS5lQWRhcHRlcnMoKSwgUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIuREVQTE9ZX0FEQVBURVJfVFlQRSk7Ci0JCWlmIChyZXNvdXJjZVRyZWVBZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzb3VyY2VUcmVlQWRhcHRlci5nZXRSZXNvdXJjZVRyZWVSb290KCk7Ci0JCXJlc291cmNlVHJlZUFkYXB0ZXIgPSBuZXcgUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIoUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIuREVQTE9ZX1RSRUUpOwotCQlhTW9kdWxlLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZVRyZWVBZGFwdGVyKTsKLQkJcmV0dXJuIHJlc291cmNlVHJlZUFkYXB0ZXIuZ2V0UmVzb3VyY2VUcmVlUm9vdCgpOwotCX0KLQkKLQlwcml2YXRlIGZpbmFsIFdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGU7Ci0JcHJpdmF0ZSBSZXNvdXJjZVRyZWVSZXNvdXJjZUxpc3RlbmVyIGxpc3RlbmVyOwotCXByaXZhdGUgUmVzb3VyY2VQYXRoTGlzdGVuZXIgcGF0aExpc3RlbmVyOwotCi0JcHVibGljIFJlc291cmNlVHJlZVJvb3QoV29ya2JlbmNoQ29tcG9uZW50IGFNb2R1bGUsIElQYXRoUHJvdmlkZXIgYVBhdGhQcm92aWRlcikgewotCQlzdXBlcigiLyIsIG51bGwsIGFQYXRoUHJvdmlkZXIpOyAvLyROT04tTkxTLTEkCi0JCW1vZHVsZSA9IGFNb2R1bGU7IAkKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQltb2R1bGUuZUFkYXB0ZXJzKCkuYWRkKGdldFJlc291cmNlVHJlZUxpc3RlbmVyQWRhcHRlcigpKTsKLQkJTGlzdCBtb2R1bGVSZXNvdXJjZXMgPSBtb2R1bGUuZ2V0UmVzb3VyY2VzKCk7Ci0JCUNvbXBvbmVudFJlc291cmNlIG1vZHVsZVJlc291cmNlID0gbnVsbDsJCSAKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQltb2R1bGVSZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgbW9kdWxlUmVzb3VyY2VzLmdldChpKTsKLQkJCWFkZENoaWxkKG1vZHVsZVJlc291cmNlKTsKLQkJfQotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VUcmVlUmVzb3VyY2VMaXN0ZW5lciBnZXRSZXNvdXJjZVRyZWVMaXN0ZW5lckFkYXB0ZXIoKSB7Ci0JCWlmKGxpc3RlbmVyID09IG51bGwpCi0JCQlsaXN0ZW5lciA9IG5ldyBSZXNvdXJjZVRyZWVSZXNvdXJjZUxpc3RlbmVyKCk7Ci0JCXJldHVybiBsaXN0ZW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VQYXRoTGlzdGVuZXIgZ2V0UmVzb3VyY2VQYXRoTGlzdGVuZXJBZGFwdGVyKCkgewotCQlpZihwYXRoTGlzdGVuZXIgPT0gbnVsbCkKLQkJCXBhdGhMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZVBhdGhMaXN0ZW5lcigpOwotCQlyZXR1cm4gcGF0aExpc3RlbmVyOwotCX0KLQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRNb2R1bGVSZXNvdXJjZXMoVVJJIGFVUkkpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGFVUkkudG9TdHJpbmcoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoTW9kdWxlVVJJVXRpbC5lbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkUGxhdGZvcm1VUkkoYVVSSSwgZmFsc2UpKQotCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7IAotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHV1cmllKSB7Ci0KLQkJfQotCQlyZXR1cm4gZmluZE1vZHVsZVJlc291cmNlcyhwYXRoLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlVHJlZVJvb3RBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVRyZWVSb290QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGM0ZDE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlVHJlZVJvb3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5EZXBsb3llZFBhdGhQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JUGF0aFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLlNvdXJjZVBhdGhQcm92aWRlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVRyZWVSb290QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU09VUkNFX0FEQVBURVJfVFlQRSA9IG5ldyBPYmplY3QoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBERVBMT1lfQURBUFRFUl9UWVBFID0gbmV3IE9iamVjdCgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPVVJDRV9UUkVFID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVBMT1lfVFJFRSA9IDE7Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZVRyZWVSb290IHJlc291cmNlVHJlZVJvb3Q7Ci0JcHJpdmF0ZSBpbnQgdHlwZTsKLQkKLQlwdWJsaWMgUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIoaW50IGFUeXBlKSB7Ci0JCXR5cGUgPSBhVHlwZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCBhbkFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiAoU09VUkNFX0FEQVBURVJfVFlQRSA9PSBhbkFkYXB0ZXJUeXBlICYmIHR5cGUgPT0gU09VUkNFX1RSRUUpIHx8IChERVBMT1lfQURBUFRFUl9UWVBFID09IGFuQWRhcHRlclR5cGUgJiYgdHlwZSA9PSBERVBMT1lfVFJFRSk7Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZVRyZWVSb290IGdldFJlc291cmNlVHJlZVJvb3QoKSB7CQkKLQkJaWYocmVzb3VyY2VUcmVlUm9vdCAhPSBudWxsKQotCQkJcmV0dXJuIHJlc291cmNlVHJlZVJvb3Q7Ci0JCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQlpZihyZXNvdXJjZVRyZWVSb290ID09IG51bGwpIHsKLQkJCQlJUGF0aFByb3ZpZGVyIHBhdGhQcm92aWRlcj0gKHR5cGUgPT0gREVQTE9ZX1RSRUUpID8gRGVwbG95ZWRQYXRoUHJvdmlkZXIuSU5TVEFOQ0UgOiBTb3VyY2VQYXRoUHJvdmlkZXIuSU5TVEFOQ0U7Ci0JCQkJcmVzb3VyY2VUcmVlUm9vdCA9IG5ldyBSZXNvdXJjZVRyZWVSb290KChXb3JrYmVuY2hDb21wb25lbnQpZ2V0VGFyZ2V0KCksIHBhdGhQcm92aWRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlVHJlZVJvb3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHJlZVJvb3QoUmVzb3VyY2VUcmVlUm9vdCByKXsKLQkJCi0JCXJlc291cmNlVHJlZVJvb3QgPSByOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQRW50aXR5UmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dUUEVudGl0eVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZmUwYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQRW50aXR5UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8vIFRPRE86IFdlIG5lZWQgdG8gcG9ydCB0aGUgc3RyaW5ncyB1c2VkIGluIHRoZSBleGNlcHRpb25zLgotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXVFBFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIEVudGl0eVJlc29sdmVyIHsKLQotCS8qKgotCSAqIEFsbCB0aGUgZHRkcyB0aGF0IHRoaXMgcmVzb2x2ZXIga25vd3MgYWJvdXQ7IGltcG9ydCBzdHJhdGVnaWVzIHJlZ2lzdGVyIHRoZXNlIGF0IHN0YXJ0dXAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBzdXBwb3J0ZWREdERzOwotCQotCS8vIHN0YXRpYyB7Ci0JLy8gcmVnaXN0ZXJEdEQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIsICJ4bWwueHNkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8vIHJlZ2lzdGVyRHREKCJYTUxTY2hlbWEuZHRkIiwgIlhNTFNjaGVtYS5kdGQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8gcmVnaXN0ZXJEdEQoImRhdGF0eXBlcy5kdGQiLCAiZGF0YXR5cGVzLmR0ZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvLyB9Ci0JCi0JcHVibGljIHN0YXRpYyBXVFBFbnRpdHlSZXNvbHZlciBJTlNUQU5DRSA9IG5ldyBXVFBFbnRpdHlSZXNvbHZlcigpOwotCi0JLyoqCi0JICogRWpiWG1sRW50aXR5UmVzb2x2ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV1RQRW50aXR5UmVzb2x2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0U3VwcG9ydGVkRHREcygpIHsKLQkJaWYgKHN1cHBvcnRlZER0RHMgPT0gbnVsbCkKLQkJCXN1cHBvcnRlZER0RHMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gc3VwcG9ydGVkRHREczsKLQl9Ci0KLQkvKioKLQkgKiBNYXBzIHRoZSBzeXN0ZW0gaWQgZm9yIHRoZSBkdGQgdG8gYSBsb2NhbCBpZCB0byBiZSByZXRyaWV2ZWQgbG9hZGVkIGZyb20gdGhlIGNsYXNzIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEdEQoU3RyaW5nIHN5c3RlbUlELCBTdHJpbmcgbG9jYWxJRCkgewotCQkvLyBUT0RPIFJlbW92aW5nIFJlZ2lzdHJhdGlvbiBtZWNoYW5pc20gdW50aWwgZmluYWwgbG9jYXRpb24gaXMgZm91bmQKLQkJLyoKLQkJICogZ2V0U3VwcG9ydGVkRHREcygpLnB1dChzeXN0ZW1JRCwgbG9jYWxJRCk7IGdldFN1cHBvcnRlZER0RHMoKS5wdXQoZ2V0U2hvcnROYW1lKHN5c3RlbUlEKSwKLQkJICogbG9jYWxJRCk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIGZvciBhIHN5c3RlbSBpZCB3aXRoIGEgVVJMIHRoYXQgYmVnaW5zIHdpdGggImh0dHA6Ly9qYXZhLnN1bi5jb20vIiwgY2hlY2sgdG8gc2VlIGlmIHRoYXQgaXMgYQotCSAqIHJlY29nbml6ZWQgZHRkOyBpZiBzbywgbG9hZCB0aGUgZHRkIGZyb20gdGhlIGNsYXNzIHBhdGggdXNpbmcgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlcmVkCi0JICogZHRkLgotCSAqIAotCSAqIEByZXR1cm4gYW4gSW5wdXQgc291cmNlIG9uIGEgbG9jYWxseSByZXNvbHZlZCBkdGQsIG9yIG51bGwgb2YgdGhlIHN5c3RlbWlkIGRvZXMgbm90IHN0YXJ0Ci0JICogICAgICAgICB3aXRoICJodHRwOi8vamF2YS5zdW4uY29tLyIKLQkgKiAKLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHdpdGggYSBuZXN0ZWQgTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBkdGQgaXMgbm90IHJlY29nbml6ZWQKLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSByZXNvbHZlZCBkdGQgY2Fubm90IGJlIGxvYWRlZCBmcm9tIHRoZSBjbGFzc3BhdGgKLQkgKi8KLQlwdWJsaWMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsb2NhbFJlc291cmNlTmFtZSA9IG51bGw7Ci0JCWJvb2xlYW4gaXNKYXZhU3l0ZW1JZCA9IGZhbHNlOwotCQlpZiAoc2hvdWxkQmVSZWdpc3RlcmVkKHN5c3RlbUlkKSkgewotCQkJbG9jYWxSZXNvdXJjZU5hbWUgPSAoU3RyaW5nKSBnZXRTdXBwb3J0ZWREdERzKCkuZ2V0KHN5c3RlbUlkKTsKLQkJCWlzSmF2YVN5dGVtSWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIHNob3J0TmFtZSA9IGdldFNob3J0TmFtZShzeXN0ZW1JZCk7Ci0JCQlsb2NhbFJlc291cmNlTmFtZSA9IChTdHJpbmcpIGdldFN1cHBvcnRlZER0RHMoKS5nZXQoc2hvcnROYW1lKTsKLQkJCWlmIChsb2NhbFJlc291cmNlTmFtZSAhPSBudWxsKQotCQkJCXN5c3RlbUlkID0gbG9jYWxSZXNvdXJjZU5hbWU7Ci0JCX0KLQotCQlpZiAobG9jYWxSZXNvdXJjZU5hbWUgPT0gbnVsbCkgewotCQkJaWYgKGlzSmF2YVN5dGVtSWQpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJUeXBlIGlzIHVucmVjb2duaXplZCBvciBub3QgeWV0IHN1cHBvcnRlZDogUFVCTElDX0lEPSB7MH07U1lTVEVNX0lEPXsxfSI7Ci0JCQkJdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCWlmIChsb2FkZXIgPT0gbnVsbCkgewotCQkJdXJsID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UobG9jYWxSZXNvdXJjZU5hbWUpOwotCQl9IGVsc2UgewotCQkJdXJsID0gbG9hZGVyLmdldFJlc291cmNlKGxvY2FsUmVzb3VyY2VOYW1lKTsKLQkJfQotCi0KLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICJDb3VsZCBub3QgcGFyc2UgeG1sIGJlY2F1c2UgdGhlIHJlc29sdmVkIHJlc291cmNlIFwiezB9XCIgY291bGQgbm90IGJlIGZvdW5kIGluIGNsYXNzcGF0aCI7Ci0JCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQotCQlJbnB1dFNvdXJjZSByZXN1bHQgPSBuZXcgSW5wdXRTb3VyY2UodXJsLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuc2V0UHVibGljSWQocHVibGljSWQpOwotCQkvLyBmb3JjZSB0aGUgZW5jb2RpbmcgdG8gYmUgVVRGOAotCQlyZXN1bHQuc2V0RW5jb2RpbmcoIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJlUmVnaXN0ZXJlZChTdHJpbmcgc3lzdGVtSWQpIHsKLQkJLy8gVE9ETyBSZW1vdmVkIFJlc29sdmVyIGZ1bmN0aW9uIHVudGlsIGZpbGUgbG9jYXRpb24gaXMga25vd24uLi4KLQkJcmV0dXJuIGZhbHNlOwotCQkvKgotCQkgKiByZXR1cm4gc3lzdGVtSWQuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLkpBVkFfU1VOX0NPTV9VUkwpIHx8Ci0JCSAqIHN5c3RlbUlkLnN0YXJ0c1dpdGgoSjJFRUNvbnN0YW50cy5XV1dfVzNfT1JHX1VSTCkgfHwKLQkJICogc3lzdGVtSWQuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLldXV19JQk1fQ09NX1VSTCk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGVuYW1lIGZyb20gdGhlIHVyaSwgb3IgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvcgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaG9ydE5hbWUoU3RyaW5nIHVyaSkgewotCQlTdHJpbmcgdGVtcFVSSSA9IHVyaS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCXdoaWxlICh0ZW1wVVJJLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXRlbXBVUkkgPSB0ZW1wVVJJLnN1YnN0cmluZygwLCB0ZW1wVVJJLmxlbmd0aCgpIC0gMSk7Ci0JCWludCBsYXN0SW5kZXggPSB0ZW1wVVJJLmxhc3RJbmRleE9mKCcvJyk7Ci0JCWlmIChsYXN0SW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gdXJpOwotCQlyZXR1cm4gdXJpLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxLCB0ZW1wVVJJLmxlbmd0aCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQTW9kdWxlc0luaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViNTUxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzSW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUGFzc3dvcmRFbmNvZGVyRGVjb2RlcjsKLQotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdUUE1vZHVsZXNJbml0IHsKLSAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQkJaW5pdCh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoYm9vbGVhbiB0b1ByZXJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJaWYgKCFpc0luaXRpYWxpemVkKSB7Ci0JCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQkJCXNldERlZmF1bHRFbmNvZGVyRGVjb2RlcigpOwotCQkJRE9NVXRpbGl0aWVzLnNldERlZmF1bHRFbnRpdHlSZXNvbHZlcihXVFBFbnRpdHlSZXNvbHZlci5JTlNUQU5DRSk7IAotCQkJaW5pdFJlc291cmNlRmFjdG9yaWVzKCk7Ci0JCQkKLQkJCS8vVE9ETzogUmVtb3ZlIHRoaXMgbGluZSBhZnRlciBTRUQgQWRhcHRlciBpcyByZXN0b3JlZC4KLQkJCUVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0Uuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCX0KLQkJaWYodG9QcmVyZWdpc3RlclBhY2thZ2VzKSAKLQkJCXByZXJlZ2lzdGVyUGFja2FnZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0UmVzb3VyY2VGYWN0b3JpZXMoKSB7Ci0JCVdUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsJCi0JfQotCi0JLyoqIAotCSAqIElmIHRoZSBjdXJyZW50bHkgZGVmYXVsdGVkIGVuY29kZXIgaXMgdGhlIGluaXRpYWwgcGFzcyB0aHJ1IGVuY29kZXIsCi0JICogdGhlbiByZWdpc3RlciBhIFBhc3N3b3JkIGVuY29kZXIgZm9yIHNlY3VyaXR5OyBvdGhlcndpc2UgaWYgYSBtb3JlIHNvcGhpc3RpY2F0ZWQKLQkgKiBlbmNvZGVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgdGhlbiBkbyBub3RoaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKCkgewotCQlFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IHJlZyA9IEVuY29kZXJEZWNvZGVyUmVnaXN0cnkuZ2V0RGVmYXVsdFJlZ2lzdHJ5KCk7Ci0JCWlmIChyZWcuZ2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKCkgPT0gRW5jb2RlckRlY29kZXJSZWdpc3RyeS5JTklUSUFMX0RFRkFVTFRfRU5DT0RFUikgewotCQkJcmVnLnNldERlZmF1bHRFbmNvZGVyRGVjb2RlcihuZXcgUGFzc3dvcmRFbmNvZGVyRGVjb2RlcigpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByZXJlZ2lzdGVyUGFja2FnZXMoKSB7IAotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoIm1vZHVsZUNvcmUueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgewotCQkJCXJldHVybiBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dUUE1vZHVsZXNSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQTW9kdWxlc1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYzIwODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQTW9kdWxlc1Jlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuV1RQTW9kdWxlc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlSW1wbDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXVFBNb2R1bGVzUmVzb3VyY2UgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgVHJhbnNsYXRvclJlc291cmNlIHsKLQkKLQlwdWJsaWMgV1RQTW9kdWxlc1Jlc291cmNlKFVSSSBhVVJJLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVVSSSwgYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRQdWJsaWNJZCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0UHVibGljSWQoKSB7IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRTeXN0ZW1JZCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U3lzdGVtSWQoKSB7IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSUQoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsgCi0JCXJldHVybiAwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXREb2N0eXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSB7IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0Um9vdFRyYW5zbGF0b3IoKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gV1RQTW9kdWxlc1RyYW5zbGF0b3IuSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJhNmRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3Rvcnk7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkgewotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdUUF9NT0RVTEVTX1NIT1JUX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xEX1dUUF9NT0RVTEVTX1NIT1JUX05BTUUgPSAiLmNvbXBvbmVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVF9XVFBfTU9EVUxFU19TSE9SVF9OQU1FID0gIi53dHBtb2R1bGVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIFdUUF9NT0RVTEVTX1VSSV9PQkogPSBVUkkuY3JlYXRlVVJJKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBPTERfV1RQX01PRFVMRVNfVVJJX09CSiA9IFVSSS5jcmVhdGVVUkkoIi5zZXR0aW5ncy8uY29tcG9uZW50Iik7Ci0JCi0KLQkvKioKLQkgKiBNZXRob2QgcmVnaXN0ZXJEdGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0ZHMoKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS4KLQkgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXJGYWN0b3J5Lkxpc3RlbmVyI3VwZGF0ZVJlbmRlcmVyRmFjdG9yeShjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVSZW5kZXJlckZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IG5ld1JlbmRlcmVyRmFjdG9yeSkgewotCQkvL0RvIE5vdGhpbmcuLi4gICBub3QgYWxsb3dlZCB0byBzd2l0Y2gKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKFVSSSwgUmVuZGVyZXIpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBXVFBNb2R1bGVzUmVzb3VyY2UodXJpLCBhUmVuZGVyZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBteXNlbGYgd2l0aCB0aGUgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoV1RQX01PRFVMRVNfU0hPUlRfTkFNRSwgbmV3IFdUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkoYVJlbmRlcmVyRmFjdG9yeSkpOwotCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChPTERfV1RQX01PRFVMRVNfU0hPUlRfTkFNRSwgbmV3IFdUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkoYVJlbmRlcmVyRmFjdG9yeSkpOwotCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChGSVJTVF9XVFBfTU9EVUxFU19TSE9SVF9OQU1FLCBuZXcgV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCXJlZ2lzdGVyV2l0aChFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KFdUUF9NT0RVTEVTX1VSSV9PQkopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNjk4YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlc291cmNlRmFjdG9yeURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IGV4dGVuZHMgRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JIAotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gTE9HX1dBUk5JTkdTID0gZmFsc2U7Ci0JCi0JCi0JcHJpdmF0ZSBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJbmV3IFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGRlbGVnYXRlZEdldEZhY3RvcnkoVVJJIHVyaSkgewotCQlpZiAoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UgPT0gdGhpcykKLQkJCXJldHVybiBzdXBlci5kZWxlZ2F0ZWRHZXRGYWN0b3J5KHVyaSk7Ci0JCXJldHVybiBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KHVyaSk7CQotCX0gICAKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFVSSSB1cmksIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkgPSBudWxsOwotCQlpZih1cmkgIT0gbnVsbCAmJiB1cmkubGFzdFNlZ21lbnQoKSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQkJaWYobnVsbCA9PSBkZXNjcmlwdGlvbil7Ci0JCQkJZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IodXJpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IodXJpLCBkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCQkKLQkJCWlmKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCXJlc291cmNlRmFjdG9yeSA9IGdldEZhY3RvcnkoZGVzY3JpcHRvcik7CQotCQkJfQkKLQkJfQotCQlpZihyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkKLQkJCXJlc291cmNlRmFjdG9yeSA9IHN1cGVyLmdldEZhY3RvcnkodXJpKTsKLQkJcmV0dXJuIHJlc291cmNlRmFjdG9yeTsgCi0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkodXJpLCAoSUNvbnRlbnREZXNjcmlwdGlvbiludWxsKTsKLQl9CQotCi0KLQkvKioKLQkgKiBSZWdpc3RlciBhIGZpbGUgbmFtZSByZXByZXNlbnRpbmcgdGhlIGxhc3Qgc2VnbWVudCBvZiBhIFVSSSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCi0JICogUmVzb3VyY2UuRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoU3RyaW5nIGFTaW1wbGVGaWxlTmFtZSwgUmVzb3VyY2UuRmFjdG9yeSBhRmFjdG9yeSkgeyAKLQkJCi0JCWlmKExPR19XQVJOSU5HUykgewotCQkJLyogdGhlIHRoaXJkIGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGlzIHN0YWNrIGZyYW1lLCB3ZSB3YWxrIGJhY2sgZnJvbSB0aGVyZS4gKi8KLQkJCVN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZSA9IChuZXcgRXhjZXB0aW9uKCkpLmdldFN0YWNrVHJhY2UoKTsKLQkJCWlmKHN0YWNrVHJhY2UubGVuZ3RoID4gNCkgewotCQkJCVN0cmluZ0J1ZmZlciB3YXJuaW5nTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoIldUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KCkgd2FzIGNhbGxlZCBleHBsaWNpdGx5IGZyb20gIiArIHN0YWNrVHJhY2VbM10pOwotCQkJCXdhcm5pbmdNZXNzYWdlLmFwcGVuZCgiXG5UaGlzIGhhcHBlbmVkIGFyb3VuZDogXG4iKTsKLQkJCQlmb3IgKGludCBpID0gNDsgKGkgPCBzdGFja1RyYWNlLmxlbmd0aCkgJiYgaSA8IDg7IGkrKykgewotCQkJCQl3YXJuaW5nTWVzc2FnZS5hcHBlbmQoIlx0bmVhciAiKS5hcHBlbmQoc3RhY2tUcmFjZVtpXSkuYXBwZW5kKCdcbicpOwotCQkJCX0KLQkJCQl3YXJuaW5nTWVzc2FnZS5hcHBlbmQoIi5cbkNsaWVudHMgc2hvdWxkIHVzZSB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnJlc291cmNlRmFjdG9yaWVzIGV4dGVuc2lvbiBwb2ludCBpbnN0ZWFkLiIpOwotCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nKElTdGF0dXMuSU5GTywgMCwgd2FybmluZ01lc3NhZ2UudG9TdHJpbmcoKSwgbnVsbCk7CQkKLQkJCX0KLQkJfQotCQkKLQkJc3VwZXIucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoYVNpbXBsZUZpbGVOYW1lLCBhRmFjdG9yeSk7Ci0JCQotCX0gIAotCXByaXZhdGUgV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlLZXkgZ2V0S2V5KFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSBrZXkgPSBuZXcgV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlLZXkoKTsKLQkJa2V5LnNob3J0TmFtZSA9IGRlc2NyaXB0b3IuZ2V0U2hvcnRTZWdtZW50KCk7Ci0JCWtleS50eXBlID0gZGVzY3JpcHRvci5nZXRDb250ZW50VHlwZSgpOwotCQlrZXkuaXNEZWZhdWx0ID0gZGVzY3JpcHRvci5pc0RlZmF1bHQoKTsKLQkJcmV0dXJuIGtleTsKLQl9Ci0JCi0JLyoqCi0JICogRGVjbGFyZXMgYSBzdWJjbGFzcyB0byBjcmVhdGUgUmVzb3VyY2UuRmFjdG9yeShpZXMpIGZyb20gYW4gZXh0ZW5zaW9uLiAKLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbmZpZ3VyYXRpb25SZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciAgaW1wbGVtZW50cyBJUmVzb3VyY2VGYWN0b3J5RXh0UHRDb25zdGFudHMgewotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgc2hvcnRTZWdtZW50OwotCQlwcml2YXRlIElDb250ZW50VHlwZSBjb250ZW50VHlwZTsKLQkJcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdCA9IHRydWU7Ci0JCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7IAotCQkKLQkJcHVibGljIENvbmZpZ3VyYXRpb25SZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUFzc2VydC5pc05vdE51bGwoZXh0KTsKLQkJCWVsZW1lbnQgPSBleHQ7Ci0JCQlpbml0KCk7Ci0JCX0gCi0JCQotCQlwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXNob3J0U2VnbWVudCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TSE9SVF9TRUdNRU5UKTsKLQkJCWlmKHNob3J0U2VnbWVudCA9PSBudWxsIHx8IHNob3J0U2VnbWVudC50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIAotCQkJCQkJCQkJCSJUaGUgc2hvcnRTZWdtZW50IGF0dHJpYnV0ZSBvZiAiICsgVEFHX1JFU09VUkNFX0ZBQ1RPUlkgKyAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJCSIgbXVzdCBzcGVjaWZ5IGEgdmFsaWQsIG5vbi1udWxsLCBub24tZW1wdHkgdmFsdWUgaW4gIiArICAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWVsZW1lbnQuZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpLCBudWxsKSk7Ci0JCQlpZiAoImZhbHNlIi5lcXVhbHMoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lTREVGQVVMVCkpKQotCQkJCQlpc0RlZmF1bHQgPSBmYWxzZTsKLQkJCQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYmluZGluZ3MgPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19DT05URU5UVFlQRSk7Ci0JCQlpZiAoYmluZGluZ3MubGVuZ3RoID4gMCkgewotCQkJCVN0cmluZyBjb250ZW50VHlwZUlkID0gbnVsbDsKLQkJCQljb250ZW50VHlwZUlkID0gYmluZGluZ3NbMF0uZ2V0QXR0cmlidXRlKEFUVF9DT05URU5UVFlQRUlEKTsJCQkKLQkJCQlpZiAoY29udGVudFR5cGVJZCAhPSBudWxsKQotCQkJCQljb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQkJCX0KLQkJfSAKLQotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoVVJJIGZpbGVVUkkpIHsKLQkJCS8qIHNob3J0U2VnbWVudCBtdXN0IGJlIG5vbi1udWxsIGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBjcmVhdGVkLCAKLQkJCSAqIGEgdmFsaWRhdGlvbiBjaGVjayBpbiBpbml0KCkgdmVyaWZpZXMgdGhpcyByZXF1aXJlbWVudCAqLwotCQkJaWYoZmlsZVVSSSAhPSBudWxsICYmIGZpbGVVUkkubGFzdFNlZ21lbnQoKSAhPSBudWxsKQotCQkJCXJldHVybiBzaG9ydFNlZ21lbnQuZXF1YWxzKGZpbGVVUkkubGFzdFNlZ21lbnQoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gCi0JCQotCQlwdWJsaWMgUmVzb3VyY2UuRmFjdG9yeSBjcmVhdGVGYWN0b3J5KCkgewotCQkJCi0JCQlmaW5hbCBSZXNvdXJjZS5GYWN0b3J5W10gZmFjdG9yeSA9IG5ldyBSZXNvdXJjZS5GYWN0b3J5WzFdOwotCQkJCi0JCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJZmFjdG9yeVswXSA9IChSZXNvdXJjZS5GYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsJCQkJCQotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZyhNb2R1bGVjb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwkJCQkJCi0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCXJldHVybiBmYWN0b3J5WzBdICE9IG51bGwgPyBmYWN0b3J5WzBdIDogRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuR0xPQkFMX0ZBQ1RPUlk7Ci0JCQkKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRTZWdtZW50KCkgewotCQkJcmV0dXJuIHNob3J0U2VnbWVudDsKLQkJfQotCi0JCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCQkKLQkJCXJldHVybiBjb250ZW50VHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJCXJldHVybiBpc0RlZmF1bHQ7Ci0JCX0gIAotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaWYgKGdldENvbnRlbnRUeXBlKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZ2V0U2hvcnRTZWdtZW50KCkuaGFzaENvZGUoKSAmIGdldENvbnRlbnRUeXBlKCkuaGFzaENvZGUoKTsKLQkJCWVsc2UgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYobyBpbnN0YW5jZW9mIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgJiYgZ2V0Q29udGVudFR5cGUoKSAhPSBudWxsKQotCQkJCXJldHVybiAoZ2V0U2hvcnRTZWdtZW50KCkuZXF1YWxzKCgoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcilvKS5nZXRTaG9ydFNlZ21lbnQoKSkgJiYKLQkJCQkJCWdldENvbnRlbnRUeXBlKCkuZXF1YWxzKCgoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcilvKS5nZXRDb250ZW50VHlwZSgpKSk7Ci0JCQllbHNlIGlmICgoKFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpbykuZ2V0Q29udGVudFR5cGUoKSAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQkJCi0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotCQl9Ci0JfSAgCi0JIAotCQotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciBpbXBsZW1lbnRzIElSZXNvdXJjZUZhY3RvcnlFeHRQdENvbnN0YW50cyB7IAotIAkJCi0JCXB1YmxpYyBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeVJlYWRlcigpIHsKLQkJCXN1cGVyKFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCksIE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBFWFRQVF9SRVNPVVJDRV9GQUNUT1JJRVMpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQotCQkJaWYoZWxlbWVudCAhPSBudWxsICYmIFRBR19SRVNPVVJDRV9GQUNUT1JZLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQlmaW5hbCBib29sZWFuW10gc3VjY2VzcyA9IG5ldyBib29sZWFuW10geyB0cnVlIH07IAotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQkKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQlhZGREZXNjcmlwdG9yKG5ldyBDb25maWd1cmF0aW9uUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQkJCX0gCi0KLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nKE1vZHVsZWNvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JCQkJCQlzdWNjZXNzWzBdID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsJCQkJCi0JCQkJcmV0dXJuIHN1Y2Nlc3NbMF07Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0JCi0JCX0KLQl9Ci0JcHJpdmF0ZSBjbGFzcyBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSB7IAotIAkJCi0JCXB1YmxpYyBTdHJpbmcgc2hvcnROYW1lOwotCQlwdWJsaWMgSUNvbnRlbnRUeXBlIHR5cGU7Ci0JCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCA9IHRydWU7Ci0JCXB1YmxpYyBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJCi0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0b3IoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWdldERlc2NyaXB0b3JzKCkucHV0KGdldEtleShkZXNjcmlwdG9yKSwgZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoVVJJIHVyaSwgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlTZXQga2V5cyA9IGdldERlc2NyaXB0b3JzKCkua2V5U2V0KCk7Ci0JCVJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVmYXVsdERlc2MgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0ga2V5cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSBrZXkgPSAoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlLZXkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChrZXkuc2hvcnROYW1lLmVxdWFscyh1cmkubGFzdFNlZ21lbnQoKSkpIHsKLQkJCQlSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcilnZXREZXNjcmlwdG9ycygpLmdldChrZXkpOwotCQkJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWlmIChrZXkudHlwZSA9PSBudWxsKSAKLQkJCQkJCXJldHVybiBkZXNjOwotCQkJCQllbHNlIGlmIChkZXNjLmlzRGVmYXVsdCgpKSAKLQkJCQkJCXJldHVybiBkZXNjOwotCQkJCX0KLQkJCQkvL0FsbG93IHRoZSBjb250ZW50VHlwZSBkaXNjcmltaW5hdGlvbiB0byB0YWtlIHBsYWNlCi0JCQkJaWYgKChrZXkudHlwZSAhPSBudWxsKSAmJiAKLQkJCQkJCShkZXNjcmlwdGlvbiAhPSBudWxsKSAmJiAKLQkJCQkJCShkZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmVxdWFscyhrZXkudHlwZSkpKSB7Ci0JCQkJCS8vIElmIHRoZSBjdXJyZW50IGRlc2NyaWJlciBpcyAiZGVmYXVsdCIgdGhlbiBzcGVjaWZ5Ci0JCQkJCWlmKGRlc2MuaXNEZWZhdWx0KCkpCi0JCQkJCQlyZXR1cm4gZGVzYzsKLQkJCQkJZWxzZSAJCi0JCQkJCQlkZWZhdWx0RGVzYyA9IGRlc2M7Ci0JCQkJfQotCQkJCQkKLQkJCQlpZiAoKGRlc2NyaXB0aW9uICE9IG51bGwpICYmIChkZXNjLmlzRGVmYXVsdCgpKSAmJiAoZGVmYXVsdERlc2MgPT0gbnVsbCkpCi0JCQkJCWRlZmF1bHREZXNjID0gZGVzYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdERlc2M7Ci0JfQotcHJpdmF0ZSBVUkkgbmV3UGxhdGZvcm1VUkkoVVJJIGFOZXdVUkksIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCi0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gTW9kdWxlVVJJVXRpbC50cmltVG9EZXBsb3lQYXRoU2VnbWVudChhTmV3VVJJKTsKLQkJdHJ5IHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCi0JCQlVUkkgZGVwbG95UGF0aFNlZ21lbnQgPSBNb2R1bGVVUklVdGlsLnRyaW1Ub0RlcGxveVBhdGhTZWdtZW50KGFOZXdVUkkpOwotCQkJCi0JCQkvL0lWaXJ0dWFsRmlsZSBuZXdGaWxlID0gY29tcG9uZW50LmdldEZpbGUobmV3IFBhdGgoZGVwbG95UGF0aFNlZ21lbnQucGF0aCgpKSk7CQkJCi0JCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCUlWaXJ0dWFsRmlsZSBuZXdGaWxlID0gcm9vdEZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKGRlcGxveVBhdGhTZWdtZW50LnBhdGgoKSkpOwotCQkJCi0JCQlyZXR1cm4gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkobmV3RmlsZS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCSAKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGVudERlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uRnJvbVVSSShVUkkgdXJpKSB7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlkZW50aWZpZXIgPSBNb2R1bGVVUklVdGlsLmdldENvbnRlbnRUeXBlTmFtZSh1cmkpOwotCQlpZiAoY29udGVudFR5cGVJZGVudGlmaWVyICE9IG51bGwpCi0JCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZGVudGlmaWVyKS5nZXREZWZhdWx0RGVzY3JpcHRpb24oKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKFVSSSB1cmkpIHsKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldFBsYXRmb3JtRmlsZSh1cmkpOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ly9DaGVjayBmb3Igb3B0aW9uYWwgZW1iZWRkZWQgdXJpIHNlZ21lbnQsIHRoZW4gbm9ybWFsaXplCi0JCQlkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uRnJvbVVSSSh1cmkpOwotCQkJdHJ5IHsKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQlJUHJvamVjdCBjb21wb25lbnRQcm9qZWN0ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbXBvbmVudFByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KHVyaSk7Ci0JCQkJCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCQl1cmkgPSBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24ucmVzb2x2ZSh1cmkpOwotCQkJCQl1cmkgPSBuZXdQbGF0Zm9ybVVSSSh1cmksY29tcG9uZW50UHJvamVjdCk7Ci0JCQkJfSAKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZWZhdWx0RGVzYyA9IGdldERlc2NyaXB0b3IodXJpLCBkZXNjcmlwdGlvbik7Ci0JCS8vIE9rIG5vIGNvbnRlbnQgdHlwZSBtYXRjaCAtIGdvIHRvIHN1cGVyCi0JCWlmIChkZWZhdWx0RGVzYyAhPSBudWxsKXsKLQkJCXJldHVybiBkZWZhdWx0RGVzYzsKLQkJfQotCQllbHNlewotCQkJcmV0dXJuIHN1cGVyLmdldERlc2NyaXB0b3IodXJpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dvcmtiZW5jaENvbXBvbmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dvcmtiZW5jaENvbXBvbmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzZWJiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Xb3JrYmVuY2hDb21wb25lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrYmVuY2hDb21wb25lbnRJbXBsLmphdmEsdiAxLjE0IDIwMDcvMDIvMTQgMTY6MDA6NTIganNob2xsIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtiZW5jaCBNb2R1bGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV29ya2JlbmNoQ29tcG9uZW50SW1wbCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV29ya2JlbmNoQ29tcG9uZW50SW1wbCNnZXRDb21wb25lbnRUeXBlIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV29ya2JlbmNoQ29tcG9uZW50SW1wbCNnZXRSZWZlcmVuY2VkQ29tcG9uZW50cyA8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwjZ2V0TWV0YWRhdGFSZXNvdXJjZXMgPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaENvbXBvbmVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdvcmtiZW5jaENvbXBvbmVudCB7Ci0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFU3luY2hyb25pemVkQWRhcHRlckxpc3QgZXh0ZW5kcyBFQWRhcHRlckxpc3QKLQkgIHsKLQkKLQkgICAgcHVibGljIEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdChOb3RpZmllciBub3RpZmllcikgewotCQkJc3VwZXIobm90aWZpZXIpOwotCQl9Ci0JCi0JCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN5bmNocm9uaXplZCAodGhpcykge3JldHVybiBzdXBlci5hZGQob2JqZWN0KTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtzdXBlci5hZGQoaW5kZXgsIG9iamVjdCk7fQotCSAgICB9Ci0JCi0JICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICAgIHsKLQkgICAgc3luY2hyb25pemVkICh0aGlzKSB7cmV0dXJuIHN1cGVyLmFkZEFsbChjb2xsZWN0aW9uKTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgc3luY2hyb25pemVkICh0aGlzKSB7cmV0dXJuIHN1cGVyLnJlbW92ZShvYmplY3QpO30KLQkgICAgfQotCQotCSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpCi0JICAgIHsKLQkgICAgc3luY2hyb25pemVkICh0aGlzKSB7cmV0dXJuIHN1cGVyLnJlbW92ZShpbmRleCk7fQotCSAgICB9Ci0JCi0JICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICAgIHsKLQkgICAgc3luY2hyb25pemVkICh0aGlzKSB7cmV0dXJuIHN1cGVyLnJlbW92ZUFsbChjb2xsZWN0aW9uKTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIHZvaWQgY2xlYXIoKQotCSAgICB7Ci0JICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtzdXBlci5jbGVhcigpO307Ci0JICAgIH0KLQkKLQkKLQkgICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN5bmNocm9uaXplZCAodGhpcykge3JldHVybiBzdXBlci5zZXQoaW5kZXgsIG9iamVjdCk7fQotCSAgICB9Ci0JCi0JICAgIHB1YmxpYyB2b2lkIG1vdmUoaW50IG5ld1Bvc2l0aW9uLCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN5bmNocm9uaXplZCAodGhpcykge3N1cGVyLm1vdmUobmV3UG9zaXRpb24sIG9iamVjdCk7fQotCSAgICB9Ci0JCi0JICAgIHB1YmxpYyBPYmplY3QgbW92ZShpbnQgbmV3UG9zaXRpb24sIGludCBvbGRQb3NpdGlvbikKLQkgICAgewotCSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtyZXR1cm4gc3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2xkUG9zaXRpb24pO30KLQkgICAgfQotCSAgfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VzKCkgPGVtPlJlc291cmNlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBvbmVudFR5cGUoKSA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb25lbnRUeXBlIGNvbXBvbmVudFR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKSA8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVmZXJlbmNlZENvbXBvbmVudHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcm9wZXJ0aWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGFkYXRhUmVzb3VyY2VzKCkgPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRhZGF0YVJlc291cmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGFkYXRhUmVzb3VyY2VzID0gbnVsbDsKLQotLy8JcHJpdmF0ZSBmaW5hbCBNYXAgcmVzb3VyY2VJbmRleEJ5RGVwbG95UGF0aCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwlwcml2YXRlIGZpbmFsIE1hcCByZXNvdXJjZUluZGV4QnlTb3VyY2VQYXRoID0gbmV3IEhhc2hNYXAoKTsKLQotLy8JcHJpdmF0ZSBib29sZWFuIGlzSW5kZXhlZEJ5RGVwbG95UGF0aDsKLQotLy8JcHJpdmF0ZSBib29sZWFuIGlzSW5kZXhlZEJ5U291cmNlUGF0aDsKLQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcG9uZW50UmVzb3VyY2VbXSBOT19NT0RVTEVfUkVTT1VSQ0VTID0gbmV3IENvbXBvbmVudFJlc291cmNlWzBdOwotCi0JcHJpdmF0ZSBVUkkgaGFuZGxlOwotCQotCXByaXZhdGUgSVBhdGggZGVmYXVsdFNvdXJjZVJvb3Q7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtiZW5jaENvbXBvbmVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRGaXJzdFJvb3RTb3VyY2UoKSB7Ci0JCQotCQlMaXN0IHJlcyA9IGdldFJlc291cmNlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSBlbGVtZW50ID0gKENvbXBvbmVudFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKCIvIikpKQotCQkJCXJldHVybiBlbGVtZW50LmdldFNvdXJjZVBhdGgoKTsKLQkJCQotCQl9CQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya2JlbmNoQ29tcG9uZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lR2VuKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdEZXBsb3llZE5hbWUpIHsKLQkJc2V0TmFtZUdlbihuZXdEZXBsb3llZE5hbWUpOwotCQkvLyBUT0RPIEEgbW9yZSBhZHZhbmNlZCBhZGFwdGVyIHNob3VsZCBiZSBhcHBsaWVkIHRvIGtlZXAgdGhlIGhhbmRsZSB1cCB0byBkYXRlLgotCQlpZiAoZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJVVJJIHJlc291cmNlVVJJID0gZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0vLwkJCVN0cmluZyBzYWZlRGVwbG95ZWROYW1lID0gZ2V0TmFtZSgpICE9IG51bGwgPyBnZXROYW1lKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlc291cmNlVVJJICE9IG51bGwgJiYgcmVzb3VyY2VVUkkuc2VnbWVudENvdW50KCkgPj0gMikKLQkJCQlzZXRIYW5kbGUoY29tcHV0ZUhhbmRsZSgpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRIYW5kbGUoVVJJIGFIYW5kbGUpIHsKLQkJaGFuZGxlID0gYUhhbmRsZTsKLQl9Ci0JCi0JcHVibGljIFVSSSBnZXRIYW5kbGUoKSB7Ci0JCWlmKGhhbmRsZSA9PSBudWxsKQotCQkJaGFuZGxlID0gY29tcHV0ZUhhbmRsZSgpOwotCQlyZXR1cm4gaGFuZGxlOwotCX0KLQotCXByaXZhdGUgVVJJIGNvbXB1dGVIYW5kbGUoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5NT0RVTEVfUFJPVE9DT0wgKyBJUGF0aC5TRVBBUkFUT1IgKyBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uUkVTT1VSQ0VfTU9EVUxFICsgSVBhdGguU0VQQVJBVE9SICsgY29tcHV0ZVByb2plY3ROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKyBnZXROYW1lKCkpOwotCQkKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlUHJvamVjdE5hbWUoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QodGhpcyk7Ci0JCXJldHVybiAocHJvamVjdCE9bnVsbCk/cHJvamVjdC5nZXROYW1lKCk6IlVOQ09OVEFJTkVEIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVzb3VyY2VzKCkgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXJlc291cmNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KENvbXBvbmVudFJlc291cmNlLmNsYXNzLCB0aGlzLCBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRVNPVVJDRVMsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5UKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRUeXBlIGdldENvbXBvbmVudFR5cGUoKSB7Ci0JCXJldHVybiBjb21wb25lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbXBvbmVudFR5cGUoQ29tcG9uZW50VHlwZSBuZXdDb21wb25lbnRUeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbXBvbmVudFR5cGUgb2xkQ29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7Ci0JCWNvbXBvbmVudFR5cGUgPSBuZXdDb21wb25lbnRUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRSwgb2xkQ29tcG9uZW50VHlwZSwgbmV3Q29tcG9uZW50VHlwZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZShDb21wb25lbnRUeXBlIG5ld0NvbXBvbmVudFR5cGUpIHsKLQkJaWYgKG5ld0NvbXBvbmVudFR5cGUgIT0gY29tcG9uZW50VHlwZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29tcG9uZW50VHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb21wb25lbnRUeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbXBvbmVudFR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29tcG9uZW50VHlwZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbXBvbmVudFR5cGUobmV3Q29tcG9uZW50VHlwZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRSwgbmV3Q29tcG9uZW50VHlwZSwgbmV3Q29tcG9uZW50VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpIHsKLQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnRzID09IG51bGwpIHsKLQkJCXJlZmVyZW5jZWRDb21wb25lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlZmVyZW5jZWRDb21wb25lbnQuY2xhc3MsIHRoaXMsIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFRkVSRU5DRURfQ09NUE9ORU5UUyk7Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZWRDb21wb25lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQcm9wZXJ0aWVzKCkgewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChQcm9wZXJ0eS5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGFkYXRhUmVzb3VyY2VzKCkgewotCQlpZiAobWV0YWRhdGFSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbWV0YWRhdGFSZXNvdXJjZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoSVBhdGguY2xhc3MsIHRoaXMsIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX01FVEFEQVRBX1JFU09VUkNFUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGFkYXRhUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q29tcG9uZW50VHlwZShudWxsLCBtc2dzKTsKLQkJCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFRkVSRU5DRURfQ09NUE9ORU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRDb21wb25lbnRUeXBlKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFRkVSRU5DRURfQ09NUE9ORU5UUzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19NRVRBREFUQV9SRVNPVVJDRVM6Ci0JCQkJcmV0dXJuIGdldE1ldGFkYXRhUmVzb3VyY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTOgotCQkJCWdldFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFOgotCQkJCXNldENvbXBvbmVudFR5cGUoKENvbXBvbmVudFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVGRVJFTkNFRF9DT01QT05FTlRTOgotCQkJCWdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fTUVUQURBVEFfUkVTT1VSQ0VTOgotCQkJCWdldE1ldGFkYXRhUmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRhZGF0YVJlc291cmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUzoKLQkJCQlnZXRSZXNvdXJjZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJc2V0Q29tcG9uZW50VHlwZSgoQ29tcG9uZW50VHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFRkVSRU5DRURfQ09NUE9ORU5UUzoKLQkJCQlnZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fTUVUQURBVEFfUkVTT1VSQ0VTOgotCQkJCWdldE1ldGFkYXRhUmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTOgotCQkJCXJldHVybiByZXNvdXJjZXMgIT0gbnVsbCAmJiAhcmVzb3VyY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbXBvbmVudFR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVGRVJFTkNFRF9DT01QT05FTlRTOgotCQkJCXJldHVybiByZWZlcmVuY2VkQ29tcG9uZW50cyAhPSBudWxsICYmICFyZWZlcmVuY2VkQ29tcG9uZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX01FVEFEQVRBX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gbWV0YWRhdGFSZXNvdXJjZXMgIT0gbnVsbCAmJiAhbWV0YWRhdGFSZXNvdXJjZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGFkYXRhUmVzb3VyY2VzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtZXRhZGF0YVJlc291cmNlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKElQYXRoIGFEZXBsb3lQYXRoKSB7IAotCQlSZXNvdXJjZVRyZWVSb290IHJlc291cmNlVHJlZVJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldERlcGxveVJlc291cmNlVHJlZVJvb3QodGhpcyk7Ci0JCXJldHVybiByZXNvdXJjZVRyZWVSb290LmZpbmRNb2R1bGVSZXNvdXJjZXMoYURlcGxveVBhdGgsIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOyAKLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50UmVzb3VyY2VbXSBmaW5kUmVzb3VyY2VzQnlTb3VyY2VQYXRoKElQYXRoIGFTb3VyY2VQYXRoLCBpbnQgcmVzb3VyY2VGbGFnKSB7IAotCQlSZXNvdXJjZVRyZWVSb290IHJlc291cmNlVHJlZVJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldFNvdXJjZVJlc291cmNlVHJlZVJvb3QodGhpcyk7Ci0JCXJldHVybiByZXNvdXJjZVRyZWVSb290LmZpbmRNb2R1bGVSZXNvdXJjZXMoYVNvdXJjZVBhdGgsIHJlc291cmNlRmxhZyk7IAotCX0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoSVBhdGggYVNvdXJjZVBhdGgsIGludCByZXNvdXJjZUZsYWcpIHsgCi0JCVJlc291cmNlVHJlZVJvb3QgcmVzb3VyY2VUcmVlUm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0U291cmNlUmVzb3VyY2VUcmVlUm9vdCh0aGlzKTsKLQkJcmV0dXJuIHJlc291cmNlVHJlZVJvb3QuZXhpc3RzKGFTb3VyY2VQYXRoLCByZXNvdXJjZUZsYWcpOyAKLQl9Ci0JcHVibGljIEVMaXN0IGVBZGFwdGVycygpCi0JICB7Ci0JICAgIGlmIChlQWRhcHRlcnMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVBZGFwdGVycyA9ICBuZXcgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQWRhcHRlcnM7Ci0JICB9Ci0KLQotCXB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzeW5jaHJvbml6ZWQgKGVBZGFwdGVycygpKSB7Ci0JCQlzdXBlci5lTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElQYXRoIGdldERlZmF1bHRTb3VyY2VSb290KCkgewotCQlpZiAoZGVmYXVsdFNvdXJjZVJvb3QgPT0gbnVsbCkKLQkJCWRlZmF1bHRTb3VyY2VSb290ID0gZ2V0Rmlyc3RSb290U291cmNlKCk7Ci0JCXJldHVybiBkZWZhdWx0U291cmNlUm9vdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFNvdXJjZVJvb3QoSVBhdGggZGVmYXVsdFNvdXJjZVJvb3QpIHsKLQkJdGhpcy5kZWZhdWx0U291cmNlUm9vdCA9IGRlZmF1bHRTb3VyY2VSb290OwotCX0KLSAgCi0KLX0gLy8gV29ya2JlbmNoQ29tcG9uZW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9BcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9BcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTYxNDIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVFlQRV9JRCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENPTVBPTkVOVF9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPTVBUX09OX1NBVkUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChUQVJHRVRfUFJPSkVDVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFRBUkdFVF9DT01QT05FTlQpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgbW9kZWwuZ2V0UHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKLQkJaWYgKHByb2plY3ROYW1lICE9IG51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPTVBUX09OX1NBVkUpKQotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVEFSR0VUX1BST0pFQ1QpKQotCQkJcmV0dXJuIGdldFRhcmdldFByb2plY3QoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhUQVJHRVRfQ09NUE9ORU5UKSkKLQkJCXJldHVybiBnZXRUYXJnZXRDb21wb25lbnQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT01QT05FTlRfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGdldFdvcmtiZW5jaE1vZHVsZSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChnZXRUYXJnZXRQcm9qZWN0KCkpOwotCQkJbW9kdWxlID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChudWxsICE9IG1vZHVsZUNvcmUpIHsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlib29sZWFuIG5vdGlmeSA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCWlmIChDT01QT05FTlRfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkKLQkJCXNldFByb3BlcnR5KFBST0pFQ1RfTkFNRSwgcHJvcGVydHlWYWx1ZSk7Ci0JCXJldHVybiBub3RpZnk7Ci0JfQotCi0JcHVibGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkgewotCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gZ2V0V29ya2JlbmNoTW9kdWxlKCk7Ci0JCUlQcm9qZWN0IHByb2ogPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KG1vZHVsZSk7Ci0JCXJldHVybiBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNPSygpKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKQotCQkJcmV0dXJuIHZhbGlkYXRlTW9kdWxlTmFtZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlTW9kdWxlTmFtZSgpIHsKLQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlpZiAobW9kdWxlTmFtZSA9PSBudWxsIHx8IG1vZHVsZU5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlBST0pFQ1RfTkFNRV9FTVBUWSkpOwotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0VGFyZ2V0Q29tcG9uZW50KCkgewotCQlTdHJpbmcgbW9kdWxlTmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KENPTVBPTkVOVF9OQU1FKTsKLQkJaWYgKG1vZHVsZU5hbWUgIT0gbnVsbCAmJiBtb2R1bGVOYW1lLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRUYXJnZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gbnVsbDsKLQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0FydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0FydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NTY1MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5BcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JQXJ0aWZhY3RFZGl0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5JVmFsaWRhdGVFZGl0Q29udGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCQotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0OwotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0IGVtZldvcmtiZW5jaENvbnRleHQ7Ci0vLwlwcml2YXRlIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdGlhbGl6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZW1mV29ya2JlbmNoQ29udGV4dCA9IChFTUZXb3JrYmVuY2hDb250ZXh0KSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuY3JlYXRlRU1GQ29udGV4dChnZXRUYXJnZXRQcm9qZWN0KCksIG51bGwpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBnZXRUYXJnZXRDb21wb25lbnQoKTsgCi0JCWFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdEZvck1vZHVsZShjb21wb25lbnQpOwotCQlkb0luaXRpYWxpemUobW9uaXRvcik7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpOwotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci0JCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldFRhcmdldENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFRhcmdldFByb2plY3QoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb0luaXRpYWxpemUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKLQkJQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIuaW5zdGFuY2UoKTsKLQkJSUFydGlmYWN0RWRpdEZhY3RvcnkgZmFjdG9yeSA9IHJlYWRlci5nZXRBcnRpZmFjdEVkaXQoY29tcC5nZXRQcm9qZWN0KCkpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0RWRpdEZvcldyaXRlKGNvbXApOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhcnRpZmFjdEVkaXQhPW51bGwpIHsKLQkJCWFydGlmYWN0RWRpdC5zYXZlSWZOZWNlc3NhcnkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWluaXRpYWxpemUobW9uaXRvcik7Ci0JCQlpZiAodmFsaWRhdGVFZGl0KCkuaXNPSygpKQotCQkJCXJldHVybiBkb0V4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0gZmluYWxseSB7Ci0JCQlkaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0KCl7Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgZWRpdCBmb3IgcmVzb3VyY2Ugc3RhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoKSB7Ci0JCUlWYWxpZGF0ZUVkaXRDb250ZXh0IHZhbGlkYXRvciA9IChJVmFsaWRhdGVFZGl0Q29udGV4dCkgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZShJVmFsaWRhdGVFZGl0Q29udGV4dC5DTEFTU19LRVkpOwotCQlyZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRlU3RhdGUoKEVkaXRNb2RlbClnZXRBcnRpZmFjdEVkaXQoKS5nZXRBZGFwdGVyKEFydGlmYWN0RWRpdE1vZGVsLkFEQVBURVJfVFlQRSkpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0NyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwOTkwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0NyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChTT1VSQ0VfQ09NUE9ORU5UKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChUQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AobW9kZWwpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKFRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVAuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBtYXApOwotCQkJcmV0dXJuIG1hcDsKLQkJfQotCQkKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVEFSR0VUX0NPTVBPTkVOVF9MSVNUKSkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgpKXsKLQkJCXJldHVybiAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMTU5ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQotCXB1YmxpYyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghdmFsaWRhdGVFZGl0KCkuaXNPSygpKQotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQlhZGRSZWZlcmVuY2VkQ29tcG9uZW50cyhtb25pdG9yKTsKLQkJYWRkUHJvamVjdFJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgZWRpdCBmb3IgcmVzb3VyY2Ugc3RhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gT0tfU1RBVFVTOwotCQlJVmFsaWRhdGVFZGl0Q29udGV4dCB2YWxpZGF0b3IgPSAoSVZhbGlkYXRlRWRpdENvbnRleHQpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoSVZhbGlkYXRlRWRpdENvbnRleHQuQ0xBU1NfS0VZKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gc291cmNlQ29tcC5nZXRQcm9qZWN0KCk7Ci0KLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCVN0cnVjdHVyZUVkaXQgc0VkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzRWRpdCA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJCXN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZVN0YXRlKHNFZGl0LmdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbCgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHNFZGl0ICE9bnVsbCkKLQkJCQkJc0VkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCQotCQlJRmlsZSBbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLQkJZmlsZXNbMF0gPSBwcm9qZWN0LmdldEZpbGUoUHJvamVjdFV0aWxpdGllcy5ET1RfUFJPSkVDVCk7Ci0JCXN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsIG51bGwpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2plY3RSZWZlcmVuY2VzKCkgewotCi0JCUlWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5UKTsKLQkJTGlzdCBtb2RMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQlMaXN0IHRhcmdldHByb2plY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IElWaXJ0dWFsQ29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RMaXN0LmdldChpKTsKLQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBJVmlydHVhbENvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCQl0YXJnZXRwcm9qZWN0TGlzdC5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVByb2plY3RVdGlsaXRpZXMuYWRkUmVmZXJlbmNlUHJvamVjdHMoc291cmNlQ29tcC5nZXRQcm9qZWN0KCksIHRhcmdldHByb2plY3RMaXN0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VkQ29tcG9uZW50cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQpOwotCQlMaXN0IHZsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG1vZExpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCVN0cmluZyBkZXBsb3lQYXRoU3RyID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRIKTsKLQkJSVBhdGggZGVwbG95UGF0aCA9IG51bGw7Ci0JCWlmIChkZXBsb3lQYXRoU3RyICE9IG51bGwgJiYgZGVwbG95UGF0aFN0ci5sZW5ndGgoKSA+IDApewotCQkJZGVwbG95UGF0aCA9IG5ldyBQYXRoKGRlcGxveVBhdGhTdHIpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kTGlzdC5zaXplKCk7IGkrKykgewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kTGlzdC5nZXQoaSk7Ci0JCQlpZiAoIXNyY0NvbXBvbmVudENvbnRhaW5zUmVmZXJlbmNlKHNvdXJjZUNvbXAsIGNvbXAsIGRlcGxveVBhdGgpKSB7Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2Uoc291cmNlQ29tcCwgY29tcCk7Ci0JCQkJaWYoZGVwbG95UGF0aCAhPSBudWxsKXsKLQkJCQkJcmVmLnNldFJ1bnRpbWVQYXRoKG5ldyBQYXRoKGRlcGxveVBhdGhTdHIpKTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSBnZXRBcmNoaXZlTmFtZShjb21wKTsKLQkJCQlpZiAoYXJjaGl2ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJlZi5zZXRBcmNoaXZlTmFtZShhcmNoaXZlTmFtZSk7Ci0JCQkJfQotCQkJCXZsaXN0LmFkZChyZWYpOwotCQkJfQotCQl9Ci0KLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gKElWaXJ0dWFsUmVmZXJlbmNlW10pIHZsaXN0LnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW3ZsaXN0LnNpemUoKV0pOwotCQlzb3VyY2VDb21wLmFkZFJlZmVyZW5jZXMocmVmcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBcmNoaXZlTmFtZShJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCU1hcCBtYXAgPSAoTWFwKSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCk7Ci0JCVN0cmluZyB1cmkgPSAoU3RyaW5nKSBtYXAuZ2V0KGNvbXApOwotCQlyZXR1cm4gdXJpID09IG51bGwgPyAiIiA6IHVyaTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHJpdmF0ZSBib29sZWFuIHNyY0NvbXBvbmVudENvbnRhaW5zUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXAsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAsIElQYXRoIGRlcGxveVBhdGgpIHsKLQkJaWYgKChzb3VyY2VDb21wICE9IG51bGwgJiYgc291cmNlQ29tcC5nZXRQcm9qZWN0KCkgIT0gbnVsbCkgJiYgKGNvbXAgIT0gbnVsbCAmJiBjb21wLmdldFByb2plY3QoKSAhPSBudWxsKSkgewotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBleGlzdGluZ1JlZmVyZW5jZXMgPSBzb3VyY2VDb21wLmdldFJlZmVyZW5jZXMoKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSBudWxsOwotCQkJaWYgKGV4aXN0aW5nUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ1JlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gZXhpc3RpbmdSZWZlcmVuY2VzW2ldOwotCQkJCQlpZihyZWYgIT0gbnVsbCl7Ci0JCQkJCQkvL2Fsc28gY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXBsb3kgcGF0aCBpcyB0aGUgc2FtZSAocmVtZW1iZXIgdGhhdCBpdCBjYW4gYmUgbnVsbCkKLQkJCQkJCWlmKChyZWYuZ2V0UnVudGltZVBhdGgoKSA9PSBudWxsICYmIGRlcGxveVBhdGggIT0gbnVsbCkgfHwgcmVmLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKGRlcGxveVBhdGgpKXsKLQkJCQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50ID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsJCi0JCQkJCQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnQgIT0gbnVsbCAmJiByZWZlcmVuY2VkQ29tcG9uZW50LmVxdWFscyhjb21wKSApeyAKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vRmFjZXREYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vRmFjZXREYXRhTW9kZWxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1OGIxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0ZhY2V0RGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlOwotCi1wdWJsaWMgY2xhc3MgRmFjZXREYXRhTW9kZWxPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgRmFjZXREYXRhTW9kZWxPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qOwotCQl0cnkgewotCQkJZmFjZXRQcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FKSwgbnVsbCwgbW9uaXRvcik7Ci0JCQlTZXQgYWN0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlhY3Rpb25zLmFkZChuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbigoVHlwZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9UWVBFKSwgKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04pLCBtb2RlbCkpOwotCQkJZmFjZXRQcm9qLm1vZGlmeShhY3Rpb25zLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9GYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9GYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRjZDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW50aW1lQWRkZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBGYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qID0gY3JlYXRlUHJvamVjdChtb25pdG9yKTsKLQkJCVNldCBleGlzdGluZ0ZhY2V0cyA9IGZhY2V0UHJvai5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0KLQkJCU1hcCBkbU1hcCA9IChNYXApIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCVNldCBhY3Rpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJCUlEYXRhTW9kZWwgZmFjZXRETSA9IG51bGw7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZG1NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCWZhY2V0RE0gPSAoSURhdGFNb2RlbCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChmYWNldERNLmdldEJvb2xlYW5Qcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlNIT1VMRF9FWEVDVVRFKSkgewotCQkJCQlTdHJpbmcgZmFjZXRJRCA9IGZhY2V0RE0uZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCk7Ci0JCQkJCWJvb2xlYW4gc2hvdWxkSW5zdGFsbEZhY2V0ID0gdHJ1ZTsKLQkJCQkJZm9yIChJdGVyYXRvciBleGlzdGluZ0ZhY2V0c0l0ZXJhdG9yID0gZXhpc3RpbmdGYWNldHMuaXRlcmF0b3IoKTsgc2hvdWxkSW5zdGFsbEZhY2V0ICYmIGV4aXN0aW5nRmFjZXRzSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJSVByb2plY3RGYWNldFZlcnNpb24gdmVyc2lvbiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbikgZXhpc3RpbmdGYWNldHNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAodmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLmVxdWFscyhmYWNldElEKSkgewotCQkJCQkJCXNob3VsZEluc3RhbGxGYWNldCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzaG91bGRJbnN0YWxsRmFjZXQpIHsKLQkJCQkJCWFjdGlvbnMuYWRkKGZhY2V0RE0uZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9BQ1RJT04pKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCU1hcCBhY3Rpb25zTWFwID0gKE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9BQ1RJT05fTUFQKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3Rpb25zTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlhY3Rpb25zLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQkJfQotCQkJaWYgKCFhY3Rpb25zLmlzRW1wdHkoKSkgewotCQkJCWZhY2V0UHJvai5tb2RpZnkoYWN0aW9ucywgbW9uaXRvcik7Ci0JCQl9Ci0JCQlTZXQgZml4ZWRGYWNldHMgPSBuZXcgSGFzaFNldCgpLCBuZXdGYWNldFZlcnNpb25zID0gZmFjZXRQcm9qLmdldFByb2plY3RGYWNldHMoKSwgZXhpc3RpbmdGaXhlZEZhY2V0cyA9IGZhY2V0UHJvai5nZXRGaXhlZFByb2plY3RGYWNldHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0ZhY2V0VmVyc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgZmFjZXRJRCA9IGZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpOwotCQkJCWJvb2xlYW4gc2hvdWxkSW5zdGFsbEZhY2V0ID0gdHJ1ZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGV4aXN0aW5nRmFjZXRzSXRlcmF0b3IgPSBleGlzdGluZ0ZpeGVkRmFjZXRzLml0ZXJhdG9yKCk7IHNob3VsZEluc3RhbGxGYWNldCAmJiBleGlzdGluZ0ZhY2V0c0l0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJSVByb2plY3RGYWNldCBmYWNldCA9IChJUHJvamVjdEZhY2V0KSBleGlzdGluZ0ZhY2V0c0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGZhY2V0LmdldElkKCkuZXF1YWxzKGZhY2V0SUQpKSB7Ci0JCQkJCQlzaG91bGRJbnN0YWxsRmFjZXQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoc2hvdWxkSW5zdGFsbEZhY2V0KSB7Ci0JCQkJCWZpeGVkRmFjZXRzLmFkZChmYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZml4ZWRGYWNldHMuaXNFbXB0eSgpKSB7Ci0JCQkJZmFjZXRQcm9qLnNldEZpeGVkUHJvamVjdEZhY2V0cyhmaXhlZEZhY2V0cyk7Ci0JCQl9Ci0JCQlpZiAocnVudGltZUFkZGVkKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKTsKLQkJCQlhZGREZWZhdWx0RmFjdGV0cyhmYWNldFByb2osIHJ1bnRpbWUpOwotCQkJfQotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRGYWNldHMoSUZhY2V0ZWRQcm9qZWN0IGZhY2V0UHJvaiwgU2V0IGRlZmF1bHRGYWNldHMpIHsKLQkJU2V0IGFjdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWZhdWx0RmFjZXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmICghZmFjZXRQcm9qLmhhc1Byb2plY3RGYWNldChmYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkpKSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IElGYWNldGVkUHJvamVjdC5BY3Rpb24oQWN0aW9uLlR5cGUuSU5TVEFMTCwgZmFjZXRWZXJzaW9uLCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJaWYgKCFhY3Rpb25zLmlzRW1wdHkoKSkKLQkJCQlmYWNldFByb2oubW9kaWZ5KGFjdGlvbnMsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJRmFjZXRlZFByb2plY3QgY3JlYXRlUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoU3RyaW5nKSBtb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSkpOwotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qID0gbnVsbDsKLQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCWZhY2V0UHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0LCB0cnVlLCBtb25pdG9yKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IChTdHJpbmcpIG1vZGVsLmdldFByb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTE9DQVRJT04pOwotCQkJSVBhdGggbG9jYXRpb25QYXRoID0gbnVsbCA9PSBsb2NhdGlvbiA/IG51bGwgOiBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQlmYWNldFByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpLCBsb2NhdGlvblBhdGgsIG1vbml0b3IpOwotCQl9Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSk7Ci0JCUlSdW50aW1lIGV4aXN0aW5nUnVudGltZSA9IGZhY2V0UHJvai5nZXRQcmltYXJ5UnVudGltZSgpOwotCQlpZiAocnVudGltZSAhPSBudWxsICYmIChleGlzdGluZ1J1bnRpbWUgPT0gbnVsbCB8fCAhcnVudGltZS5lcXVhbHMoZXhpc3RpbmdSdW50aW1lKSkpIHsKLQkJCWZhY2V0UHJvai5zZXRUYXJnZXRlZFJ1bnRpbWVzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihydW50aW1lKSwgbnVsbCk7Ci0JCQlydW50aW1lQWRkZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWNldFByb2o7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0RmFjdGV0cyhJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qLCBJUnVudGltZSBydW50aW1lKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCi0JCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgPSBmYWNldFByb2ouY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQlTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IHByZXNldEZhY2V0cyA9IGZwandjLmdldERlZmF1bHRDb25maWd1cmF0aW9uKCkuZ2V0UHJvamVjdEZhY2V0cygpOwotCQkJCWFkZERlZmF1bHRGYWNldHMoZmFjZXRQcm9qLCBwcmVzZXRGYWNldHMpOwotCQkJfQotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjMzkyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0lBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqIFJlcXVpcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRCA9ICJJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5UWVBFX0lEIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJlcXVpcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBSZXF1aXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9OQU1FID0gIklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE9wdGlvbmFsLCBzaG91bGQgc2F2ZSB3aXRoIHByb21wdC4uLmRlZmF1bHRzIHRvIGZhbHNlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPTVBUX09OX1NBVkUgPSAiSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPTVBUX09OX1NBVkUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1BST0pFQ1QgPSAiSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX1BST0pFQ1QiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0NPTVBPTkVOVCA9ICJJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9Qcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MDczODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9Qcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5JQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0TWlncmF0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFByb2plY3RNaWdyYXRvckRhdGFNb2RlbE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJSVByb2plY3QgcHJvaiA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpKTsKLQkJCUlDb21wb25lbnRQcm9qZWN0TWlncmF0b3JbXSBtaWdyYXRvcnMgPSBQcm9qZWN0TWlncmF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RNaWdyYXRvcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlncmF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbXBvbmVudFByb2plY3RNaWdyYXRvciBtaWdyYXRvciA9IG1pZ3JhdG9yc1tpXTsKLQkJCQltaWdyYXRvci5taWdyYXRlUHJvamVjdChwcm9qKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1JlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjFmMmMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmVtb3ZlUmVmZXJlbmNlZENvbXBvbmVudHMobW9uaXRvcik7Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVmZXJlbmNlZENvbXBvbmVudHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7Ci0JCWlmIChzb3VyY2VDb21wID09IG51bGwgfHwgIXNvdXJjZUNvbXAuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpIHx8IHNvdXJjZUNvbXAuaXNCaW5hcnkoKSkgcmV0dXJuOwotCQkKLQkJSVZpcnR1YWxSZWZlcmVuY2UgW10gZXhpc3RpbmdSZWZlcmVuY2VzQXJyYXkgPSBzb3VyY2VDb21wLmdldFJlZmVyZW5jZXMoKTsKLQkJaWYoZXhpc3RpbmdSZWZlcmVuY2VzQXJyYXkgPT0gbnVsbCB8fCBleGlzdGluZ1JlZmVyZW5jZXNBcnJheS5sZW5ndGggPT0gMCl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgZXhpc3RpbmdSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGk9MDtpPGV4aXN0aW5nUmVmZXJlbmNlc0FycmF5Lmxlbmd0aDsgaSsrKXsKLQkJCWV4aXN0aW5nUmVmZXJlbmNlcy5hZGQoZXhpc3RpbmdSZWZlcmVuY2VzQXJyYXlbaV0pOwotCQl9Ci0JCQotCQlTdHJpbmcgZGVwbG95UGF0aCA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KCBJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEggKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKCBkZXBsb3lQYXRoICk7Ci0JCQotCQlMaXN0IG1vZExpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0gICAgCi0JCUxpc3QgdGFyZ2V0cHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RMaXN0LnNpemUoKSAmJiAhZXhpc3RpbmdSZWZlcmVuY2VzLmlzRW1wdHkoKTsgaSsrKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RMaXN0LmdldChpKTsKLQkJCWlmIChjb21wPT1udWxsICkKLQkJCQljb250aW51ZTsKLQotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gZmluZE1hdGNoaW5nUmVmZXJlbmNlKGV4aXN0aW5nUmVmZXJlbmNlcywgY29tcCwgcGF0aCk7Ci0JCQkvL2lmIGEgcmVmIHdhcyBmb3VuZCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIGRlcGxveVBhdGgsIHRoZW4gcmVtb3ZlIGl0Ci0JCQlpZihyZWYgIT0gbnVsbCl7Ci0JCQkJcmVtb3ZlUmVmZXJlbmVjZUluQ29tcG9uZW50KHNvdXJjZUNvbXAsIHJlZik7Ci0JCQkJZXhpc3RpbmdSZWZlcmVuY2VzLnJlbW92ZShyZWYpOwotCQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIHJlZiwgY2hlY2sgdG8gc2VlIGlmIGl0IHdhcyB0aGUgbGFzdCByZWYgcmVtb3ZlZCB0byB0aGF0IGNvbXBvbmVudAotCQkJCS8vYW5kIGlmIGl0IHdhcywgdGhlbiBhbHNvIHJlbW92ZSB0aGUgcHJvamVjdCByZWZlcmVuY2UKLQkJCQlyZWYgPSBmaW5kTWF0Y2hpbmdSZWZlcmVuY2UoZXhpc3RpbmdSZWZlcmVuY2VzLCBjb21wKTsKLQkJCQlpZihyZWYgPT0gbnVsbCl7Ci0JCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBjb21wLmdldFByb2plY3QoKTsKLQkJCQkJdGFyZ2V0cHJvamVjdExpc3QuYWRkKHRhcmdldFByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVByb2plY3RVdGlsaXRpZXMucmVtb3ZlUmVmZXJlbmNlUHJvamVjdHMoc291cmNlQ29tcC5nZXRQcm9qZWN0KCksdGFyZ2V0cHJvamVjdExpc3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQkJCi0JCQotCX0KLQotCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2UgZmluZE1hdGNoaW5nUmVmZXJlbmNlKExpc3QgZXhpc3RpbmdSZWZlcmVuY2VzLCBJVmlydHVhbENvbXBvbmVudCBjb21wLCBJUGF0aCBwYXRoKSB7Ci0JCWZvcihpbnQgaT0wO2k8ZXhpc3RpbmdSZWZlcmVuY2VzLnNpemUoKTsgaSsrKXsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IChJVmlydHVhbFJlZmVyZW5jZSlleGlzdGluZ1JlZmVyZW5jZXMuZ2V0KGkpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgYyA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZihjICE9IG51bGwgJiYgYy5nZXROYW1lKCkuZXF1YWxzKGNvbXAuZ2V0TmFtZSgpKSl7Ci0JCQkJaWYocGF0aCA9PSBudWxsKXsKLQkJCQkJcmV0dXJuIHJlZjsKLQkJCQl9IGVsc2UgaWYocGF0aC5lcXVhbHMocmVmLmdldFJ1bnRpbWVQYXRoKCkpKXsKLQkJCQkJcmV0dXJuIHJlZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZSBmaW5kTWF0Y2hpbmdSZWZlcmVuY2UoTGlzdCBleGlzdGluZ1JlZmVyZW5jZXMsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKLQkJcmV0dXJuIGZpbmRNYXRjaGluZ1JlZmVyZW5jZShleGlzdGluZ1JlZmVyZW5jZXMsIGNvbXAsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZmVyZW5lY2VJbkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQkoKFZpcnR1YWxDb21wb25lbnQpY29tcG9uZW50LmdldENvbXBvbmVudCgpKS5yZW1vdmVSZWZlcmVuY2UocmVmZXJlbmNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1JlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhkYmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24obW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9SZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1Jlc291cmNlVGltZXN0YW1wTWFwcGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3MTBhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1Jlc291cmNlVGltZXN0YW1wTWFwcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLS8qKgotICogTWFwcyByZXNvdXJjZXMgdG8gY2FjaGVkIGRhdGEgYW5kIHJlbWVtYmVycyB3aGVuIHRoZSBkYXRhIHdhcyBjYWNoZWQgYmFzZWQgb24gYSB0aW1lc3RhbXAKLSAqIHNpZ25hdHVyZSBvZiBhIGdpdmVuIHJlc291cmNlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIENPTVBPTkVOVF9NQU5JRkVTVF9QQVRIID0gbmV3IFBhdGgoIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIEZBQ0VUX0NPTkZJR19QQVRIID0gbmV3IFBhdGgoIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwiKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBOT19EQVRBID0gbmV3IE9iamVjdCgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFUlJPUiA9IG5ldyBPYmplY3QoKTsKLQotCXByaXZhdGUgZmluYWwgTWFwIHRpbWVzdGFtcHMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgZmluYWwgTWFwIGRhdGEgPSBuZXcgSGFzaE1hcCgpOwotCi0KLQkvKioKLQkgKiBSZWNvcmQgYSB0aW1lc3RhbXAgc2lnbmF0dXJlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogPHA+Ci0JICogQ2xpZW50cyBtYXkgdXNlIHtAbGluayAjaGFzQ2hhbmdlZChJUmVzb3VyY2UpfSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc291cmNlIGhhcyBjaGFuZ2VkIHNpbmNlCi0JICogaXQgd2FzIHJlY29yZGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0aGF0IHdhcyBwcm9jZXNzZWQuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSByZWNvcmRpbmcgd2FzIHN1Y2Nlc3NmdWxsLiBUaGUgcmVjb3JkaW5nIG1heSBmYWlsIGlmIHRoZSByZXNvdXJjZSBkb2VzCi0JICogICAgICAgICBub3QgZXhpc3QuCi0JICogCi0JICogQHNlZSAjaGFzQ2hhbmdlZChJUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIG1hcmsoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBtYXJrKHJlc291cmNlLCBOT19EQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgZGF0YSB0aGF0IHdhcyBkZXRlcm1pbmVkIHdoZW4gcHJvY2Vzc2luZyB0aGUgcmVzb3VyY2UuIFRoZSBhIHRpbWVzdGFtcCBzaWduYXR1cmUKLQkgKiB3aWxsIGJlIHJlY29yZGVkIGZvciB0aGUgcmVzb3VyY2UgYXMgd2VsbC4KLQkgKiAKLQkgKiA8cD4KLQkgKiBDbGllbnRzIG1heSB1c2Uge0BsaW5rICNoYXNDaGFuZ2VkKElSZXNvdXJjZSl9IHRvIGRldGVybWluZSBpZiB0aGUgY2FjaGVkIGRhdGEgc2hvdWxkIGJlCi0JICogcmVwbGFjZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIHRoYXQgd2FzIHByb2Nlc3NlZC4KLQkgKiBAcGFyYW0gY2FjaGVkRGF0YQotCSAqICAgICAgICAgICAgVGhlIGRhdGEgdGhhdCB3YXMgZGV0ZXJtaW5lZCB3aGVuIHRoZSBSZXNvdXJjZSB3YXMgcHJvY2Vzc2VkLgotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVjb3JkaW5nIHdhcyBzdWNjZXNzZnVsbC4gVGhlIHJlY29yZGluZyBtYXkgZmFpbCBpZiB0aGUgcmVzb3VyY2UgZG9lcwotCSAqICAgICAgICAgbm90IGV4aXN0LgotCSAqIAotCSAqIAotCSAqIEBzZWUgI2hhc0NoYW5nZWQoSVJlc291cmNlKQotCSAqIEBzZWUgI2hhc0NhY2hlRGF0YShJUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIG1hcmsoSVJlc291cmNlIHJlc291cmNlLCBPYmplY3QgY2FjaGVkRGF0YSkgewotCi0JCWlmIChyZXNvdXJjZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QKSB7Ci0JCQlpZiAodGltZXN0YW1wcy5jb250YWluc0tleShyZXNvdXJjZSkpIHsKLQkJCQlUaW1lc3RhbXBTaWduYXR1cmUgc2lnbmF0dXJlID0gKFRpbWVzdGFtcFNpZ25hdHVyZSkgdGltZXN0YW1wcy5nZXQocmVzb3VyY2UpOwotCQkJCXNpZ25hdHVyZS51cGRhdGUocmVzb3VyY2UpOwotCQkJfSBlbHNlIHsKLQkJCQl0aW1lc3RhbXBzLnB1dChyZXNvdXJjZSwgY3JlYXRlVGltZXN0YW1wU2lnbmF0dXJlKHJlc291cmNlKSk7Ci0JCQl9Ci0JCQlkYXRhLnB1dChyZXNvdXJjZSwgY2FjaGVkRGF0YSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTm90ZSB0aGF0IGFuIGVycm9yIG9jY3VycmVkIHdoZW4gcHJvY2Vzc2luZyB0aGlzIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIHRoYXQgaGFkIHNvbWUgc29ydCBvZiBlcnJvciB3aGlsZSBwcm9jZXNzaW5nLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIHJlY29yZGVkLiBUaGUgZXJyb3IgbWF5IG5vdCBiZSByZWNvcmRlZCBpZiB0aGUgcmVzb3VyY2UgZG9lcwotCSAqICAgICAgICAgbm90IGV4aXN0LgotCSAqIEBzZWUgI2hhc0NhY2hlRXJyb3IoSVJlc291cmNlKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBtYXJrRXJyb3IoSVJlc291cmNlIHJlc291cmNlKSB7Ci0KLQkJaWYgKHJlc291cmNlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgIT0gSVJlc291cmNlLk5VTExfU1RBTVApIHsKLQkJCWlmICh0aW1lc3RhbXBzLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgewotCQkJCVRpbWVzdGFtcFNpZ25hdHVyZSBzaWduYXR1cmUgPSAoVGltZXN0YW1wU2lnbmF0dXJlKSB0aW1lc3RhbXBzLmdldChyZXNvdXJjZSk7Ci0JCQkJc2lnbmF0dXJlLnVwZGF0ZShyZXNvdXJjZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRpbWVzdGFtcHMucHV0KHJlc291cmNlLCBjcmVhdGVUaW1lc3RhbXBTaWduYXR1cmUocmVzb3VyY2UpKTsKLQkJCX0KLQkJCWRhdGEucHV0KHJlc291cmNlLCBFUlJPUik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdGhhdCB3YXMgb3IgaXMgYWJvdXQgdG8gYmUgcHJvY2Vzc2VkLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaGFzIGNoYW5nZWQgaW4gYSBub3RpY2VhYmxlIHdheSBzaW5jZSBpdCB3YXMgbWFya2VkLgotCSAqIAotCSAqIEBzZWUgI21hcmsoSVJlc291cmNlKQotCSAqIEBzZWUgI21hcmsoSVJlc291cmNlLCBPYmplY3QpCi0JICogQHNlZSAjbWFya0Vycm9yKElSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlUaW1lc3RhbXBTaWduYXR1cmUgc2lnbmF0dXJlID0gKFRpbWVzdGFtcFNpZ25hdHVyZSkgdGltZXN0YW1wcy5nZXQocmVzb3VyY2UpOwotCQlyZXR1cm4gc2lnbmF0dXJlID09IG51bGwgfHwgc2lnbmF0dXJlLmhhc0NoYW5nZWQocmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIHRoYXQgd2FzIG9yIGlzIGFib3V0IHRvIGJlIHByb2Nlc3NlZC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYW55IGRhdGEgY2FjaGVkIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogCi0JICogQHNlZSAjbWFyayhJUmVzb3VyY2UpCi0JICogQHNlZSAjbWFyayhJUmVzb3VyY2UsIE9iamVjdCkKLQkgKiBAc2VlICNtYXJrRXJyb3IoSVJlc291cmNlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NhY2hlRGF0YShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJT2JqZWN0IGRhdHVtID0gZGF0YS5nZXQocmVzb3VyY2UpOwotCQlyZXR1cm4gZGF0dW0gIT0gbnVsbCAmJiBkYXR1bSAhPSBOT19EQVRBOwotCi0JfQotCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0aGF0IHdhcyBvciBpcyBhYm91dCB0byBiZSBwcm9jZXNzZWQuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGFueSBkYXRhIGNhY2hlZCBmb3IgdGhlIGdpdmVuIHJlc291cmNlLgotCSAqIAotCSAqIEBzZWUgI21hcmsoSVJlc291cmNlKQotCSAqIEBzZWUgI21hcmsoSVJlc291cmNlLCBPYmplY3QpCi0JICogQHNlZSAjbWFya0Vycm9yKElSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZUVycm9yKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gZGF0YS5nZXQocmVzb3VyY2UpID09IEVSUk9SOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJT2JqZWN0IGRhdHVtID0gZGF0YS5nZXQocmVzb3VyY2UpOwotCQlpZiAoZGF0dW0gIT0gTk9fREFUQSkKLQkJCXJldHVybiBkYXR1bTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIFRpbWVzdGFtcFNpZ25hdHVyZSBjcmVhdGVUaW1lc3RhbXBTaWduYXR1cmUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQlyZXR1cm4gbmV3IFByb2plY3RUaW1lc3RhbXAoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IFNpbXBsZVJlc291cmNlVGltZXN0YW1wKHJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgcG9pbnQgaW4gdGltZSBzaWduYXR1cmUgb2YgYSBSZXNvdXJjZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGF0IHJlc291cmNlIGhhcwotCSAqIGNoYW5nZWQgaW4gYSBtZWFuaW5nZnVsIHdheSBzaW5jZSB0aGUgdGltZSB0aGlzIHNpZ25hdHVyZSB3YXMgY3JlYXRlZCBvciBsYXN0IHVwZGF0ZWQuCi0JICogCi0JICovCi0JcHVibGljIGludGVyZmFjZSBUaW1lc3RhbXBTaWduYXR1cmUgewotCi0JCS8qKgotCQkgKiAKLQkJICogQHBhcmFtIHJlc291cmNlCi0JCSAqICAgICAgICAgICAgQSByZXNvdXJjZSByZWxhdGVkIHRvIHRoaXMgc2lnbmF0dXJlCi0JCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY3VycmVudCByZXNvdXJjZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGlzIHNpZ25hdHVyZSBpbiBhIG1lYW5pbmdmdWwgd2F5Ci0JCSAqLwotCQlib29sZWFuIGhhc0NoYW5nZWQoSVJlc291cmNlIHJlc291cmNlKTsKLQotCQkvKioKLQkJICogCi0JCSAqIEBwYXJhbSByZXNvdXJjZQotCQkgKiAgICAgICAgICAgIFVwZGF0ZSB0aGUgc2lnbmF0dXJlIGRldGFpbHMgdG8gdGhlIGdpdmVuIHJlc291cmNlJ3Mgc2lnbmF0dXJlLgotCQkgKi8KLQkJdm9pZCB1cGRhdGUoSVJlc291cmNlIHJlc291cmNlKTsKLQotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgc2lnbmF0dXJlIGJhc2VkIG9uIHRoZSBtb2RpZmljYXRpb25TdGFtcCBvZiBhIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBjbGFzcyBTaW1wbGVSZXNvdXJjZVRpbWVzdGFtcCBpbXBsZW1lbnRzIFRpbWVzdGFtcFNpZ25hdHVyZSB7Ci0JCXByaXZhdGUgbG9uZyB0aW1lc3RhbXAgPSAwOwotCi0JCXB1YmxpYyBTaW1wbGVSZXNvdXJjZVRpbWVzdGFtcChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCXVwZGF0ZShyZXNvdXJjZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJcmV0dXJuIHRpbWVzdGFtcCAhPSByZXNvdXJjZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJdGltZXN0YW1wID0gcmVzb3VyY2UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgc2lnbmF0dXJlIGZvciBhIHByb2plY3QgYmFzZWQgb24gdGhlIG1vZGlmaWNhdGlvblN0YW1wIG9mIHRoZSAoMSkgcHJvamVjdCwgKDIpIHRoZQotCSAqIGNvbXBvbmVudCBtYW5pZmVzdCwgYW5kICgzKSB0aGUgZmFjZXQgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBjbGFzcyBQcm9qZWN0VGltZXN0YW1wIGltcGxlbWVudHMgVGltZXN0YW1wU2lnbmF0dXJlIHsKLQotCQlwcml2YXRlIGxvbmcgcHJvamVjdFRpbWVzdGFtcCA9IDA7Ci0JCXByaXZhdGUgbG9uZyBjb21wb25lbnRNYW5pZmVzdFRpbWVzdGFtcCA9IDA7Ci0JCXByaXZhdGUgbG9uZyBmYWNldENvbmZpZ1RpbWVzdGFtcCA9IDA7Ci0KLQkJcHVibGljIFByb2plY3RUaW1lc3RhbXAoSVByb2plY3QgcHJvamVjdCkgewotCQkJdXBkYXRlKHByb2plY3QpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hhbmdlZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCQlpZiAocHJvamVjdFRpbWVzdGFtcCAhPSBwcm9qZWN0LmdldE1vZGlmaWNhdGlvblN0YW1wKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCi0JCQkJSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZShDT01QT05FTlRfTUFOSUZFU1RfUEFUSCk7Ci0JCQkJaWYgKCFmaWxlLmV4aXN0cygpIHx8IGNvbXBvbmVudE1hbmlmZXN0VGltZXN0YW1wICE9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQlmaWxlID0gcHJvamVjdC5nZXRGaWxlKEZBQ0VUX0NPTkZJR19QQVRIKTsKLQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkgfHwgZmFjZXRDb25maWdUaW1lc3RhbXAgIT0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0KLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0KLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQotCQkJCXByb2plY3RUaW1lc3RhbXAgPSBwcm9qZWN0LmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0KLQkJCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKENPTVBPTkVOVF9NQU5JRkVTVF9QQVRIKTsKLQkJCQljb21wb25lbnRNYW5pZmVzdFRpbWVzdGFtcCA9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQkJCWZpbGUgPSBwcm9qZWN0LmdldEZpbGUoRkFDRVRfQ09ORklHX1BBVEgpOwotCQkJCWZhY2V0Q29uZmlnVGltZXN0YW1wID0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCi0JCQl9IGVsc2UgewotCQkJCXByb2plY3RUaW1lc3RhbXAgPSBjb21wb25lbnRNYW5pZmVzdFRpbWVzdGFtcCA9IGZhY2V0Q29uZmlnVGltZXN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCQl9Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGI2ZDliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbEFyY2hpdmVDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkhhc2hVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBpbXBsZW1lbnRzIElWaXJ0dWFsQ29tcG9uZW50LCBJQWRhcHRhYmxlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuY2xhc3M7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCQVJDSElWRVRZUEUgPSAibGliIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJBUkNISVZFVFlQRSA9ICJ2YXIiOwotCS8qKgotCSAqIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IHR5cGUgZm9yIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50cyB0aGF0IHJlcHJlc2VudCBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhBUkNISVZFVFlQRSA9ICJjcGUiOyAvLyROT04tTkxTLTEKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIE5PX1JFRkVSRU5DRVMgPSBuZXcgVmlydHVhbFJlZmVyZW5jZVswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJVmlydHVhbENvbXBvbmVudFtdIE5PX0NPTVBPTkVOVFMgPSBuZXcgVmlydHVhbENvbXBvbmVudFswXTsKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIElSZXNvdXJjZVtdIE5PX1JFU09VUkNFUyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVZpcnR1YWxSZXNvdXJjZVtdIE5PX1ZJUlRVQUxfUkVTT1VSQ0VTID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0aWVzIE5PX1BST1BFUlRJRVMgPSBuZXcgUHJvcGVydGllcygpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoW10gTk9fUEFUSFMgPSBuZXcgUGF0aFswXTsKLQotLy8JcHJpdmF0ZSBJUGF0aCBydW50aW1lUGF0aDsKLQlwcml2YXRlIElQcm9qZWN0IGNvbXBvbmVudFByb2plY3Q7Ci0vLwlwcml2YXRlIElWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXI7Ci0JcHJpdmF0ZSBpbnQgZmxhZyA9IDE7Ci0vLwlwcml2YXRlIFN0cmluZyBhcmNoaXZlTG9jYXRpb247Ci0KLQotCXByaXZhdGUgSVBhdGggYXJjaGl2ZVBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgYXJjaGl2ZVR5cGU7Ci0KLQotCi0JcHVibGljIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KElQcm9qZWN0IGFDb21wb25lbnRQcm9qZWN0LFN0cmluZyBhcmNoaXZlTG9jYXRpb24sIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlpZihhQ29tcG9uZW50UHJvamVjdCA9PSBudWxsKXsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWNvbXBvbmVudFByb2plY3QgPSBhQ29tcG9uZW50UHJvamVjdDsKLS8vCQlydW50aW1lUGF0aCA9IGFSdW50aW1lUGF0aDsKLQotCQlTdHJpbmcgYXJjaGl2ZVBhdGhTdHJpbmcgPSBhcmNoaXZlTG9jYXRpb24uc3Vic3RyaW5nKDQsIGFyY2hpdmVMb2NhdGlvbi5sZW5ndGgoKSk7Ci0JCWFyY2hpdmVUeXBlCT0gYXJjaGl2ZUxvY2F0aW9uLnN1YnN0cmluZygwLCBhcmNoaXZlTG9jYXRpb24ubGVuZ3RoKCkgLSBhcmNoaXZlUGF0aFN0cmluZy5sZW5ndGgoKSAtMSk7Ci0JCWFyY2hpdmVQYXRoID0gbmV3ICBQYXRoKGFyY2hpdmVQYXRoU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmFyY2hpdmVUeXBlICsgSVBhdGguU0VQQVJBVE9SICsgdGhpcy5hcmNoaXZlUGF0aC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlcGxveWVkTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlSWQoU3RyaW5nIGFDb21wb25lbnRUeXBlSWQpIHsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIElWaXJ0dWFsUmVzb3VyY2UuQ09NUE9ORU5UOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQmluYXJ5KCkgewotCQlib29sZWFuIHJldCA9IChmbGFnICYgQklOQVJZKSA9PSAxID8gdHJ1ZSA6IGZhbHNlOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBJUGF0aFtdIGdldE1ldGFSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBOT19QQVRIUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhUmVzb3VyY2VzKElQYXRoW10gdGhlTWV0YVJlc291cmNlUGF0aHMpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZShpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gYXJjaGl2ZVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSB7Ci0JCWlmKCBhcmNoaXZlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEgKXsKLQkJCUlGaWxlIGFGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGFyY2hpdmVQYXRoKTsKLQkJCWlmIChhRmlsZS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gYUZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpIHsKLQkJSUZpbGUgYUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkpOwotCQlpZiAoYUZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gYUZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFByb2plY3Q7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKCkgewotCQlyZXR1cm4gUk9PVDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE1ldGFQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gTk9fUFJPUEVSVElFUzsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIGdldFJlc291cmNlcyhTdHJpbmcgYVJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gTk9fVklSVFVBTF9SRVNPVVJDRVM7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIE5PX1JFRkVSRU5DRVM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlcyhJVmlydHVhbFJlZmVyZW5jZVtdIHRoZVJlZmVyZW5jZXMpIHsKLQkJLy8gbm8gb3AKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlcyhJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMpIHsKLQkJLy8gbm8gb3AKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKFN0cmluZyBhQ29tcG9uZW50TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IGdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQlpZiggZGlza0ZpbGUgIT0gbnVsbCApCi0JCQlleGlzdHMgPSBkaXNrRmlsZS5leGlzdHMoKTsKLQkJCi0JCWlmKCAhZXhpc3RzICl7Ci0JCQlJRmlsZSB1dGlsaXR5SmFyID0gZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCWlmKCB1dGlsaXR5SmFyICE9IG51bGwgKQotCQkJCWV4aXN0cyA9ICB1dGlsaXR5SmFyLmV4aXN0cygpOwotCQl9Ci0JCXJldHVybiBleGlzdHM7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGdldFJvb3RGb2xkZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpIHsKLQkJcmV0dXJuIE5PX0NPTVBPTkVOVFM7Ci0JfQotCi0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyVHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBcmNoaXZlVHlwZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmVUeXBlOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCBoYXNoID0gSGFzaFV0aWwuU0VFRDsKLQkJaGFzaCA9IEhhc2hVdGlsLmhhc2goaGFzaCwgZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWhhc2ggPSBIYXNoVXRpbC5oYXNoKGhhc2gsIGdldE5hbWUoKSk7Ci0JCWhhc2ggPSBIYXNoVXRpbC5oYXNoKGhhc2gsIGlzQmluYXJ5KCkpOwotCQlyZXR1cm4gaGFzaDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk90aGVyKSB7Ci0JCWlmIChhbk90aGVyIGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IG90aGVyQ29tcG9uZW50ID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBhbk90aGVyOwotCQkJcmV0dXJuIGdldFByb2plY3QoKS5lcXVhbHMob3RoZXJDb21wb25lbnQuZ2V0UHJvamVjdCgpKSAmJiAKLQkJCQkJZ2V0TmFtZSgpLmVxdWFscyhvdGhlckNvbXBvbmVudC5nZXROYW1lKCkpICYmIAotCQkJCQlpc0JpbmFyeSgpID09IG90aGVyQ29tcG9uZW50LmlzQmluYXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGFQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQotCX0KLQlwdWJsaWMgSUZpbGUgZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKSB7Ci0JCWlmIChnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKT09bnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRVbmRlcmx5aW5nRGlza0ZpbGUoKSB7Ci0JCVN0cmluZyBvc1BhdGggPSBudWxsOwotCQlJUGF0aCBsb2MgPSBudWxsOwotCQlpZiAoZ2V0QXJjaGl2ZVR5cGUoKS5lcXVhbHMoVmlydHVhbEFyY2hpdmVDb21wb25lbnQuVkFSQVJDSElWRVRZUEUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlZCA9IGdldEFkYXB0ZXIoVmlydHVhbEFyY2hpdmVDb21wb25lbnQuQURBUFRFUl9UWVBFKTsKLQkJCWlmIChhZGFwdGVkIGluc3RhbmNlb2YgSVBhdGgpIHsKLQkJCQlJUGF0aCByZXNvbHZlZHBhdGggPSAoSVBhdGgpIGFkYXB0ZWQ7Ci0JCQkJb3NQYXRoID0gcmVzb2x2ZWRwYXRoLnRvT1NTdHJpbmcoKTsKLQkJCX0gCi0JCX0gZWxzZSBpZighYXJjaGl2ZVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlJRmlsZSBmaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoYXJjaGl2ZVBhdGgpOwotCQkJaWYoZmlsZS5leGlzdHMoKSkKLQkJCQlsb2MgID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCQkJZWxzZSB7Ci0JCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShhcmNoaXZlUGF0aCk7Ci0JCQkJaWYoZmlsZS5leGlzdHMoKSkKLQkJCQkJbG9jID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCQkJfQotCQkJLy8gdGhpcyBpcyBhIGZpbGUgb24gdGhlIGxvY2FsIGZpbGVzeXN0ZW0KLQkJCWlmKGxvYyAhPSBudWxsKSAgCi0JCQkJb3NQYXRoID0gbG9jLnRvT1NTdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCW9zUGF0aCA9IGFyY2hpdmVQYXRoLnRvT1NTdHJpbmcoKTsKLQkJfQotCQlpZiAob3NQYXRoPT1udWxsIHx8IG9zUGF0aC5sZW5ndGgoKT09MCkKLQkJCXJldHVybiBudWxsOwotCQlGaWxlIGRpc2tGaWxlID0gbmV3IEZpbGUob3NQYXRoKTsKLQkJcmV0dXJuIGRpc2tGaWxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZihhcmNoaXZlUGF0aCAhPSBudWxsKXsKLQkJCXJldHVybiBjb21wb25lbnRQcm9qZWN0ICsgIiAiICthcmNoaXZlUGF0aDsKLQkJfQotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTI0ZDY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbENvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLkRlcGVuZGVuY3lHcmFwaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkhhc2hVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsQ29tcG9uZW50IGltcGxlbWVudHMgSVZpcnR1YWxDb21wb25lbnQgewotCUlQYXRoCQkJcnVudGltZVBhdGg7Ci0JSVByb2plY3QJY29tcG9uZW50UHJvamVjdDsKLQlJVmlydHVhbEZvbGRlcglyb290Rm9sZGVyOwotCVN0cmluZyBjb21wb25lbnRUeXBlSWQ7Ci0JcHJpdmF0ZSBpbnQgZmxhZyA9IDA7Ci0JCi0KLQlwcm90ZWN0ZWQgVmlydHVhbENvbXBvbmVudCgpewotCX0KLQkKLQlwdWJsaWMgVmlydHVhbENvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCWlmKGFQcm9qZWN0ID09IG51bGwpewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJY29tcG9uZW50UHJvamVjdCA9IGFQcm9qZWN0OwotCQlydW50aW1lUGF0aCA9IGFSdW50aW1lUGF0aDsKLQkJcm9vdEZvbGRlciA9IENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGNvbXBvbmVudFByb2plY3QsIG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlcGxveWVkTmFtZSgpIHsKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQljb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCQlpZihjb3JlICE9IG51bGwgJiYgY29yZS5nZXRDb21wb25lbnQoKSAhPSBudWxsKXsKLQkJCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJCWlmIChjb21wb25lbnQuZ2V0TmFtZSgpIT1udWxsICYmIGNvbXBvbmVudC5nZXROYW1lKCkubGVuZ3RoKCk+MCkKLQkJCQkJCXJldHVybiBjb21wb25lbnQuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmKGNvcmUgIT0gbnVsbCkKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgeyAKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJcmV0dXJuIE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCk7Ci0JfQotCQotCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0TWV0YVByb3BlcnRpZXMoKSB7Ci0gICAgICAgIFN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIGlmIChjb3JlID09IG51bGwpCi0gICAgICAgICAgICAJcmV0dXJuIHByb3BzOwotICAgICAgICAgICAgV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7IAotICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBudWxsKSByZXR1cm4gcHJvcHM7Ci0gICAgICAgICAgICBMaXN0IHByb3BMaXN0ID0gY29tcG9uZW50LmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGlmKHByb3BMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KXByb3BMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICAJU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgCVN0cmluZyB2YWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgCWlmKHZhbHVlID09IG51bGwpewotICAgICAgICAgICAgICAgIAkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIAkJU3RyaW5nIG1lc3NhZ2UgPSAiV0FSTklORzogIFRoZSBjb21wb25lbnQgZmlsZSBpbiAiK2dldFByb2plY3QoKS5nZXROYW1lKCkrIiBoYXMgbm8gdmFsdWUgZGVmaW5lZCBmb3IgdGhlIHByb3BlcnR5OiAiK25hbWU7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIAkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBudWxsKTsKLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHByb3BzOyAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmKGNvcmUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb3JlLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGFQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgcHJvcExpc3QgPSBjb21wb25lbnQuZ2V0UHJvcGVydGllcygpOwotCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKLQkJICAgICAgICBmb3IoRW51bWVyYXRpb24gaXRyID0gcHJvcGVydGllcy5rZXlzKCk7IGl0ci5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ci5uZXh0RWxlbWVudCgpOwotCQkgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eSBwcm9wID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCSAgICAgICAgICAgIHByb3Auc2V0TmFtZShrZXkpOwotCQkgICAgICAgICAgICBwcm9wLnNldFZhbHVlKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KSk7Ci0JCSAgICAgICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBwcm9wZXJ0eSBmaXJzdAotCQkgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cHJvcExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJICAgICAgICAgICAgCVByb3BlcnR5IGV4aXN0aW5nID0gKFByb3BlcnR5KSBwcm9wTGlzdC5nZXQoaSk7Ci0JCSAgICAgICAgICAgIAlpZiAoZXhpc3RpbmcuZ2V0TmFtZSgpLmVxdWFscyhrZXkpKSB7Ci0JCSAgICAgICAgICAgIAkJcHJvcExpc3QucmVtb3ZlKGV4aXN0aW5nKTsKLQkJICAgICAgICAgICAgCQlicmVhazsKLQkJICAgICAgICAgICAgCX0KLQkJICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAvLyBBZGQgbmV3IHByb3BlcnR5Ci0JCSAgICAgICAgICAgIHByb3BMaXN0LmFkZChwcm9wKTsKLQkJICAgICAgICAgfQotCQkJfSAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmKGNvcmUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAJY29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0gICAgICAgICAgICAgICAgY29yZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXJNZXRhUHJvcGVydGllcygpIHsKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7IAotICAgICAgICAgICAgY29tcG9uZW50LmdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYoY29yZSAhPSBudWxsKXsKLSAgICAgICAgICAgIAljb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLSAgICAgICAgICAgICAgICBjb3JlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRhUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIFN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotICAgICAgICAgICAgLy9SZW1vdmUgZXhpc3RpbmcgcHJvcGVydHkgZmlyc3QKLSAgICAgICAgICAgIExpc3QgcHJvcGVydGllcyA9IGNvbXBvbmVudC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cHJvcGVydGllcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgCVByb3BlcnR5IGV4aXN0aW5nID0gKFByb3BlcnR5KSBwcm9wZXJ0aWVzLmdldChpKTsKLSAgICAgICAgICAgIAlpZiAoZXhpc3RpbmcuZ2V0TmFtZSgpLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAJCXByb3BlcnRpZXMucmVtb3ZlKGV4aXN0aW5nKTsKLSAgICAgICAgICAgIAkJYnJlYWs7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICAJLy9TZXQgbmV3IHByb3BlcnR5Ci0gICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eSBwcm9wID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCQlwcm9wLnNldE5hbWUoa2V5KTsKLQkJCXByb3Auc2V0VmFsdWUodmFsdWUpOwotCQkJY29tcG9uZW50LmdldFByb3BlcnRpZXMoKS5hZGQocHJvcCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmKGNvcmUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAJY29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0gICAgICAgICAgICAgICAgY29yZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQl9Ci0JCi0JcHVibGljIElQYXRoW10gZ2V0TWV0YVJlc291cmNlcygpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJTGlzdCBtZXRhUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCi0JCQkJCW1ldGFSZXNvdXJjZXMuYWRkQWxsKGNvbXBvbmVudC5nZXRNZXRhZGF0YVJlc291cmNlcygpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElQYXRoW10pIG1ldGFSZXNvdXJjZXMudG9BcnJheShuZXcgSVBhdGhbbWV0YVJlc291cmNlcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhUmVzb3VyY2VzKElQYXRoW10gdGhlTWV0YVJlc291cmNlUGF0aHMpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpPTA7IGk8dGhlTWV0YVJlc291cmNlUGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFjb21wb25lbnQuZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKS5jb250YWlucyh0aGVNZXRhUmVzb3VyY2VQYXRoc1tpXSkpCi0JCQkJCQljb21wb25lbnQuZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKS5hZGQodGhlTWV0YVJlc291cmNlUGF0aHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBJVmlydHVhbFJlc291cmNlLkNPTVBPTkVOVDsKLQl9Ci0JCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpewotCQlib29sZWFuIHJldCA9ICAoZmxhZyAmIEJJTkFSWSkgPT0gMSAgPyB0cnVlIDpmYWxzZTsKLQkJcmV0dXJuIHJldDsJCQotCX0JCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbW9kdWxlQ29yZQotCQkJCQkuZ2V0Q29tcG9uZW50KCk7Ci0JCQlpZiAoY29tcG9uZW50ID09IG51bGwpCi0JCQkJY29tcG9uZW50ID0gbW9kdWxlQ29yZQotCQkJCQkJLmNyZWF0ZVdvcmtiZW5jaE1vZHVsZShnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0JCi0KLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRSZWZlcmVuY2VzKCkgeyAKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChjb3JlIT1udWxsICYmIGNvcmUuZ2V0Q29tcG9uZW50KCkhPW51bGwpIHsKLQkJCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKLQkJCQlpZiAoY29tcG9uZW50IT1udWxsKSB7Ci0JCQkJCUxpc3QgcmVmZXJlbmNlZENvbXBvbmVudHMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZENvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSAoUmVmZXJlbmNlZENvbXBvbmVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocmVmZXJlbmNlZENvbXBvbmVudD09bnVsbCkgCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlJVmlydHVhbFJlZmVyZW5jZSB2UmVmZXJlbmNlID0gU3RydWN0dXJlRWRpdC5jcmVhdGVWaXJ0dWFsUmVmZXJlbmNlKHRoaXMsIHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJCQkJaWYoIHZSZWZlcmVuY2UgIT0gbnVsbCApewotCQkJCQkJCXZSZWZlcmVuY2Uuc2V0QXJjaGl2ZU5hbWUoIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0QXJjaGl2ZU5hbWUoKSApOwotCQkJCQkJfQotCQkJCQkJaWYgKHZSZWZlcmVuY2UgIT0gbnVsbCAmJiB2UmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSAhPSBudWxsICYmIHZSZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmV4aXN0cygpKQotCQkJCQkJCXJlZmVyZW5jZXMuYWRkKHZSZWZlcmVuY2UpOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAoSVZpcnR1YWxSZWZlcmVuY2VbXSkgcmVmZXJlbmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtyZWZlcmVuY2VzLnNpemUoKV0pOwotCQl9IGZpbmFsbHkgewotCQkJaWYoY29yZSAhPSBudWxsKQotCQkJCWNvcmUuZGlzcG9zZSgpOwotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VzKElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcykgewotCQlpZiAocmVmZXJlbmNlcz09bnVsbCB8fCByZWZlcmVuY2VzLmxlbmd0aD09MCkKLQkJCXJldHVybjsKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJaWYgKGNvcmUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKLQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IG51bGw7Ci0JCQlDb21wb25lbnRjb3JlRmFjdG9yeSBmYWN0b3J5ID0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudGNvcmVGYWN0b3J5KCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8cmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChyZWZlcmVuY2VzW2ldID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXJlZmVyZW5jZWRDb21wb25lbnQgPSBmYWN0b3J5LmNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnQoKTsJCQkJCi0JCQkJcmVmZXJlbmNlZENvbXBvbmVudC5zZXREZXBlbmRlbmN5VHlwZShEZXBlbmRlbmN5VHlwZS5nZXQocmVmZXJlbmNlc1tpXS5nZXREZXBlbmRlbmN5VHlwZSgpKSk7Ci0JCQkJcmVmZXJlbmNlZENvbXBvbmVudC5zZXRSdW50aW1lUGF0aChyZWZlcmVuY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCkpOwotCi0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IHJlZmVyZW5jZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmKGNvbXAhPW51bGwgJiYgIWNvbXAuaXNCaW5hcnkoKSkKLQkJCQkJcmVmZXJlbmNlZENvbXBvbmVudC5zZXRIYW5kbGUoTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkoY29tcC5nZXRQcm9qZWN0KCkpKTsKLQkJCQllbHNlIGlmIChjb21wIT1udWxsKQotCQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50LnNldEhhbmRsZShNb2R1bGVVUklVdGlsLmFyY2hpdmVDb21wb25lbnRmdWxseVF1YWxpZnlVUkkoY29tcC5nZXROYW1lKCkpKTsKLQkJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCi0JCQkJCWNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpLmFkZChyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50LnNldEFyY2hpdmVOYW1lKHJlZmVyZW5jZXNbaV0uZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0JCQl9Ci0JCQkvL2NsZWFuIHVwIGFueSBvbGQgb2Jzb2xldGUgcmVmZXJlbmNlcwotCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKXsKLQkJCQljbGVhblVwUmVmZXJlbmNlcyhjb21wb25lbnQpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYoY29yZSAhPSBudWxsKSB7Ci0JCQkJY29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCQkJY29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCXByaXZhdGUgdm9pZCBjbGVhblVwUmVmZXJlbmNlcyhXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUxpc3QgcmVmZXJlbmNlZENvbXBvbmVudHMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZENvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSAoUmVmZXJlbmNlZENvbXBvbmVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVmZXJlbmNlZENvbXBvbmVudD09bnVsbCkgCi0JCQkJY29udGludWU7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSB2UmVmZXJlbmNlID0gU3RydWN0dXJlRWRpdC5jcmVhdGVWaXJ0dWFsUmVmZXJlbmNlKHRoaXMsIHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJaWYgKHZSZWZlcmVuY2UgPT0gbnVsbCB8fCB2UmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSA9PSBudWxsIHx8ICF2UmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5leGlzdHMoKSl7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VzKElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcykgeyAKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSBudWxsOwotCQkJICAKLQkJCWNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpLmNsZWFyKCk7Ci0JCQlDb21wb25lbnRjb3JlRmFjdG9yeSBmYWN0b3J5ID0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudGNvcmVGYWN0b3J5KCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8cmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCXJlZmVyZW5jZWRDb21wb25lbnQgPSBmYWN0b3J5LmNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnQoKTsJCQkJCi0JCQkJcmVmZXJlbmNlZENvbXBvbmVudC5zZXREZXBlbmRlbmN5VHlwZShEZXBlbmRlbmN5VHlwZS5nZXQocmVmZXJlbmNlc1tpXS5nZXREZXBlbmRlbmN5VHlwZSgpKSk7Ci0JCQkJcmVmZXJlbmNlZENvbXBvbmVudC5zZXRSdW50aW1lUGF0aChyZWZlcmVuY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCkpOwotCi0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IHJlZmVyZW5jZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmKCAhY29tcC5pc0JpbmFyeSgpKQotCQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50LnNldEhhbmRsZShNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShyZWZlcmVuY2VzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpKTsKLQkJCQllbHNlCi0JCQkJCXJlZmVyZW5jZWRDb21wb25lbnQuc2V0SGFuZGxlKE1vZHVsZVVSSVV0aWwuYXJjaGl2ZUNvbXBvbmVudGZ1bGx5UXVhbGlmeVVSSShyZWZlcmVuY2VzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXROYW1lKCkpKTsKLQkJCQkKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50LnNldEFyY2hpdmVOYW1lKHJlZmVyZW5jZXNbaV0uZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0JCQkJY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkuYWRkKHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJfQotCQkJIAotCQl9IGZpbmFsbHkgewotCQkJaWYoY29yZSAhPSBudWxsKSB7Ci0JCQkJY29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCQkJY29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGhhc2ggPSBIYXNoVXRpbC5TRUVEOwotCQloYXNoID0gSGFzaFV0aWwuaGFzaChoYXNoLCBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJaGFzaCA9IEhhc2hVdGlsLmhhc2goaGFzaCwgZ2V0TmFtZSgpKTsKLQkJaGFzaCA9IEhhc2hVdGlsLmhhc2goaGFzaCwgaXNCaW5hcnkoKSk7Ci0JCXJldHVybiBoYXNoOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT3RoZXIpIHsgCi0JCWlmKGFuT3RoZXIgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgb3RoZXJDb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIGFuT3RoZXI7Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmVxdWFscyhvdGhlckNvbXBvbmVudC5nZXRQcm9qZWN0KCkpICYmIAotCQkJCSAgIGdldE5hbWUoKS5lcXVhbHMob3RoZXJDb21wb25lbnQuZ2V0TmFtZSgpKSAmJiAKLQkJCQkgICBpc0JpbmFyeSgpID09IG90aGVyQ29tcG9uZW50LmlzQmluYXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoU3RyaW5nIGFDb21wb25lbnROYW1lKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGdldFJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSByZWZzW2ldOwotCQkJaWYoIHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgIT0gbnVsbCApewotCQkJCWlmIChyZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldE5hbWUoKS5lcXVhbHMoYUNvbXBvbmVudE5hbWUpKQotCQkJCQlyZXR1cm4gcmVmZXJlbmNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyVHlwZSk7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGdldFJvb3RGb2xkZXIoKSB7Ci0JCXJldHVybiByb290Rm9sZGVyOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gY29tcG9uZW50UHJvamVjdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBjb21wb25lbnRzIHdoaWNoIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIHBhc3NlZCBpbiB0YXJnZXQgY29tcG9uZW50LgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuIGFycmF5IG9mIGNvbXBvbmVudHMKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoKSB7Ci0JCUlQcm9qZWN0W10gaGFuZGxlcyA9ICBEZXBlbmRlbmN5R3JhcGhNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0RGVwZW5kZW5jeUdyYXBoKCkuZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKGdldFByb2plY3QoKSk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50W10gcmVzdWx0ID0gbmV3IElWaXJ0dWFsQ29tcG9uZW50W2hhbmRsZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaT0wOyBpPGhhbmRsZXMubGVuZ3RoOyBpKyspCi0JCQlyZXN1bHRbaV0gPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChoYW5kbGVzW2ldKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBhc3NvY2lhdGVkIFJlZmVyZW5jZWRDb21wb25lbnQgZm9yIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSBmcm9tIHRoZSB3b3JrYmVuY2ggY29tcG9uZW50IAotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpcnR1YWwgY29tcG9uZW50Ci0JICogCi0JICogQHBhcmFtIGFSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZlcmVuY2UoSVZpcnR1YWxSZWZlcmVuY2UgYVJlZmVyZW5jZSkgewotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlpZiAoY29yZSA9PSBudWxsIHx8IGFSZWZlcmVuY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKLQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmQ29tcG9uZW50ID0gZ2V0V29ya2JlbmNoUmVmZXJlbmNlZENvbXBvbmVudChhUmVmZXJlbmNlLCBjb21wb25lbnQpOwotCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIHJlZkNvbXBvbmVudCAhPSBudWxsKQotCQkJCWNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpLnJlbW92ZShyZWZDb21wb25lbnQpOwotCQl9IGZpbmFsbHkgewotCQkJaWYoY29yZSAhPSBudWxsKSB7Ci0JCQkJY29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCQkJY29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNzb2NpYXRlZCBzdHJ1Y3R1cmUgZWRpdCBSZWZlcmVuY2VkQ29tcG9uZW50IG9iamVjdCBmb3IgdGhlIGdpdmVuIElWaXJ0dWFsUmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBoYW5kbGUKLQkgKiBhbmQgbW9kdWxlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlZmVyZW5jZQotCSAqIEBwYXJhbSBjb3JlCi0JICogQHJldHVybiBSZWZlcmVuY2VkQ29tcG9uZW50Ci0JICovCi0JcHJvdGVjdGVkIFJlZmVyZW5jZWRDb21wb25lbnQgZ2V0V29ya2JlbmNoUmVmZXJlbmNlZENvbXBvbmVudChJVmlydHVhbFJlZmVyZW5jZSBhUmVmZXJlbmNlLCBXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmIChhUmVmZXJlbmNlID09IG51bGwgfHwgYVJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgPT0gbnVsbCB8fCBjb21wb25lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IHJlZmVyZW5jZWRDb21wb25lbnRzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxyZWZlcmVuY2VkQ29tcG9uZW50cy5zaXplKCk7IGkrKykgewotCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWYgPSAoUmVmZXJlbmNlZENvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudHMuZ2V0KGkpOwotCQkJaWYgKCFhUmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5pc0JpbmFyeSgpKSB7Ci0JCQkJaWYgKHJlZi5nZXRIYW5kbGUoKS5lcXVhbHMoTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkoYVJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKSkpCi0JCQkJCXJldHVybiByZWY7CQotCQkJfSAKLQkJCWVsc2UgewotCQkJCWlmIChyZWYuZ2V0SGFuZGxlKCkuZXF1YWxzKE1vZHVsZVVSSVV0aWwuYXJjaGl2ZUNvbXBvbmVudGZ1bGx5UXVhbGlmeVVSSShhUmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXROYW1lKCkpKSkKLQkJCQkJcmV0dXJuIHJlZjsKLQkJCX0JCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIEByZXR1cm4gSVZpcnR1YWxSZWZlcmVuY2VbXSAtIEFsbCB0aGUgcmVmZXJlbmNlcyBvZiB0aGlzIGNvbXBvbmVudCwgaW5jbHVkaW5nIHBvdGVudGlhbGx5IGRlbGV0ZWQgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldEFsbFJlZmVyZW5jZXMoKSB7IAotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQlMaXN0IHJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQljb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChnZXRQcm9qZWN0KCkpOwotCQkJaWYgKGNvcmUhPW51bGwgJiYgY29yZS5nZXRDb21wb25lbnQoKSE9bnVsbCkgewotCQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJCWlmIChjb21wb25lbnQhPW51bGwpIHsKLQkJCQkJTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkQ29tcG9uZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50PT1udWxsKSAKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHZSZWZlcmVuY2UgPSBTdHJ1Y3R1cmVFZGl0LmNyZWF0ZVZpcnR1YWxSZWZlcmVuY2UodGhpcywgcmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJCQlpZiggdlJlZmVyZW5jZSAhPSBudWxsICl7Ci0JCQkJCQkJdlJlZmVyZW5jZS5zZXRBcmNoaXZlTmFtZSggcmVmZXJlbmNlZENvbXBvbmVudC5nZXRBcmNoaXZlTmFtZSgpICk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodlJlZmVyZW5jZSAhPSBudWxsICYmIHZSZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpICE9IG51bGwpCi0JCQkJCQkJcmVmZXJlbmNlcy5hZGQodlJlZmVyZW5jZSk7IAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChJVmlydHVhbFJlZmVyZW5jZVtdKSByZWZlcmVuY2VzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW3JlZmVyZW5jZXMuc2l6ZSgpXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihjb3JlICE9IG51bGwpCi0JCQkJY29yZS5kaXNwb3NlKCk7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gY29tcG9uZW50UHJvamVjdC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbENvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjRmMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlydHVhbENvbnRhaW5lciBleHRlbmRzIFZpcnR1YWxSZXNvdXJjZSBpbXBsZW1lbnRzIElWaXJ0dWFsQ29udGFpbmVyIHsKLQotCi0JcHVibGljIFZpcnR1YWxDb250YWluZXIoSVByb2plY3QgYUNvbXBvbmVudFByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlzdXBlcihhQ29tcG9uZW50UHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0KLQkvLyBUT0RPIFdUUDpJbXBsZW1lbnQgdGhpcyBtZXRob2QKLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoSVBhdGggcGF0aCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRhaW5lciNmaW5kTWVtYmVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihTdHJpbmcgYUNoaWxkTmFtZSkgewotCQlyZXR1cm4gZmluZE1lbWJlcihuZXcgUGF0aChhQ2hpbGROYW1lKSwgMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29udGFpbmVyI2ZpbmRNZW1iZXIoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKFN0cmluZyBhQ2hpbGROYW1lLCBpbnQgc2VhcmNoRmxhZ3MpIHsKLQkJcmV0dXJuIGZpbmRNZW1iZXIobmV3IFBhdGgoYUNoaWxkTmFtZSksIHNlYXJjaEZsYWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250YWluZXIjZmluZE1lbWJlcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihJUGF0aCBhQ2hpbGRQYXRoKSB7Ci0JCXJldHVybiBmaW5kTWVtYmVyKGFDaGlsZFBhdGgsIDApOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlIGZpbmRNZW1iZXIoSVBhdGggYVBhdGgsIGludCB0aGVTZWFyY2hGbGFncykgewotCi0JCVN0cnVjdHVyZUVkaXQgc3RydWN0dXJlRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCXN0cnVjdHVyZUVkaXQgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gc3RydWN0dXJlRWRpdC5nZXRDb21wb25lbnQoKTsKLQkJCWlmIChudWxsICE9IGNvbXBvbmVudCkgewotCQkJCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdChjb21wb25lbnQpOwotCQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gcm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGFQYXRoKSwgUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIHJldHVybiB0aGUgcmVzb3VyY2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJvb3QsIG5vdCBhbnkgb2YgdGhlIGNoaWxkcmVuIGlmIGl0cyBhIGZvbGRlcgotCQkJCQlpZiAocmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGFQYXRoKSkpIHsKLQkJCQkJCUlSZXNvdXJjZSBwbGF0Zm9ybVJlc291cmNlID0gZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIocmVzb3VyY2VzW2ldLmdldFNvdXJjZVBhdGgoKSk7Ci0JCQkJCQlpZiAocGxhdGZvcm1SZXNvdXJjZSA9PSBudWxsKQotCQkJCQkJCXBsYXRmb3JtUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocmVzb3VyY2VzW2ldLmdldFNvdXJjZVBhdGgoKSk7Ci0JCQkJCQlpZiAocGxhdGZvcm1SZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJc3dpdGNoIChwbGF0Zm9ybVJlc291cmNlLmdldFR5cGUoKSkgewotCQkJCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJCQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUZvbGRlcihnZXRQcm9qZWN0KCksIGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGFQYXRoKSk7Ci0JCQkJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQkJCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRmlsZShnZXRQcm9qZWN0KCksIGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGFQYXRoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHN0cnVjdHVyZUVkaXQgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250YWluZXIjZ2V0RmlsZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsRmlsZSBnZXRGaWxlKElQYXRoIGFQYXRoKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEZpbGUoZ2V0UHJvamVjdCgpLCBnZXRSdW50aW1lUGF0aCgpLmFwcGVuZChhUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRhaW5lciNnZXRGb2xkZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRGb2xkZXIoSVBhdGggYVBhdGgpIHsKLQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGdldFByb2plY3QoKSwgZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQoYVBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIjZ2V0RmlsZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxGaWxlKGdldFByb2plY3QoKSwgZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQobmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciNnZXRGb2xkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxGb2xkZXIgZ2V0Rm9sZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUZvbGRlcihnZXRQcm9qZWN0KCksIGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250YWluZXIjbWVtYmVycygpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbWVtYmVycyhJUmVzb3VyY2UuTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29udGFpbmVyI21lbWJlcnMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoYm9vbGVhbiBpbmNsdWRlUGhhbnRvbXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1lbWJlcnMoaW5jbHVkZVBoYW50b21zID8gSUdOT1JFX0VYQ0xVU0lPTlMgOiBJUmVzb3VyY2UuTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29udGFpbmVyI21lbWJlcnMoaW50KQotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyhpbnQgbWVtYmVyRmxhZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdCB2aXJ0dWFsUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOyAvLyByZXN1bHQKLQkJU2V0IGFsbE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJLy8gSWdub3JlIGFsbCBtZXRhIGRhdGEgcGF0aHMgaW4gdGhlIHZpcnR1YWwgY29udGFpbmVyIHJlc291cmNlIHNldAotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBnZXRDb21wb25lbnQoKTsKLQkJaWYgKGNvbXBvbmVudCA9PSBudWxsKQotCQkgICAgcmV0dXJuIG5ldyBJVmlydHVhbFJlc291cmNlWzBdOwotCQlJUGF0aFtdIG1ldGFQYXRocyA9IGNvbXBvbmVudC5nZXRNZXRhUmVzb3VyY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0YVBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbG9jYWxOYW1lID0gZ2V0TG9jYWxOYW1lKG1ldGFQYXRoc1tpXSk7Ci0JCQlpZiAobG9jYWxOYW1lICE9IG51bGwpCi0JCQkJYWxsTmFtZXMuYWRkKGxvY2FsTmFtZSk7Ci0JCX0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJaWYgKHdiQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZVRyZWVSb290IHJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldERlcGxveVJlc291cmNlVHJlZVJvb3Qod2JDb21wb25lbnQpOwotCQkJCUNvbXBvbmVudFJlc291cmNlW10gY29tcG9uZW50UmVzb3VyY2VzID0gcm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKGdldFJ1bnRpbWVQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCQkJCS8vIGNvbXBvbmVudFJlc291cmNlcyA9IG9yZGVyUmVzb3VyY2VzQnlGb2xkZXIoY29tcG9uZW50UmVzb3VyY2VzKTsKLQotCQkJCWZvciAoaW50IGNvbXBvbmVudFJlc291cmNlSW5kZXggPSAwOyBjb21wb25lbnRSZXNvdXJjZUluZGV4IDwgY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aDsgY29tcG9uZW50UmVzb3VyY2VJbmRleCsrKSB7Ci0JCQkJCUlQYXRoIGZ1bGxSdW50aW1lUGF0aCA9IGNvbXBvbmVudFJlc291cmNlc1tjb21wb25lbnRSZXNvdXJjZUluZGV4XS5nZXRSdW50aW1lUGF0aCgpOwotCQkJCQkvLyBleGFjdCBtYXRjaAotCQkJCQlpZiAoZnVsbFJ1bnRpbWVQYXRoLmVxdWFscyhnZXRSdW50aW1lUGF0aCgpKSkgewotCi0JCQkJCQlJUmVzb3VyY2UgcmVhbFJlc291cmNlID0gZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIoY29tcG9uZW50UmVzb3VyY2VzW2NvbXBvbmVudFJlc291cmNlSW5kZXhdLmdldFNvdXJjZVBhdGgoKSk7Ci0JCQkJCQlpZiAoKHJlYWxSZXNvdXJjZSAhPSBudWxsKSAmJiAocmVhbFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSIHx8IHJlYWxSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpKSB7Ci0JCQkJCQkJSUNvbnRhaW5lciByZWFsQ29udGFpbmVyID0gKElDb250YWluZXIpIHJlYWxSZXNvdXJjZTsKLQkJCQkJCQlJUmVzb3VyY2VbXSByZWFsQ2hpbGRSZXNvdXJjZXMgPSByZWFsQ29udGFpbmVyLm1lbWJlcnMobWVtYmVyRmxhZ3MpOwotCQkJCQkJCWZvciAoaW50IHJlYWxSZXNvdXJjZUluZGV4ID0gMDsgcmVhbFJlc291cmNlSW5kZXggPCByZWFsQ2hpbGRSZXNvdXJjZXMubGVuZ3RoOyByZWFsUmVzb3VyY2VJbmRleCsrKSB7Ci0JCQkJCQkJCUlSZXNvdXJjZSBjaGlsZCA9IHJlYWxDaGlsZFJlc291cmNlc1tyZWFsUmVzb3VyY2VJbmRleF07Ci0JCQkJCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0JCQkJCQkJCWlmIChhbGxOYW1lcy5hZGQobG9jYWxOYW1lKSkgewotCQkJCQkJCQkJSVBhdGggbmV3UnVudGltZVBhdGggPSBnZXRSdW50aW1lUGF0aCgpLmFwcGVuZChsb2NhbE5hbWUpOwotCQkJCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCQkJCQl2aXJ0dWFsUmVzb3VyY2VzLmFkZChuZXcgVmlydHVhbEZpbGUoZ2V0UHJvamVjdCgpLCBuZXdSdW50aW1lUGF0aCwgKElGaWxlKSBjaGlsZCkpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQl2aXJ0dWFsUmVzb3VyY2VzLmFkZChDb21wb25lbnRDb3JlLmNyZWF0ZUZvbGRlcihnZXRQcm9qZWN0KCksIG5ld1J1bnRpbWVQYXRoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBBbiBJUmVzb3VyY2UuRklMRSB3b3VsZCBiZSBhbiBlcnJvciBjb25kaXRpb24gKGFzIHRoaXMgaXMgYSBjb250YWluZXIpCi0KLQkJCQkJfSBlbHNlIHsgLy8gZnV6enkgbWF0Y2gKLQkJCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBnZXRMb2NhbE5hbWUoZnVsbFJ1bnRpbWVQYXRoKTsKLQkJCQkJCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBhbGxOYW1lcy5hZGQobG9jYWxOYW1lKSkgewotCQkJCQkJCUlSZXNvdXJjZSByZWFsUmVzb3VyY2UgPSBTdHJ1Y3R1cmVFZGl0LmdldEVjbGlwc2VSZXNvdXJjZShjb21wb25lbnRSZXNvdXJjZXNbY29tcG9uZW50UmVzb3VyY2VJbmRleF0pOwotCQkJCQkJCWlmIChyZWFsUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQlJUGF0aCBuZXdSdW50aW1lUGF0aCA9IGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGxvY2FsTmFtZSk7Ci0JCQkJCQkJCWlmIChmdWxsUnVudGltZVBhdGguc2VnbWVudENvdW50KCkgPiBnZXRSdW50aW1lUGF0aCgpLnNlZ21lbnRDb3VudCgpICsgMSkgewkvLyBub3QgYSBkaXJlY3QgY2hpbGQKLQkJCQkJCQkJCXZpcnR1YWxSZXNvdXJjZXMuYWRkKENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGdldFByb2plY3QoKSwgbmV3UnVudGltZVBhdGgpKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChyZWFsUmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJCQkJCXZpcnR1YWxSZXNvdXJjZXMuYWRkKG5ldyBWaXJ0dWFsRmlsZShnZXRQcm9qZWN0KCksIG5ld1J1bnRpbWVQYXRoLCAoSUZpbGUpIHJlYWxSZXNvdXJjZSkpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQl2aXJ0dWFsUmVzb3VyY2VzLmFkZChDb21wb25lbnRDb3JlLmNyZWF0ZUZvbGRlcihnZXRQcm9qZWN0KCksIG5ld1J1bnRpbWVQYXRoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAodmlydHVhbFJlc291cmNlcyA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgSVZpcnR1YWxSZXNvdXJjZVswXTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpCi0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIChJVmlydHVhbFJlc291cmNlW10pIHZpcnR1YWxSZXNvdXJjZXMudG9BcnJheShuZXcgSVZpcnR1YWxSZXNvdXJjZVt2aXJ0dWFsUmVzb3VyY2VzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIExvY2FsIG5hbWUgd2l0aGluIGNvbnRleHQgb2YgdGhpcyB2aXJ0dWFsIGNvbnRhaW5lci4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMb2NhbE5hbWUoSVBhdGggcGF0aCkgewotCQlpZiAoIWdldFJ1bnRpbWVQYXRoKCkuaXNQcmVmaXhPZihwYXRoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcGF0aC5zZWdtZW50KGdldFJ1bnRpbWVQYXRoKCkuc2VnbWVudENvdW50KCkpOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbEZpbGVbXSBmaW5kRGVsZXRlZE1lbWJlcnNXaXRoSGlzdG9yeShpbnQgZGVwdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyI2NyZWF0ZUxpbmsob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVMaW5rKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJSUNvbnRhaW5lciByZXNvdXJjZSA9IG51bGw7Ci0JCQlpZiAoYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLmlzUm9vdCgpIHx8IGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlyZXNvdXJjZSA9IGdldFByb2plY3QoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzb3VyY2UgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbik7Ci0JCQl9Ci0KLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlpZiAobnVsbCAhPSBjb21wb25lbnQpIHsKLQkJCQlSZXNvdXJjZVRyZWVSb290IHJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldERlcGxveVJlc291cmNlVHJlZVJvb3QoY29tcG9uZW50KTsKLQkJCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IHJvb3QuZmluZE1vZHVsZVJlc291cmNlcyhnZXRSdW50aW1lUGF0aCgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQotCQkJCWlmIChyZXNvdXJjZXMubGVuZ3RoID09IDApIHsKLQkJCQkJQ29tcG9uZW50UmVzb3VyY2UgY29tcG9uZW50UmVzb3VyY2UgPSBtb2R1bGVDb3JlLmNyZWF0ZVdvcmtiZW5jaE1vZHVsZVJlc291cmNlKHJlc291cmNlKTsKLQkJCQkJY29tcG9uZW50UmVzb3VyY2Uuc2V0UnVudGltZVBhdGgoZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQkJCWNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKS5hZGQoY29tcG9uZW50UmVzb3VyY2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJvb2xlYW4gZm91bmRNYXBwaW5nID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IHJlc291cmNlSW5keCA9IDA7IHJlc291cmNlSW5keCA8IHJlc291cmNlcy5sZW5ndGggJiYgIWZvdW5kTWFwcGluZzsgcmVzb3VyY2VJbmR4KyspIHsKLQkJCQkJCWlmIChhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24ubWFrZUFic29sdXRlKCkuZXF1YWxzKHJlc291cmNlc1tyZXNvdXJjZUluZHhdLmdldFNvdXJjZVBhdGgoKSkpCi0JCQkJCQkJZm91bmRNYXBwaW5nID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoIWZvdW5kTWFwcGluZykgewotCQkJCQkJQ29tcG9uZW50UmVzb3VyY2UgY29tcG9uZW50UmVzb3VyY2UgPSBtb2R1bGVDb3JlLmNyZWF0ZVdvcmtiZW5jaE1vZHVsZVJlc291cmNlKHJlc291cmNlKTsKLQkJCQkJCWNvbXBvbmVudFJlc291cmNlLnNldFJ1bnRpbWVQYXRoKGdldFJ1bnRpbWVQYXRoKCkpOwotCQkJCQkJY29tcG9uZW50LmdldFJlc291cmNlcygpLmFkZChjb21wb25lbnRSZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY3JlYXRlUmVzb3VyY2UocmVzb3VyY2UsIHVwZGF0ZUZsYWdzLCBtb25pdG9yKTsKLQkJCX0KLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG1vbml0b3IpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gSVZpcnR1YWxSZXNvdXJjZS5DT01QT05FTlQ7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2VbXSBnZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gTk9fUkVTT1VSQ0VTOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvRGVsZXRlTWV0YU1vZGVsKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJaWYgKG51bGwgIT0gY29tcG9uZW50KSB7Ci0JCQkJbW9kdWxlQ29yZS5nZXRDb21wb25lbnRNb2RlbFJvb3QoKS5nZXRDb21wb25lbnRzKCkucmVtb3ZlKGNvbXBvbmVudCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobW9uaXRvcik7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZVJlYWxSZXNvdXJjZXMoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoU3RyaW5nIGFSZXNvdXJjZVR5cGUpIHsKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWlmIChudWxsICE9IGNvbXBvbmVudCkgewotCQkJCUxpc3QgY3VycmVudFJlc291cmNlcyA9IGNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKTsKLQkJCQlMaXN0IGZvdW5kUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJaWYgKGFSZXNvdXJjZVR5cGUgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXJyZW50UmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGFSZXNvdXJjZVR5cGUuZXF1YWxzKHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKSkgewotCQkJCQkJCUlWaXJ0dWFsUmVzb3VyY2UgdnJlcyA9IGNyZWF0ZVZpcnR1YWxSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQkJCQkJaWYgKHZyZXMgIT0gbnVsbCkKLQkJCQkJCQkJZm91bmRSZXNvdXJjZXMuYWRkKHZyZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAoSVZpcnR1YWxSZXNvdXJjZVtdKSBmb3VuZFJlc291cmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlc291cmNlW2ZvdW5kUmVzb3VyY2VzLnNpemUoKV0pOwotCQkJfQotCQkJcmV0dXJuIG5ldyBJVmlydHVhbFJlc291cmNlWzBdOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNvcmUgIT0gbnVsbCkKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVZpcnR1YWxSZXNvdXJjZSBjcmVhdGVWaXJ0dWFsUmVzb3VyY2UoQ29tcG9uZW50UmVzb3VyY2UgYUNvbXBvbmVudFJlc291cmNlKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IFN0cnVjdHVyZUVkaXQuZ2V0RWNsaXBzZVJlc291cmNlKGFDb21wb25lbnRSZXNvdXJjZSk7Ci0JCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVGaWxlKGdldFByb2plY3QoKSwgYUNvbXBvbmVudFJlc291cmNlLmdldFJ1bnRpbWVQYXRoKCkpOwotCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVGb2xkZXIoZ2V0UHJvamVjdCgpLCBhQ29tcG9uZW50UmVzb3VyY2UuZ2V0UnVudGltZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTllYzA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbEZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsRmlsZSBleHRlbmRzIFZpcnR1YWxSZXNvdXJjZSBpbXBsZW1lbnRzIElWaXJ0dWFsRmlsZSB7Ci0KLQlwcml2YXRlIElGaWxlIHVuZGVybHlpbmdGaWxlOwotCi0JcHVibGljIFZpcnR1YWxGaWxlKElQcm9qZWN0IGFDb21wb25lbnRQcm9qZWN0LCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJc3VwZXIoYUNvbXBvbmVudFByb2plY3QsIGFSdW50aW1lUGF0aCk7IAotCX0KLQotCXB1YmxpYyBWaXJ0dWFsRmlsZShJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoLCBJRmlsZSB1bmRlcmx5aW5nRmlsZSkgewotCQlzdXBlcihhQ29tcG9uZW50UHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQkJdGhpcy51bmRlcmx5aW5nRmlsZSA9IHVuZGVybHlpbmdGaWxlOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIjY3JlYXRlTGluayhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUxpbmsoSVBhdGggYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJRmlsZSByZXNvdXJjZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbik7Ci0KLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQkKLQkJCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdChjb21wb25lbnQpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSByb290LmZpbmRNb2R1bGVSZXNvdXJjZXMoZ2V0UnVudGltZVBhdGgoKSwgUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7Ci0KLQkJCWlmKHJlc291cmNlcy5sZW5ndGggPT0gMCkgewotCQkJCUNvbXBvbmVudFJlc291cmNlIGNvbXBvbmVudFJlc291cmNlID0gbW9kdWxlQ29yZS5jcmVhdGVXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQkJY29tcG9uZW50UmVzb3VyY2Uuc2V0UnVudGltZVBhdGgoZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQkJY29tcG9uZW50LmdldFJlc291cmNlcygpLmFkZChjb21wb25lbnRSZXNvdXJjZSk7Ci0JCQl9IGVsc2UgeyAKLQkJCQlib29sZWFuIGZvdW5kTWFwcGluZyA9IGZhbHNlOwotCQkJCWZvciAoaW50IHJlc291cmNlSW5keCA9IDA7IHJlc291cmNlSW5keCA8IHJlc291cmNlcy5sZW5ndGggJiYgIWZvdW5kTWFwcGluZzsgcmVzb3VyY2VJbmR4KyspIHsKLQkJCQkJaWYoYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLmVxdWFscyhyZXNvdXJjZXNbcmVzb3VyY2VJbmR4XS5nZXRTb3VyY2VQYXRoKCkpKQotCQkJCQkJZm91bmRNYXBwaW5nID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYoIWZvdW5kTWFwcGluZykgewotCQkJCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IG1vZHVsZUNvcmUuY3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJCQljb21wb25lbnRSZXNvdXJjZS5zZXRSdW50aW1lUGF0aChnZXRSdW50aW1lUGF0aCgpKTsKLQkJCQkJY29tcG9uZW50LmdldFJlc291cmNlcygpLmFkZChjb21wb25lbnRSZXNvdXJjZSk7CQkJCQkKLQkJCQl9Ci0JCQl9IAotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobW9uaXRvcik7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9IAotIAotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIElWaXJ0dWFsUmVzb3VyY2UuRklMRTsKLQl9Ci0JCi0JcHVibGljIElSZXNvdXJjZSBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRVbmRlcmx5aW5nRmlsZSgpOwotCX0KLQkKLQlwdWJsaWMgSVJlc291cmNlW10gZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpIHsKLQkJcmV0dXJuIGdldFVuZGVybHlpbmdGaWxlcygpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0VW5kZXJseWluZ0ZpbGUoKSB7Ci0JCWlmICh1bmRlcmx5aW5nRmlsZSA9PSBudWxsKSB7Ci0JCQl1bmRlcmx5aW5nRmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHVuZGVybHlpbmdGaWxlOwotCX0KLQotCXB1YmxpYyBJRmlsZVtdIGdldFVuZGVybHlpbmdGaWxlcygpIHsKLQkJSVBhdGhbXSBwYXRocyA9IGdldFByb2plY3RSZWxhdGl2ZVBhdGhzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8cGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCUlGaWxlIGZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZShwYXRoc1tpXSk7Ci0JCQlpZiAoZmlsZSE9bnVsbCAmJiBmaWxlLmV4aXN0cygpICYmICFyZXN1bHQuY29udGFpbnMoZmlsZSkpCi0JCQkJcmVzdWx0LmFkZChmaWxlKTsKLQkJfQotCQlyZXR1cm4gKElGaWxlW10pIHJlc3VsdC50b0FycmF5KG5ldyBJRmlsZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9EZWxldGVNZXRhTW9kZWwoaW50IHVwZGF0ZUZsYWdzLElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvL0RlZmF1bHQKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIGRvRGVsZXRlUmVhbFJlc291cmNlcyhpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvL0RlZmF1bHQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbEZvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmE5MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIFZpcnR1YWxGb2xkZXIgZXh0ZW5kcyBWaXJ0dWFsQ29udGFpbmVyIGltcGxlbWVudHMgSVZpcnR1YWxGb2xkZXIgeyAKLQotCi0JLyoqCi0JICogcD4gQ3JlYXRlcyBhbiB1bmFzc2lnbmVkIG1hcHBpbmcgY29udGFpbmVkIGJ5IHRoZSBjb21wb25lbnQgaWRlbnRpZmllZCBieSBhQ29tcG9uZW50SGFuZGxlCi0JICogd2l0aCBhIHJ1bnRpbWUgcGF0aCBvZiBhUnVudGltZVBhdGguCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhQ29tcG9uZW50SGFuZGxlCi0JICogQHBhcmFtIGFSdW50aW1lUGF0aAotCSAqLwotCXB1YmxpYyBWaXJ0dWFsRm9sZGVyKElQcm9qZWN0IGFDb21wb25lbnRQcm9qZWN0LCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJc3VwZXIoYUNvbXBvbmVudFByb2plY3QsIGFSdW50aW1lUGF0aCk7Ci0JfQotIAotCS8vIFRPRE8gV1RQOkltcGxlbWVudCB0aGlzIG1ldGhvZAotCXB1YmxpYyB2b2lkIGNyZWF0ZShpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbnRhaW5lciA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFByb2plY3QoKSk7IAotCQlpZiggIWNvbnRhaW5lci5nZXRSb290Rm9sZGVyKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmlzUm9vdCgpKXsKLQkJCUlGb2xkZXIgcmVhbEZvbGRlciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoY29udGFpbmVyLmdldFJvb3RGb2xkZXIoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOyAKLQkJCUlGb2xkZXIgbmV3Rm9sZGVyID0gcmVhbEZvbGRlci5nZXRGb2xkZXIoZ2V0UnVudGltZVBhdGgoKSk7IAotCQkJY3JlYXRlUmVzb3VyY2UobmV3Rm9sZGVyLCB1cGRhdGVGbGFncywgbW9uaXRvcik7ICAKLQkJfQotCQllbHNlIHsKLQkJCUlGb2xkZXIgbmV3Rm9sZGVyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihnZXRSdW50aW1lUGF0aCgpKTsgCi0JCQljcmVhdGVSZXNvdXJjZShuZXdGb2xkZXIsIHVwZGF0ZUZsYWdzLCBtb25pdG9yKTsgCi0JCX0KLQl9IAotCi0JLy8gVE9ETyBXVFA6SW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKElQYXRoIHBhdGgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAKLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBJVmlydHVhbFJlc291cmNlLkZPTERFUjsKLQl9IAotCQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCX0KLQkKLQlwdWJsaWMgSVJlc291cmNlW10gZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpIHsKLQkJcmV0dXJuIGdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JfQotCi0JcHVibGljIElDb250YWluZXIgZ2V0VW5kZXJseWluZ0ZvbGRlcigpIHsgCi0JCUlQYXRoIHBhdGggPSBnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCWlmKCAhcGF0aC5pc1Jvb3QoKSApCi0JCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCX0KLQkKLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldFVuZGVybHlpbmdGb2xkZXJzKCkgewotCQlJUGF0aFtdIHBhdGhzID0gZ2V0UHJvamVjdFJlbGF0aXZlUGF0aHMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxwYXRocy5sZW5ndGg7IGkrKykgewotCQkJaWYoICFwYXRoc1tpXS5pc1Jvb3QoKSApewotCQkJCUlDb250YWluZXIgZm9sZGVyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihwYXRoc1tpXSk7Ci0JCQkJaWYgKGZvbGRlciE9bnVsbCAmJiBmb2xkZXIuZXhpc3RzKCkgJiYgIXJlc3VsdC5jb250YWlucyhmb2xkZXIpKQotCQkJCQlyZXN1bHQuYWRkKGZvbGRlcik7Ci0JCQl9IGVsc2UgCi0JCQkJcmVzdWx0LmFkZChnZXRQcm9qZWN0KCkpOwotCQl9Ci0JCXJldHVybiAoSUNvbnRhaW5lcltdKSByZXN1bHQudG9BcnJheShuZXcgSUNvbnRhaW5lcltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9EZWxldGVNZXRhTW9kZWwoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQkvLyBvbmx5IGhhbmRsZXMgZXhwbGljaXQgbWFwcGluZ3MKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsgCi0JCQlJUGF0aCBydW50aW1lUGF0aCA9IGdldFJ1bnRpbWVQYXRoKCk7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBjb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgocnVudGltZVBhdGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihydW50aW1lUGF0aC5lcXVhbHMocmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCkpKSAKLQkJCQkJY29tcG9uZW50LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZXNbaV0pOwkJCQkJCQkJCi0JCQl9Ci0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgZG9EZWxldGVSZWFsUmVzb3VyY2VzKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gb25seSBoYW5kbGVzIGV4cGxpY2l0IG1hcHBpbmdzCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBydW50aW1lUGF0aCA9IGdldFJ1bnRpbWVQYXRoKCk7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBjb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgocnVudGltZVBhdGgpOwotCQkJSVJlc291cmNlIHJlYWxSZXNvdXJjZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYocnVudGltZVBhdGguZXF1YWxzKHJlc291cmNlc1tpXS5nZXRSdW50aW1lUGF0aCgpKSkgewotCQkJCQlyZWFsUmVzb3VyY2UgPSBTdHJ1Y3R1cmVFZGl0LmdldEVjbGlwc2VSZXNvdXJjZShyZXNvdXJjZXNbaV0pOwotCQkJCQlpZihyZWFsUmVzb3VyY2UgIT0gbnVsbCAmJiByZWFsUmVzb3VyY2UuZ2V0VHlwZSgpID09IGdldFR5cGUoKSkKLQkJCQkJCXJlYWxSZXNvdXJjZS5kZWxldGUodXBkYXRlRmxhZ3MsIG1vbml0b3IpOwotCQkJCX0KLQkJCQkJCi0JCQl9Ci0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsUmVmZXJlbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3YjFjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgVmlydHVhbFJlZmVyZW5jZSBpbXBsZW1lbnRzIElWaXJ0dWFsUmVmZXJlbmNlIHsKLQkKLQlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQ7Ci0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBlbmNsb3NpbmdDb21wb25lbnQ7Ci0JcHJpdmF0ZSBJUGF0aCBydW50aW1lUGF0aDsKLQlwcml2YXRlIGludCBkZXBlbmRlbmN5VHlwZTsKLQlwcml2YXRlIFN0cmluZyBhcmNoaXZlTmFtZTsKLQotCXB1YmxpYyBWaXJ0dWFsUmVmZXJlbmNlKCkgewotCQkKLQl9IAotCQotCXB1YmxpYyBWaXJ0dWFsUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGFuRW5jbG9zaW5nQ29tcG9uZW50LCBJVmlydHVhbENvbXBvbmVudCBhUmVmZXJlbmNlZENvbXBvbmVudCkgewotCQl0aGlzKGFuRW5jbG9zaW5nQ29tcG9uZW50LCBhUmVmZXJlbmNlZENvbXBvbmVudCwgbmV3IFBhdGgoU3RyaW5nLnZhbHVlT2YoSVBhdGguU0VQQVJBVE9SKSksIERFUEVOREVOQ1lfVFlQRV9VU0VTKTsgCi0JfQotCQotCXB1YmxpYyBWaXJ0dWFsUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGFuRW5jbG9zaW5nQ29tcG9uZW50LCBJVmlydHVhbENvbXBvbmVudCBhUmVmZXJlbmNlZENvbXBvbmVudCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXRoaXMoYW5FbmNsb3NpbmdDb21wb25lbnQsIGFSZWZlcmVuY2VkQ29tcG9uZW50LCBhUnVudGltZVBhdGgsIERFUEVOREVOQ1lfVFlQRV9VU0VTKTsKLQl9Ci0KLQlwdWJsaWMgVmlydHVhbFJlZmVyZW5jZShJVmlydHVhbENvbXBvbmVudCBhbkVuY2xvc2luZ0NvbXBvbmVudCwgSVZpcnR1YWxDb21wb25lbnQgYVJlZmVyZW5jZWRDb21wb25lbnQsIElQYXRoIGFSdW50aW1lUGF0aCwgaW50IGFEZXBlbmRlbmN5VHlwZSkgewotCQllbmNsb3NpbmdDb21wb25lbnQgPSBhbkVuY2xvc2luZ0NvbXBvbmVudDsKLQkJcmVmZXJlbmNlZENvbXBvbmVudCA9IGFSZWZlcmVuY2VkQ29tcG9uZW50OwotCQlydW50aW1lUGF0aCA9IGFSdW50aW1lUGF0aDsKLQkJZGVwZW5kZW5jeVR5cGUgPSBhRGVwZW5kZW5jeVR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgeyAKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShlbmNsb3NpbmdDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZDb21wID0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudGNvcmVGYWN0b3J5KCkuY3JlYXRlUmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJaWYoICFyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkpCi0JCQkJcmVmQ29tcC5zZXRIYW5kbGUoTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkocmVmZXJlbmNlZENvbXBvbmVudC5nZXRQcm9qZWN0KCkpKTsKLQkJCWVsc2UKLQkJCQlyZWZDb21wLnNldEhhbmRsZShNb2R1bGVVUklVdGlsLmFyY2hpdmVDb21wb25lbnRmdWxseVF1YWxpZnlVUkkocmVmZXJlbmNlZENvbXBvbmVudC5nZXROYW1lKCkpKTsgCi0JCQlyZWZDb21wLnNldFJ1bnRpbWVQYXRoKHJ1bnRpbWVQYXRoKTsKLQkJCXJlZkNvbXAuc2V0RGVwZW5kZW5jeVR5cGUoRGVwZW5kZW5jeVR5cGUuZ2V0KGRlcGVuZGVuY3lUeXBlKSk7Ci0JCQlyZWZDb21wLnNldEFyY2hpdmVOYW1lKGFyY2hpdmVOYW1lKTsKLQkJCWlmKCFyZWZlcmVuY2VkQ29tcG9uZW50cy5jb250YWlucyhyZWZDb21wKSl7Ci0JCQkJcmVmZXJlbmNlZENvbXBvbmVudHMuYWRkKHJlZkNvbXApOwotCQkJfQotCQl9Ci0JCWZpbmFsbHl7Ci0JCQlpZihudWxsICE9IGNvcmUpewotCQkJCWNvcmUuc2F2ZUlmTmVjZXNzYXJ5KGFNb25pdG9yKTsKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVQYXRoKElQYXRoIGFSdW50aW1lUGF0aCkgeyAKLQkJcnVudGltZVBhdGggPSBhUnVudGltZVBhdGg7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKCkgeyAKLQkJcmV0dXJuIHJ1bnRpbWVQYXRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlcGVuZGVuY3lUeXBlKGludCBhRGVwZW5kZW5jeVR5cGUpIHsKLQkJZGVwZW5kZW5jeVR5cGUgPSBhRGVwZW5kZW5jeVR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXREZXBlbmRlbmN5VHlwZSgpIHsgCi0JCXJldHVybiBkZXBlbmRlbmN5VHlwZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldEVuY2xvc2luZ0NvbXBvbmVudCgpIHsgCi0JCXJldHVybiBlbmNsb3NpbmdDb21wb25lbnQ7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldFJlZmVyZW5jZWRDb21wb25lbnQoKSB7IAotCQlyZXR1cm4gcmVmZXJlbmNlZENvbXBvbmVudDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdG8gdXBkYXRlIHRoZSBhY3R1YWwgcmVmZXJlbmNlQ29tcG9uZW50IG9uIHRoZSAuY29tcG9uZW50IGZpbGUgZm9yIHRoaXMgdmlydHVhbCByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBhUmVmZXJlbmNlZENvbXBvbmVudCwgRU9iamVjdCBkZXBlbmRlbnRPYmplY3QpIHsKLQkJaWYgKGFSZWZlcmVuY2VkQ29tcG9uZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cnVjdHVyZUVkaXQgZW5jbG9zaW5nQ29yZSA9IG51bGw7Ci0JCVN0cnVjdHVyZUVkaXQgcmVmQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbmNsb3NpbmdDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZW5jbG9zaW5nQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQlyZWZDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocmVmZXJlbmNlZENvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGVuY2xvc2luZ0NvbXAgPSBlbmNsb3NpbmdDb3JlLmdldENvbXBvbmVudCgpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHJlZkNvbXAgPSByZWZDb3JlLmdldENvbXBvbmVudCgpOwotCQkJUmVmZXJlbmNlZENvbXBvbmVudCBhY3R1YWxSZWZlcmVuY2VkQ29tcG9uZW50ID0gZW5jbG9zaW5nQ29yZS5maW5kUmVmZXJlbmNlZENvbXBvbmVudChlbmNsb3NpbmdDb21wLCByZWZDb21wKTsKLQkJCWlmIChhY3R1YWxSZWZlcmVuY2VkQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50ID0gYVJlZmVyZW5jZWRDb21wb25lbnQ7Ci0JCQkJaWYoIXJlZmVyZW5jZWRDb21wb25lbnQuaXNCaW5hcnkoKSkKLQkJCQkJYWN0dWFsUmVmZXJlbmNlZENvbXBvbmVudC5zZXRIYW5kbGUoTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkocmVmZXJlbmNlZENvbXBvbmVudC5nZXRQcm9qZWN0KCkpKTsKLQkJCQllbHNlCi0JCQkJCWFjdHVhbFJlZmVyZW5jZWRDb21wb25lbnQuc2V0SGFuZGxlKE1vZHVsZVVSSVV0aWwuYXJjaGl2ZUNvbXBvbmVudGZ1bGx5UXVhbGlmeVVSSShyZWZlcmVuY2VkQ29tcG9uZW50LmdldE5hbWUoKSkpOwotCQkJCWFjdHVhbFJlZmVyZW5jZWRDb21wb25lbnQuc2V0RGVwZW5kZW50T2JqZWN0KGRlcGVuZGVudE9iamVjdCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZW5jbG9zaW5nQ29yZSAhPSBudWxsKSB7Ci0JCQkJZW5jbG9zaW5nQ29yZS5zYXZlSWZOZWNlc3NhcnkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJZW5jbG9zaW5nQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpZiAocmVmQ29yZSAhPSBudWxsKSB7Ci0JCQkJcmVmQ29yZS5zYXZlSWZOZWNlc3NhcnkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJcmVmQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFyY2hpdmVOYW1lKCkgewotCQlyZXR1cm4gYXJjaGl2ZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZU5hbWUoU3RyaW5nIGFyY2hpdmVOYW1lKSB7Ci0JCXRoaXMuYXJjaGl2ZU5hbWUgPSBhcmNoaXZlTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxYTYwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV29ya2JlbmNoQ29tcG9uZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlydHVhbFJlc291cmNlIGltcGxlbWVudHMgSVZpcnR1YWxSZXNvdXJjZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElSZXNvdXJjZVtdIE5PX1JFU09VUkNFUyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBjb21wb25lbnRQcm9qZWN0OwotCXByaXZhdGUgZmluYWwgSVBhdGggcnVudGltZVBhdGg7Ci0JcHJpdmF0ZSBpbnQgaGFzaENvZGU7Ci0JcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VUeXBlOwotCi0JcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzIG1hcHBpbmcgPSBuZXcgUmVzb3VyY2VUaW1lc3RhbXBNYXBwaW5ncygpOwotCi0KLQlwcm90ZWN0ZWQgVmlydHVhbFJlc291cmNlKElQcm9qZWN0IGFDb21wb25lbnRQcm9qZWN0LCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJY29tcG9uZW50UHJvamVjdCA9IGFDb21wb25lbnRQcm9qZWN0OwotCQlydW50aW1lUGF0aCA9IGFSdW50aW1lUGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoKHVwZGF0ZUZsYWdzICYgSVZpcnR1YWxSZXNvdXJjZS5JR05PUkVfVU5ERVJMWUlOR19SRVNPVVJDRSkgPT0gMCkgewotCQkJZG9EZWxldGVSZWFsUmVzb3VyY2VzKHVwZGF0ZUZsYWdzLCBtb25pdG9yKTsKLQkJfQotCi0JCWRvRGVsZXRlTWV0YU1vZGVsKHVwZGF0ZUZsYWdzLCBtb25pdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZU1ldGFNb2RlbChpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IGFDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQlhQ29tcG9uZW50LmdldFJlc291cmNlcygpLnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KHJlc291cmNlcykpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG1vbml0b3IpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0RlbGV0ZVJlYWxSZXNvdXJjZXMoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkvLyB2ZXJpZnkgYWxsIHVuZGVybHlpbmcgcmVzb3VyY2VzIGV4aXN0IGZvciB0aGUgdmlydHVhbCByZXNvdXJjZSB0bwotCQkvLyBleGlzdAotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBnZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCk7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVzb3VyY2VzW2ldID09IG51bGwgfHwgIXJlc291cmNlc1tpXS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJaW50IGRvdCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGRvdCA9PSAtMSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZG90ID09IG5hbWUubGVuZ3RoKCkgLSAxKQotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGRvdCArIDEpOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoKSB7Ci0JCXJldHVybiBydW50aW1lUGF0aDsKLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBnZXRQcm9qZWN0UmVsYXRpdmVQYXRocygpIHsKLQotCQlXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCA9IGdldFJlYWRPbmx5Q29tcG9uZW50KCk7Ci0JCWlmIChhQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdChhQ29tcG9uZW50KTsKLQkJCS8vIHN0aWxsIG5lZWQgc29tZSBzb3J0IG9mIGxvb3AgaGVyZSB0byBzZWFyY2ggc3VicGllY2VzIG9mIHRoZQotCQkJLy8gcnVudGltZSBwYXRoLgotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSBjb21wb25lbnRSZXNvdXJjZXMgPSBudWxsOwotCi0JCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQkJSVBhdGhbXSBlc3RpbWF0ZWRQYXRocyA9IG51bGw7Ci0JCQkJSVBhdGggc2VhcmNoUGF0aCA9IG51bGw7Ci0JCQkJZG8gewotCQkJCQlzZWFyY2hQYXRoID0gKHNlYXJjaFBhdGggPT0gbnVsbCkgPyBnZXRSdW50aW1lUGF0aCgpIDogc2VhcmNoUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQkJCWlmIChzZWFyY2hQYXRoLmlzQWJzb2x1dGUoKSkKLQkJCQkJCXNlYXJjaFBhdGggPSBzZWFyY2hQYXRoLm1ha2VSZWxhdGl2ZSgpOwotCQkJCQljb21wb25lbnRSZXNvdXJjZXMgPSByb290LmZpbmRNb2R1bGVSZXNvdXJjZXMoc2VhcmNoUGF0aCwgUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7Ci0JCQkJCWVzdGltYXRlZFBhdGhzID0gZmluZEJlc3RNYXRjaGVzKGNvbXBvbmVudFJlc291cmNlcyk7Ci0JCQkJfQotCQkJCXdoaWxlIChlc3RpbWF0ZWRQYXRocy5sZW5ndGggPT0gMCAmJiBjYW5TZWFyY2hDb250aW51ZShjb21wb25lbnRSZXNvdXJjZXMsIHNlYXJjaFBhdGgpKTsKLQkJCQlpZiAoZXN0aW1hdGVkUGF0aHMgPT0gbnVsbCB8fCBlc3RpbWF0ZWRQYXRocy5sZW5ndGggPT0gMCkKLQkJCQkJcmV0dXJuIG5ldyBJUGF0aFtde2dldFJ1bnRpbWVQYXRoKCl9OwotCQkJCXJldHVybiBlc3RpbWF0ZWRQYXRoczsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXcgSVBhdGhbXXtnZXRSdW50aW1lUGF0aCgpfTsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpIHsKLQkJaWYgKGdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKCIvIikpKSB7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCA9IGdldFJlYWRPbmx5Q29tcG9uZW50KCk7Ci0JCQlpZiAoYUNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKCgoV29ya2JlbmNoQ29tcG9uZW50SW1wbCkgYUNvbXBvbmVudCkuZ2V0RGVmYXVsdFNvdXJjZVJvb3QoKSAhPSBudWxsKQotCQkJCQlyZXR1cm4gKChXb3JrYmVuY2hDb21wb25lbnRJbXBsKSBhQ29tcG9uZW50KS5nZXREZWZhdWx0U291cmNlUm9vdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRQcm9qZWN0UmVsYXRpdmVQYXRocygpWzBdOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5TZWFyY2hDb250aW51ZShDb21wb25lbnRSZXNvdXJjZVtdIGNvbXBvbmVudFJlc291cmNlcywgSVBhdGggc2VhcmNoUGF0aCkgewotCQlyZXR1cm4gKHNlYXJjaFBhdGguc2VnbWVudENvdW50KCkgPiAwKTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoW10gZmluZEJlc3RNYXRjaGVzKENvbXBvbmVudFJlc291cmNlW10gdGhlQ29tcG9uZW50UmVzb3VyY2VzKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgY3VycmVudE1hdGNoTGVuZ3RoID0gMDsKLQkJaW50IGJlc3RNYXRjaExlbmd0aCA9IC0xOwotCQlJUGF0aCBlc3RpbWF0ZWRQYXRoID0gbnVsbDsKLQkJSVBhdGggY3VycmVudFBhdGggPSBudWxsOwotCQlmaW5hbCBJUGF0aCBhUnVudGltZVBhdGggPSBnZXRSdW50aW1lUGF0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUNvbXBvbmVudFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJY3VycmVudFBhdGggPSB0aGVDb21wb25lbnRSZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKTsKLQkJCWlmIChjdXJyZW50UGF0aC5pc1ByZWZpeE9mKGFSdW50aW1lUGF0aCkpIHsKLQkJCQlpZiAoY3VycmVudFBhdGguc2VnbWVudENvdW50KCkgPT0gYVJ1bnRpbWVQYXRoLnNlZ21lbnRDb3VudCgpKSB7Ci0JCQkJCXJlc3VsdC5hZGQodGhlQ29tcG9uZW50UmVzb3VyY2VzW2ldLmdldFNvdXJjZVBhdGgoKSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljdXJyZW50TWF0Y2hMZW5ndGggPSBjdXJyZW50UGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoYVJ1bnRpbWVQYXRoKTsKLQkJCQlpZiAoY3VycmVudE1hdGNoTGVuZ3RoID09IGN1cnJlbnRQYXRoLnNlZ21lbnRDb3VudCgpICYmIGN1cnJlbnRNYXRjaExlbmd0aCA+IGJlc3RNYXRjaExlbmd0aCkgewotCQkJCQliZXN0TWF0Y2hMZW5ndGggPSBjdXJyZW50TWF0Y2hMZW5ndGg7Ci0JCQkJCUlQYXRoIHNvdXJjZVBhdGggPSB0aGVDb21wb25lbnRSZXNvdXJjZXNbaV0uZ2V0U291cmNlUGF0aCgpOwotCQkJCQlJUGF0aCBzdWJwYXRoID0gYVJ1bnRpbWVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoY3VycmVudE1hdGNoTGVuZ3RoKTsKLQkJCQkJZXN0aW1hdGVkUGF0aCA9IHNvdXJjZVBhdGguYXBwZW5kKHN1YnBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0LnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKElQYXRoW10pIHJlc3VsdC50b0FycmF5KG5ldyBJUGF0aFtyZXN1bHQuc2l6ZSgpXSk7Ci0JCWlmIChlc3RpbWF0ZWRQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElQYXRoW117fTsKLQkJcmV0dXJuIG5ldyBJUGF0aFtde2VzdGltYXRlZFBhdGh9OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKGdldFJ1bnRpbWVQYXRoKCkuc2VnbWVudENvdW50KCkgPiAwKQotCQkJcmV0dXJuIGdldFJ1bnRpbWVQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJcmV0dXJuIGdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlpZiAoY29tcG9uZW50ID09IG51bGwpCi0JCQljb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gY29tcG9uZW50OwotCX0KLQotCS8vIHJldHVybnMgbnVsbCBpZiB0aGUgZm9sZGVyIGlzIGFscmVhZHkgdGhlIHJvb3QgZm9sZGVyCi0JcHVibGljIElWaXJ0dWFsQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJaWYgKGdldFJ1bnRpbWVQYXRoKCkuc2VnbWVudENvdW50KCkgPj0gMSkKLQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUZvbGRlcihnZXRQcm9qZWN0KCksIGdldFJ1bnRpbWVQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBjb21wb25lbnRQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWNjZXNzaWJsZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKHRvU3RyaW5nID09IG51bGwpCi0JCQl0b1N0cmluZyA9ICJbIiArIE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKGdldENvbXBvbmVudCgpKSArICI6IiArIGdldFJ1bnRpbWVQYXRoKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiB0b1N0cmluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoaGFzaENvZGUgPT0gMCkKLQkJCWhhc2hDb2RlID0gdG9TdHJpbmcoKS5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk90aGVyKSB7Ci0JCXJldHVybiBoYXNoQ29kZSgpID09ICgoYW5PdGhlciAhPSBudWxsICYmIGFuT3RoZXIgaW5zdGFuY2VvZiBWaXJ0dWFsUmVzb3VyY2UpID8gYW5PdGhlci5oYXNoQ29kZSgpIDogMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyBhUmVzb3VyY2VUeXBlKSB7Ci0JCXJlc291cmNlVHlwZSA9IGFSZXNvdXJjZVR5cGU7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCBhQ29tcG9uZW50ID0gZ2V0UmVhZE9ubHlDb21wb25lbnQoKTsKLQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBhQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKGdldFJ1bnRpbWVQYXRoKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJcmVzb3VyY2VzW2ldLnNldFJlc291cmNlVHlwZShhUmVzb3VyY2VUeXBlKTsKLQkJfQotCi0JfQotCi0JLy8gVE9ETyBGZXRjaCB0aGUgcmVzb3VyY2UgdHlwZSBmcm9tIHRoZSBtb2RlbC4KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKLQkJaWYgKG51bGwgPT0gcmVzb3VyY2VUeXBlKSB7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCA9IGdldFJlYWRPbmx5Q29tcG9uZW50KCk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IGFDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCXJlc291cmNlVHlwZSA9IHJlc291cmNlc1tpXS5nZXRSZXNvdXJjZVR5cGUoKTsKLQkJCQlyZXR1cm4gcmVzb3VyY2VUeXBlOwotCQkJfQotCi0JCX0KLQkJcmVzb3VyY2VUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc291cmNlVHlwZTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlc291cmNlKElDb250YWluZXIgcmVzb3VyY2UsIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHJlc291cmNlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlpZiAoIXJlc291cmNlLmdldFBhcmVudCgpLmV4aXN0cygpKQotCQkJY3JlYXRlUmVzb3VyY2UocmVzb3VyY2UuZ2V0UGFyZW50KCksIHVwZGF0ZUZsYWdzLCBtb25pdG9yKTsKLQkJaWYgKCFyZXNvdXJjZS5leGlzdHMoKSAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJKChJRm9sZGVyKSByZXNvdXJjZSkuY3JlYXRlKHVwZGF0ZUZsYWdzLCB0cnVlLCBtb25pdG9yKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUG90ZW50YWxNYXRjaChJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIGFSdW50aW1lUGF0aC5pc1ByZWZpeE9mKGdldFJ1bnRpbWVQYXRoKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlI3JlbW92ZUxpbmsob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaW5rKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlSZXNvdXJjZVRyZWVSb290IHJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldERlcGxveVJlc291cmNlVHJlZVJvb3QoY29tcG9uZW50KTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gcm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKGdldFJ1bnRpbWVQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCQkJaWYgKHJlc291cmNlcy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgcmVzb3VyY2VJbmR4ID0gMDsgcmVzb3VyY2VJbmR4IDwgcmVzb3VyY2VzLmxlbmd0aDsgcmVzb3VyY2VJbmR4KyspIHsKLQkJCQkJaWYgKGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbi5tYWtlQWJzb2x1dGUoKS5lcXVhbHMocmVzb3VyY2VzW3Jlc291cmNlSW5keF0uZ2V0U291cmNlUGF0aCgpKSkgewotCQkJCQkJY29tcG9uZW50LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZXNbcmVzb3VyY2VJbmR4XSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobW9uaXRvcik7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgV29ya2JlbmNoQ29tcG9uZW50IGdldFJlYWRPbmx5Q29tcG9uZW50KCkgewotCQlpZiAoIW1hcHBpbmcuaGFzQ2hhbmdlZChnZXRQcm9qZWN0KCkpICYmIG1hcHBpbmcuaGFzQ2FjaGVEYXRhKGdldFByb2plY3QoKSkpCi0JCQlyZXR1cm4gKFdvcmtiZW5jaENvbXBvbmVudCkgbWFwcGluZy5nZXREYXRhKGdldFByb2plY3QoKSk7Ci0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChnZXRQcm9qZWN0KCkpOwotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCWNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJbWFwcGluZy5tYXJrKGdldFByb2plY3QoKSwgY29tcG9uZW50KTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcG9uZW50OwotCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9BcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQXJ0aWZhY3RFZGl0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkOTRmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9BcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5FZGl0TW9kZWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFkYXB0cyB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0gdG8gYW4ge0BzZWUgQXJ0aWZhY3RFZGl0KSAKLSAqIGluc3RhbmNlIGZhY2FkZSwgaWYgcG9zc2libGUuIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgCi0gKiByZWdpc3RlcmVkIHdpdGggdGhlIFBsYXRmb3JtIEFkYXB0ZXIgTWFuYWdlciBpbiAKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpfQotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbgotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RFZGl0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgQVJUSUZBQ1RfRURJVF9NT0RFTF9DTEFTUyA9IEFydGlmYWN0RWRpdE1vZGVsLmNsYXNzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIEFSVElGQUNUX0VESVRfQ0xBU1MgPSBBcnRpZmFjdEVkaXQuY2xhc3M7Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiBhbkFkYXB0YWJsZU9iamVjdCwgaWYgcG9zc2libGUuCi0JICogPC9wPiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhbkFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYW5BZGFwdGVyVHlwZSkgewotCQlpZiAoYW5BZGFwdGVyVHlwZSA9PSBBcnRpZmFjdEVkaXRNb2RlbC5BREFQVEVSX1RZUEUpIHsKLQkJCWlmIChhbkFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0RWRpdCkgewotCQkJCUFydGlmYWN0RWRpdCBlZGl0ID0gKEFydGlmYWN0RWRpdClhbkFkYXB0YWJsZU9iamVjdDsKLQkJCQlJUHJvamVjdCBhUHJvamVjdCA9IGVkaXQuZ2V0UHJvamVjdCgpOwotCQkJCVVSSSBjb21wb25lbnRVUkkgPSBNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShhUHJvamVjdCk7Ci0JCQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUoZWRpdC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOwotCQkJCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCXBhcmFtcy5wdXQoQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5LlBBUkFNX01PRFVMRV9VUkksIGNvbXBvbmVudFVSSSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nW10gZWRpdE1vZGVsSURzID0gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRSZWdpc3RlcmVkRWRpdE1vZGVsSURzKCk7Ci0JCQkJCWZvciAoaW50IGk9MDsgaTxlZGl0TW9kZWxJRHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG5hdHVyZS5nZXRFeGlzdGluZ0VkaXRNb2RlbChlZGl0TW9kZWxJRHNbaV0scGFyYW1zLGVkaXQuaXNSZWFkT25seSgpKTsKLQkJCQkJCQlpZiAoZWRpdE1vZGVsICE9bnVsbCkKLQkJCQkJCQkJcmV0dXJuIGVkaXRNb2RlbDsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCQkvL1JldHVybiBudWxsCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChhbkFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUpIHsKLQkJCWlmIChhbkFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0RWRpdE1vZGVsKQotCQkJCXJldHVybiBuZXcgQXJ0aWZhY3RFZGl0KChBcnRpZmFjdEVkaXRNb2RlbCkgYW5BZGFwdGFibGVPYmplY3QpOwotCQkJaWYgKGFuQWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCQlBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpOwotCSAgICAJCUlBcnRpZmFjdEVkaXRGYWN0b3J5IGZhY3RvcnkgPSByZWFkZXIuZ2V0QXJ0aWZhY3RFZGl0KCgoSVZpcnR1YWxDb21wb25lbnQpYW5BZGFwdGFibGVPYmplY3QpLmdldFByb2plY3QoKSk7Ci0JICAgIAkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkgICAgCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yUmVhZCgoSVZpcnR1YWxDb21wb25lbnQpYW5BZGFwdGFibGVPYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKiAgCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tde0FSVElGQUNUX0VESVRfTU9ERUxfQ0xBU1MsQVJUSUZBQ1RfRURJVF9DTEFTU307Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9BcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViMDVjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9BcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0VESVRfRVhURU5TSU9OX1BPSU5UID0gImFydGlmYWN0ZWRpdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNURURJVCA9ICJhcnRpZmFjdGVkaXQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGVJRCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNURURJVENMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyIGluc3RhbmNlID0gbmV3IEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXAvKjxTdHJpbmcsIEFydGlmYWN0RWRpdERlc2NyaXB0b3I+Ki8gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgZmluYWwgTWFwLyo8QXJ0aWZhY3RFZGl0RGVzY3JpcHRvciwgSUFydGlmYWN0RWRpdEZhY3Rvcnk+Ki8gaW5zdGFuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIgaW5zdGFuY2UoKSB7Ci0JCS8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIHJlZ2lzdHJ5IHJlYWQgYnkgdGhlIHRpbWUgdGhlIGNsYXNzIGluaXRpYWxpemVzICovCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcihNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCwgQVJUSUZBQ1RfRURJVF9FWFRFTlNJT05fUE9JTlQpOwotCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsgCi0JCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcigwLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlyZWFkUmVnaXN0cnkoKTsJCQkJCi0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoQVJUSUZBQ1RFRElULmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQotCQkJLyogQmVjYXVzZSB0aGUgb25seSBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgaXMgY3JlYXRlZCBmcm9tIGEgc3RhdGljIHNpbmdsZXRvbiAKLQkJCSAqIGZpZWxkLCBhbmQgdGhlIHJlZ2lzdHJ5IGlzIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIHR5cGUsIAotCQkJICogb3RoZXIgdGhyZWFkcyBjYW5ub3QgY29tcGV0ZSB3aXRoIHJlYWRFbGVtZW50KCkgZm9yIGFjY2VzcyB0byA8aT5kZXNjcmlwdG9yczwvaT4gCi0JCQkgKi8KLQkJCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVFlQRSk7Ci0JCQlpZih0eXBlICE9IG51bGwpCi0JCQkJZGVzY3JpcHRvcnMucHV0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFRZUEUpLCBuZXcgQXJ0aWZhY3RFZGl0RGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQllbHNlIAotCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoMCwgIk5vIHR5cGUgYXR0cmlidXRlIGlzIHNwZWNpZmllZCBmb3IgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuIiArIEFSVElGQUNUX0VESVRfRVhURU5TSU9OX1BPSU5UICsgIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkJIiBleHRlbnNpb24gaW4gIiAgKyBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKSwgbnVsbCk7ICAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUFydGlmYWN0RWRpdEZhY3RvcnkgZ2V0QXJ0aWZhY3RFZGl0KFN0cmluZyB0eXBlSUQpIHsKLQkJCi0JCUFydGlmYWN0RWRpdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChBcnRpZmFjdEVkaXREZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQodHlwZUlEKTsKLQkJSUFydGlmYWN0RWRpdEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCQotCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsgIAotCQkJCi0JCQlmYWN0b3J5ID0gKElBcnRpZmFjdEVkaXRGYWN0b3J5KSBpbnN0YW5jZXMuZ2V0KGRlc2NyaXB0b3IpOwotCQkJCi0JCQlpZihmYWN0b3J5ID09IG51bGwpIHsKLQkJCQkKLQkJCQlpZigoZmFjdG9yeSA9IGRlc2NyaXB0b3IuY3JlYXRlRmFjdG9yeSgpKSAhPSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlcy5wdXQoZGVzY3JpcHRvciwgZmFjdG9yeSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGVzY3JpcHRvcnMucmVtb3ZlKGRlc2NyaXB0b3IpOwotCQkJCX0gCi0JCQl9IAotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwkJCQotCX0gCi0JCi0JLy8gVE9ETyBEb24ndCBsaWtlIHRoaXMgYmVjYXVzZSBpdCdzIGdvaW5nIHRvIGN5Y2xlIGV2ZXJ5IHByb2plY3QgZmFjZXQgZm9yIGVhY2ggcHJvamVjdAotCXB1YmxpYyBJQXJ0aWZhY3RFZGl0RmFjdG9yeSBnZXRBcnRpZmFjdEVkaXQoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJSXRlcmF0b3Iga2V5cyA9IGRlc2NyaXB0b3JzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgdHlwZUlEID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZUlEKTsKLQkJCQkJaWYgKHByb2plY3RGYWNldCAhPSBudWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChwcm9qZWN0RmFjZXQpKQotCQkJCQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdCh0eXBlSUQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSnVzdCByZXR1cm4gbnVsbAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0gCi0JCi0JcHVibGljIGNsYXNzIEFydGlmYWN0RWRpdERlc2NyaXB0b3IgewotCQkKLQkJcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKLQotCQlwdWJsaWMgQXJ0aWZhY3RFZGl0RGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkgewotCQkJZWxlbWVudCA9IGNvbmZpZ0VsZW1lbnQ7Ci0JCQl0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVFlQRSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDcmVhdGUgYW5kIHJldHVybiBhbiB7QGxpbmsgSUFydGlmYWN0RWRpdEZhY3Rvcnl9IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBvciAKLQkJICogPGI+bnVsbDwvYj4gaWYgdGhlcmUgYXJlIHByb2JsZW1zIGluc3RhbnRpYXRpbmcgdGhlIGV4dGVuc2lvbi4KLQkJICogQHJldHVybiBBbiB7QGxpbmsgSUFydGlmYWN0RWRpdEZhY3Rvcnl9IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBvciAKLQkJICogPGI+bnVsbDwvYj4gaWYgdGhlcmUgYXJlIHByb2JsZW1zIGluc3RhbnRpYXRpbmcgdGhlIGV4dGVuc2lvbi4KLQkJICovCi0JCXB1YmxpYyBJQXJ0aWZhY3RFZGl0RmFjdG9yeSBjcmVhdGVGYWN0b3J5KCkgewotCQkJCi0JCQlmaW5hbCBJQXJ0aWZhY3RFZGl0RmFjdG9yeVtdIGZhY3RvcnkgPSBuZXcgSUFydGlmYWN0RWRpdEZhY3RvcnlbMV07Ci0JCQkKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcigwLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOyAKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJZmFjdG9yeVswXSA9IChJQXJ0aWZhY3RFZGl0RmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFSVElGQUNURURJVENMQVNTKTsgCi0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCQkKLQkJCXJldHVybiBmYWN0b3J5WzBdOyAKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHJldHVybiBUaGUgdHlwZSBpZCBvZiB0aGlzIEFydGlmYWN0RWRpdCBkZWZpbml0aW9uIAotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGU7Ci0JCX0gCi0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50SW1wbE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudEltcGxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYzJmZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50SW1wbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVGltZXN0YW1wTWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudEltcGxNYW5hZ2VyICB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fRkFDRVRTID0gIk5PTkUiOy8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0lNUExfRVhURU5TSU9OX1BPSU5UID0gImNvbXBvbmVudGltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT01QT05FTlRfSU1QTCA9ICJjb21wb25lbnRpbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJ0eXBlSUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudEltcGxNYW5hZ2VyIGluc3RhbmNlID0gbmV3IENvbXBvbmVudEltcGxNYW5hZ2VyKCk7Ci0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTE9BRF9GQUlMRUQgPSBuZXcgT2JqZWN0KCk7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcC8qIDxTdHJpbmcsIENvbXBvbmVudEltcGxEZXNjcmlwdG9yPiAqLyBkZXNjcmlwdG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByaXZhdGUgZmluYWwgTWFwLyogPENvbXBvbmVudEltcGxEZXNjcmlwdG9yLCBJQ29tcG9uZW50SW1wbEZhY3Rvcnk+ICovIGluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIGZpbmFsIFJlc291cmNlVGltZXN0YW1wTWFwcGluZ3MgZmFjdG9yeU1hcCA9IG5ldyBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50SW1wbE1hbmFnZXIgaW5zdGFuY2UoKSB7Ci0JCS8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIHJlZ2lzdHJ5IHJlYWQgYnkgdGhlIHRpbWUgdGhlIGNsYXNzIGluaXRpYWxpemVzICovCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50SW1wbE1hbmFnZXIoKSB7Ci0JCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJbmV3IENvbXBvbmVudEltcGxSZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCi0JcHJpdmF0ZSBJQ29tcG9uZW50SW1wbEZhY3RvcnkgZ2V0Q29tcG9uZW50SW1wbEZhY3RvcnkoU3RyaW5nIHR5cGVJRCkgewotCi0JCUNvbXBvbmVudEltcGxEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoQ29tcG9uZW50SW1wbERlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldCh0eXBlSUQpOwotCQlJQ29tcG9uZW50SW1wbEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCi0JCQlmYWN0b3J5ID0gKElDb21wb25lbnRJbXBsRmFjdG9yeSkgaW5zdGFuY2VzLmdldChkZXNjcmlwdG9yKTsKLQotCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCi0JCQkJaWYgKChmYWN0b3J5ID0gZGVzY3JpcHRvci5jcmVhdGVGYWN0b3J5KCkpICE9IG51bGwpIHsKLQkJCQkJaW5zdGFuY2VzLnB1dChkZXNjcmlwdG9yLCBmYWN0b3J5KTsKLQkJCQl9IGVsc2UgewotCQkJCQlkZXNjcmlwdG9ycy5yZW1vdmUoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQkgCi0JcHJpdmF0ZSBJQ29tcG9uZW50SW1wbEZhY3RvcnkgZmluZEZhY3RvcnlGb3JQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpewotCQl0cnkgewotCQkJSUNvbXBvbmVudEltcGxGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwkJCi0JCQkKLQkJCWlmKCAhZmFjdG9yeU1hcC5oYXNDaGFuZ2VkKHByb2plY3QpICkgewkJCQkKLQotCQkJCWlmKCBmYWN0b3J5TWFwLmhhc0NhY2hlRXJyb3IocHJvamVjdCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCQotCQkJCWlmKCBmYWN0b3J5TWFwLmhhc0NhY2hlRGF0YShwcm9qZWN0KSkgCi0JCQkJCXJldHVybiAoSUNvbXBvbmVudEltcGxGYWN0b3J5KSBmYWN0b3J5TWFwLmdldERhdGEocHJvamVjdCk7Ci0JCQl9IAotCQkJCi0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoZmFjZXRlZFByb2plY3QgPT0gbnVsbCl7Ci0JCQkJZmFjdG9yeSA9IGdldENvbXBvbmVudEltcGxGYWN0b3J5KE5PX0ZBQ0VUUyk7Ci0JCQkJZmFjdG9yeU1hcC5tYXJrKHByb2plY3QsIGZhY3RvcnkpOwotCQkJCXJldHVybiBmYWN0b3J5OwotCQkJfQotCQkJSXRlcmF0b3Iga2V5cyA9IGRlc2NyaXB0b3JzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgdHlwZUlEID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQkJaWYodHlwZUlELmVxdWFscyhOT19GQUNFVFMpKXsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHR5cGVJRCk7Ci0JCQkJCWlmIChwcm9qZWN0RmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KSl7Ci0JCQkJCQlmYWN0b3J5ID0gZ2V0Q29tcG9uZW50SW1wbEZhY3RvcnkodHlwZUlEKTsKLQkJCQkJCWlmKG51bGwgIT0gZmFjdG9yeSl7Ci0JCQkJCQkJZmFjdG9yeU1hcC5tYXJrKHByb2plY3QsIGZhY3RvcnkpOwotCQkJCQkJCXJldHVybiBmYWN0b3J5OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKDAsICJSZXR1cm5pbmcgbnVsbCBmYWN0b3J5IGZvciBwcm9qZWN0OiAiICsgcHJvamVjdCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZhY3RvcnlNYXAubWFya0Vycm9yKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkgCi0JCi0JCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGNyZWF0ZUZvbGRlcihJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKXsKLQkJdHJ5IHsKLQkJCUlDb21wb25lbnRJbXBsRmFjdG9yeSBmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JQcm9qZWN0KGFQcm9qZWN0KTsKLQkJCWlmKG51bGwgIT0gZmFjdG9yeSl7Ci0JCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlRm9sZGVyKGFQcm9qZWN0LCBhUnVudGltZVBhdGgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gSnVzdCByZXR1cm4gYSBkZWZhdWx0IGZvbGRlcgotCQl9Ci0JCXJldHVybiBuZXcgVmlydHVhbEZvbGRlcihhUHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQ29tcG9uZW50KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlDb21wb25lbnRJbXBsRmFjdG9yeSBmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JQcm9qZWN0KHByb2plY3QpOwotCQkJaWYobnVsbCAhPSBmYWN0b3J5KXsKLQkJCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBKdXN0IHJldHVybiBhIGRlZmF1bHQgY29tcG9uZW50Ci0JCX0KLQkJaWYgKCFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBuZXcgVmlydHVhbENvbXBvbmVudChwcm9qZWN0LCBuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVBcmNoaXZlQ29tcG9uZW50KElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgYUNvbXBvbmVudE5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlDb21wb25lbnRJbXBsRmFjdG9yeSBmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JQcm9qZWN0KGFQcm9qZWN0KTsKLQkJCWlmKG51bGwgIT0gZmFjdG9yeSl7Ci0JCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChhUHJvamVjdCwgYUNvbXBvbmVudE5hbWUsIG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBKdXN0IHJldHVybiBhIGRlZmF1bHQgYXJjaGl2ZSBjb21wb25lbnQKLQkJfQotCQlyZXR1cm4gbmV3IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KGFQcm9qZWN0LCBhQ29tcG9uZW50TmFtZSwgbmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBDb21wb25lbnRJbXBsRGVzY3JpcHRvciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKLQotCQlwdWJsaWMgQ29tcG9uZW50SW1wbERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJCWVsZW1lbnQgPSBjb25maWdFbGVtZW50OwotCQkJdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGUgYW5kIHJldHVybiBhbiB7QGxpbmsgSUFydGlmYWN0RWRpdEZhY3Rvcnl9IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBvciA8Yj5udWxsPC9iPgotCQkgKiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgaW5zdGFudGlhdGluZyB0aGUgZXh0ZW5zaW9uLgotCQkgKiAKLQkJICogQHJldHVybiBBbiB7QGxpbmsgSUFydGlmYWN0RWRpdEZhY3Rvcnl9IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBvciA8Yj5udWxsPC9iPiBpZiB0aGVyZQotCQkgKiAgICAgICAgIGFyZSBwcm9ibGVtcyBpbnN0YW50aWF0aW5nIHRoZSBleHRlbnNpb24uCi0JCSAqLwotCQlwdWJsaWMgSUNvbXBvbmVudEltcGxGYWN0b3J5IGNyZWF0ZUZhY3RvcnkoKSB7Ci0KLQkJCWZpbmFsIElDb21wb25lbnRJbXBsRmFjdG9yeVtdIGZhY3RvcnkgPSBuZXcgSUNvbXBvbmVudEltcGxGYWN0b3J5WzFdOwotCi0JCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJZmFjdG9yeVswXSA9IChJQ29tcG9uZW50SW1wbEZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQkJCX0KLQotCQkJfSk7Ci0KLQkJCXJldHVybiBmYWN0b3J5WzBdOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAcmV0dXJuIFRoZSB0eXBlIGlkIG9mIHRoaXMgQXJ0aWZhY3RFZGl0IGRlZmluaXRpb24KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBDb21wb25lbnRJbXBsUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkJcHVibGljIENvbXBvbmVudEltcGxSZWdpc3RyeVJlYWRlcigpIHsKLQkJCXN1cGVyKE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBDT01QT05FTlRfSU1QTF9FWFRFTlNJT05fUE9JTlQpOwotCQl9IAotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChUQUdfQ09NUE9ORU5UX0lNUEwuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCi0JCQkJLyoKLQkJCQkgKiBCZWNhdXNlIHRoZSBvbmx5IGluc3RhbmNlIG9mIHRoaXMgdHlwZSBpcyBjcmVhdGVkIGZyb20gYSBzdGF0aWMgc2luZ2xldG9uIGZpZWxkLCBhbmQKLQkJCQkgKiB0aGUgcmVnaXN0cnkgaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoaXMgdHlwZSwgb3RoZXIgdGhyZWFkcyBjYW5ub3QKLQkJCQkgKiBjb21wZXRlIHdpdGggcmVhZEVsZW1lbnQoKSBmb3IgYWNjZXNzIHRvIDxpPmRlc2NyaXB0b3JzPC9pPgotCQkJCSAqLwotCQkJCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RZUEUpOwotCQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkJCWRlc2NyaXB0b3JzLnB1dChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSksIG5ldyBDb21wb25lbnRJbXBsRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQkJZWxzZQotCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKDAsICJObyB0eXBlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgZm9yICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lEICsgIi4iICsgQ09NUE9ORU5UX0lNUExfRVhURU5TSU9OX1BPSU5UICsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJIiBleHRlbnNpb24gaW4gIiArIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmODMzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudFJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXJFeHRlbnNpb24gewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gX0RFQlVHID0gInRydWUiLmVxdWFscyhQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL0NvbXBvbmVudFJlc29sdmVyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wyID0gImZpbGU6Ly8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSF9TVFJJTkcgPSBQYXRoLlJPT1QudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVmFyaW91cyByZXNvbHZlcnMgZGlzYWdyZWUgb24gaG93IG1hbnkgcHJlY2VkaW5nIHNsYXNoZXMgc2hvdWxkCi0JICogYWN0dWFsbHkgYmUgdXNlZC4gT24gV2luMzIsIDIgc2xhc2hlcyByZXN1bHRzIGluIGEgVVJMIG9iamVjdCB3aGVyZSB0aGUKLQkgKiB2b2x1bWUgaXMgc3RyaXBwZWQgb3V0IG9mIHRoZSBmaWxlIHBhdGggYXMgdGhlIGhvc3QgbmFtZSwgYnV0IG9uIFVuaXggMgotCSAqIGlzIHRoZSBjb3JyZWN0IG51bWJlci4gT24gV2luMzIsIGphdmEuaW8uRmlsZS50b1VSTCBhZGRzIG9ubHkgMSBzbGFzaCwKLQkgKiBhbmQgb24gVW5peCBpdCBhZGRzIDIuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gVGhlIElGaWxlIGZvciB0aGlzIGZpbGUgbG9jYXRpb24KLQkgKi8KLQlwcml2YXRlIElGaWxlIHJlY2FsY3VsYXRlRmlsZShTdHJpbmcgdXJpKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCi0JCWxvbmcgdGltZTAgPSAtMTsKLQkJaWYgKF9ERUJVRykKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWlmICh1cmkuc3RhcnRzV2l0aChIVFRQX1BST1RPQ09MKSkgewotCQkJSUZpbGUgZmlsZXNbXSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb25VUkkoVVJJLmNyZWF0ZSh1cmkpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGZpbGUgPT0gbnVsbDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoX0RFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcIiIgKyB1cmkgKyAiXCIgZmluZEZpbGVzRm9yTG9jYXRpb25VUkk6IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSk7Ci0JCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MKSkgewotCQkJCWxvY2F0aW9uID0gdXJpLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MLmxlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wyKSkgewotCQkJCWxvY2F0aW9uID0gdXJpLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MMi5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsb2NhdGlvbiA9IHVyaTsKLQkJCX0KLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGZpbGUgPT0gbnVsbDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKF9ERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXCIiICsgbG9jYXRpb24gKyAiXCIgZmluZEZpbGVzRm9yTG9jYXRpb246IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShJRmlsZSBmaWxlLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoX0RFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCJDb21wb25lbnRSZXNvbHZlcjogcmVzb2x2ZSBcIlt7IiArIHB1YmxpY0lkICsgIn17IiArIHN5c3RlbUlkICsgIn1dXCIgZnJvbSBcIiIgKyBiYXNlTG9jYXRpb24gKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCS8vIGFyZ3VtZW50IHNhbml0eSBjaGVja3MKLQkJLyoKLQkJICogQ2hlY2sgZm9yIGEgc3lzdGVtIHJlZmVyZW5jZTsgd2l0aG91dCBvbmUsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4KLQkJICogY29udGludWluZyAod2UgY2FuJ3QgcmVzb2x2ZSBqdXN0IGEgcHVibGljIGlkZW50aWZpZXIpLgotCQkgKi8KLQkJaWYgKHN5c3RlbUlkID09IG51bGwgfHwgc3lzdGVtSWQubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChubyBzeXN0ZW0gcmVmZXJlbmNlKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qIFJlY29tcHV0ZSB0aGUgSUZpbGUsIGlmIG5lZWRlZCwgZnJvbSB0aGUgYmFzZSBsb2NhdGlvbi4gKi8KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsIHx8IGJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBXZSBjYW4ndCBwcm9jZWVkIGlmIHdlIGxhY2sgYm90aCBhbiBJRmlsZSBhbmQgYSBzeXN0ZW0KLQkJCQkgKiByZWZlcmVuY2UKLQkJCQkgKi8KLQkJCQlpZiAoX0RFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChubyBiYXNlIGxvY2F0aW9uIG9yIGZpbGUgZ2l2ZW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlmaWxlID0gcmVjYWxjdWxhdGVGaWxlKGJhc2VMb2NhdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiBhIHdvcmtzcGFjZSBJRmlsZSBpcyAoc3RpbGwpIG5vdCB0aGUgYmFzZSBwb2ludCBvZiByZWZlcmVuY2UsCi0JCSAqIGRvbid0IGNvbnRpbnVlLgotCQkgKi8KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChub3QgYSB3b3Jrc3BhY2UgZmlsZSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKiBDaGVjayBmb3IgYW4gYWJzb2x1dGUgVVJMIGFzIHRoZSBzeXN0ZW0gcmVmZXJlbmNlLiAqLwotCQl0cnkgewotCQkJVVJMIHRlc3RVUkwgPSBuZXcgVVJMKHN5c3RlbUlkKTsKLQkJCWlmICh0ZXN0VVJMICE9IG51bGwpIHsKLQkJCQlpZiAoX0RFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChyZWZlcmVuY2UgaXMgYWxyZWFkeSBhIFVSTCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENvbnRpbnVlIHJlc29sdmluZwotCQl9Ci0KLQkJLyogQ2hlY2sgZm9yIGEgVVJJIHdpdGhvdXQgYSBzY2hlbWUsIGJ1dCB3aXRoIGEgaG9zdCAqLwotCQl0cnkKLQkJewotCQkJVVJJIHVyaSA9IG5ldyBVUkkoc3lzdGVtSWQpOwotCQkJaWYgKCh1cmkuZ2V0U2NoZW1lKCkgPT0gbnVsbCkgJiYgKHVyaS5nZXRIb3N0KCkgIT0gbnVsbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB1c2UpCi0JCXsKLQkJCS8vIGRvIG5vdGhpbmctIHdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBsb2NhbCBmaWxlCi0JCX0KLQotCQkvKiBDaGVjayBmb3IgYSBzeXN0ZW0gZmlsZSBuYW1lIGFzIHRoZSBzeXN0ZW0gcmVmZXJlbmNlLiAqLwotCQlJUGF0aCBzeXN0ZW1QYXRoID0gbmV3IFBhdGgoc3lzdGVtSWQpOwotCQlpZiAoc3lzdGVtUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChyZWZlcmVuY2UgaXMgYSBzeXN0ZW0gZmlsZSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlib29sZWFuIHByZXBlbmRGaWxlUHJlZml4ID0gYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkgJiYgYmFzZUxvY2F0aW9uLmxlbmd0aCgpID4gNzsKLQkJYm9vbGVhbiBwcmVwZW5kRmlsZVByZWZpeDIgPSBiYXNlTG9jYXRpb24uc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MMikgJiYgYmFzZUxvY2F0aW9uLmxlbmd0aCgpID4gODsKLQotCQlTdHJpbmcgcmVzb2x2ZWRQYXRoID0gbnVsbDsKLQotCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIkV4Y2VwdGlvbiBjYWxsaW5nIENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKCkiLCBlKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoTW9kdWxlY29yZVBsdWdpbi5QTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPbmx5IHJldHVybiByZXN1bHRzIGZvciBGbGV4aWJsZSBwcm9qZWN0cwotCQlpZiAodmlydHVhbFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZpcnR1YWxSZXNvdXJjZXMubGVuZ3RoICYmIHJlc29sdmVkUGF0aCA9PSBudWxsOyBpKyspIHsKLQkJCQlJUGF0aCByZXNvbHZlZFJ1bnRpbWVQYXRoID0gbnVsbDsKLQkJCQlpZiAoc3lzdGVtSWQuc3RhcnRzV2l0aChST09UX1BBVEhfU1RSSU5HKSkgewotCQkJCQlyZXNvbHZlZFJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoc3lzdGVtSWQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzb2x2ZWRSdW50aW1lUGF0aCA9IG5ldyBQYXRoKHZpcnR1YWxSZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKHN5c3RlbUlkKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJSVZpcnR1YWxGaWxlIHZpcnR1YWxGaWxlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVGaWxlKGZpbGUuZ2V0UHJvamVjdCgpLCByZXNvbHZlZFJ1bnRpbWVQYXRoKTsKLQkJCQlJRmlsZSByZXNvbHZlZEZpbGUgPSBudWxsOwotCQkJCWlmICh2aXJ0dWFsRmlsZS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJcmVzb2x2ZWRGaWxlID0gdmlydHVhbEZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJCQl9Ci0JCQkJaWYgKHJlc29sdmVkRmlsZSAhPSBudWxsICYmIHJlc29sdmVkRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJaWYgKHByZXBlbmRGaWxlUHJlZml4KSB7Ci0JCQkJCQlyZXNvbHZlZFBhdGggPSBGSUxFX1BST1RPQ09MICsgcmVzb2x2ZWRGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcmVwZW5kRmlsZVByZWZpeDIpIHsKLQkJCQkJCXJlc29sdmVkUGF0aCA9IEZJTEVfUFJPVE9DT0wyICsgcmVzb2x2ZWRGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc29sdmVkUGF0aCA9IHJlc29sdmVkRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoX0RFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgKG5vdCBpbiBmbGV4aWJsZSBwcm9qZWN0KSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKF9ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLT4gXCIiICsgcmVzb2x2ZWRQYXRoICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiByZXNvbHZlZFBhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1YWZhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50VXRpbGl0aWVzIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzIENvbnRleHRSb290TWFwcGluZyA9IG5ldyBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBFbnN1cmUgdGhlIGNvbnRhaW5lciBpcyBub3QgcmVhZC1vbmx5LgotCSAqIDxwPgotCSAqIEZvciBMaW51eCwgYSBSZXNvdXJjZSBjYW5ub3QgYmUgY3JlYXRlZCBpbiBhIFJlYWRPbmx5IGZvbGRlci4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgbmV3Ci0JICogZmlsZXMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB3b3Jrc3BhY2UgcmVzb3VyY2UgdG8gbWFrZSByZWFkL3dyaXRlCi0JICogQHBsYW5uZWRmb3IgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlQ29udGFpbmVyTm90UmVhZE9ubHkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5leGlzdHMoKSkgeyAvLyBpdCBtdXN0IGJlIG5ldwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCVJlc291cmNlQXR0cmlidXRlcyBhdHRyID0gY29udGFpbmVyLmdldFJlc291cmNlQXR0cmlidXRlcygpOwotCQkJCWlmICghYXR0ci5pc1JlYWRPbmx5KCkpCi0JCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJCQlhdHRyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZvbGRlciBjcmVhdGVGb2xkZXJJbkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBmb2xkZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmb2xkZXJOYW1lICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3Rmb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChyb290Zm9sZGVyLmdldFByb2plY3QoKS5nZXROYW1lKCkpLmFwcGVuZChmb2xkZXJOYW1lKSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCVByb2plY3RVdGlsaXRpZXMuZW5zdXJlQ29udGFpbmVyTm90UmVhZE9ubHkoZm9sZGVyKTsKLQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIGZvbGRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyLmluc3RhbmNlKCk7Ci0JCQlJQXJ0aWZhY3RFZGl0RmFjdG9yeSBmYWN0b3J5ID0gcmVhZGVyLmdldEFydGlmYWN0RWRpdChjb21wLmdldFByb2plY3QoKSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBjb21wLCBTdHJpbmcgdHlwZSkgewotCQlpZiAoY29tcCAhPSBudWxsKSB7Ci0JCQlBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpOwotCQkJSUFydGlmYWN0RWRpdEZhY3RvcnkgZmFjdG9yeSA9IHJlYWRlci5nZXRBcnRpZmFjdEVkaXQodHlwZSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIElGaWxlIGZpbmRGaWxlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXAsIElQYXRoIGFQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb21wID09IG51bGwgfHwgYVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVmlydHVhbEZvbGRlciByb290ID0gY29tcC5nZXRSb290Rm9sZGVyKCk7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgZmlsZSA9IHJvb3QuZmluZE1lbWJlcihhUGF0aCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5nZXRUeXBlKCkgPT0gSVZpcnR1YWxSZXNvdXJjZS5GSUxFKXsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpewotCQkJCXJldHVybiAoSUZpbGUpIHJlc291cmNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgZmluZENvbXBvbmVudChJUmVzb3VyY2UgcmVzKSB7Ci0KLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudClyZXMuZ2V0QWRhcHRlcihJVmlydHVhbENvbXBvbmVudC5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqICoqKioqKioqKioqKioqKioqKioqKipQbGVhc2UgcmVhZCBqYXZhIGRvYyBiZWZvcmUgdXNpbmcgdGhpcyBhcGkqKioqKioqKioqKioqKioqKioqCi0JICogVGhpcyBpcyBhIHZlcnkgZXhwZW5zaXZlIGFwaSBmcm9tIGEgcGVyZm9ybWFuY2UgcG9pbnQgYXMgaXQgZG9lcyBhIHN0cnVjdHVyZSBlZGl0Ci0JICogYWNjZXNzIGFuZCByZWxlYXNlIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgd29ya3NwYWNlLiBVc2UgdGhpcyBhcGkgdmVyeSBzcGFyaW5nbHkKLQkgKiBhbmQgaWYgdXNlZCBjYWNoZWQgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoaXMgYXBpIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcKLQkgKiBAcmV0dXJuIC0gQSBhbiBhcnJheSBvZiBhbGwgdmlydHVhbCBjb21wb25lbnRzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldEFsbFdvcmtiZW5jaENvbXBvbmVudHMoKSB7Ci0JCUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcm9qZWN0cyA9IEFycmF5cy5hc0xpc3QoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJaWYoIE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QoKElQcm9qZWN0KXByb2plY3RzLmdldChpKSkpewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHdiQ29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KChJUHJvamVjdClwcm9qZWN0cy5nZXQoaSkpOwotCQkJCWNvbXBvbmVudHMuYWRkKHdiQ29tcCk7Ci0JCQl9Ci0JCX0KLQkJSVZpcnR1YWxDb21wb25lbnRbXSB0ZW1wID0gKElWaXJ0dWFsQ29tcG9uZW50W10pIGNvbXBvbmVudHMudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbY29tcG9uZW50cy5zaXplKCldKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCQotCS8qKgotCSAqICoqKioqKioqKioqKioqKioqKioqKipQbGVhc2UgcmVhZCBqYXZhIGRvYyBiZWZvcmUgdXNpbmcgdGhpcyBhcGkqKioqKioqKioqKioqKioqKioqCi0JICogVGhpcyBpcyBhIHZlcnkgZXhwZW5zaXZlIGFwaSBmcm9tIGEgcGVyZm9ybWFuY2UgcG9pbnQgYXMgaXQgZG9lcyBhIHN0cnVjdHVyZSBlZGl0Ci0JICogYWNjZXNzIGFuZCByZWxlYXNlIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgd29ya3NwYWNlLiBVc2UgdGhpcyBhcGkgdmVyeSBzcGFyaW5nbHkKLQkgKiBhbmQgaWYgdXNlZCBjYWNoZWQgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoaXMgYXBpIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCi0JICogCi0JICogQHJldHVybiAtIEEgdmlydHVhbCBjb21wb25lbnQgaW4gdGhlIHdvcmtzcGFjZQotCSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKLQkJSVZpcnR1YWxDb21wb25lbnRbXSBhbGxDb21wb25lbnRzID0gZ2V0QWxsV29ya2JlbmNoQ29tcG9uZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhbGxDb21wb25lbnRzW2ldLmdldE5hbWUoKS5lcXVhbHMoY29tcG9uZW50TmFtZSkpCi0JCQkJcmV0dXJuIGFsbENvbXBvbmVudHNbaV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvcldyaXRlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKLQkJaWYgKGNvbXAgIT0gbnVsbCkgewotCQkJQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIuaW5zdGFuY2UoKTsKLQkJCUlBcnRpZmFjdEVkaXRGYWN0b3J5IGZhY3RvcnkgPSByZWFkZXIuZ2V0QXJ0aWZhY3RFZGl0KGNvbXAuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoY29tcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBmaW5kQ29tcG9uZW50KEVPYmplY3QgYW5PYmplY3QpIHsKLQkJUmVzb3VyY2UgcmVzID0gYW5PYmplY3QuZVJlc291cmNlKCk7Ci0JCXJldHVybiBmaW5kQ29tcG9uZW50KHJlcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBmaW5kQ29tcG9uZW50KFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShhUmVzb3VyY2UpOwotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnQpZmlsZS5nZXRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50LmNsYXNzKTsKLQl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24gY3JlYXRlRmxleEphdmFQcm9qZWN0Rm9yUHJvamVjdE9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0vLwkJSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotLy8JCW1vZGVsLnNldFByb3BlcnR5KElKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0vLwkJcmV0dXJuIG5ldyBKYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbihtb2RlbCk7Ci0vLwl9Ci0KLQlwdWJsaWMgc3RhdGljIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcCBjcmVhdGVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0IHRhcmdldENvbXBvbmVudFByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJbW9kSGFuZGxlc0xpc3QuYWRkQWxsKHRhcmdldENvbXBvbmVudFByb2plY3RzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQkKLQkJcmV0dXJuIG5ldyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AobW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcCBjcmVhdGVXTFBSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0IHRhcmdldENvbXBvbmVudFByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJbW9kSGFuZGxlc0xpc3QuYWRkQWxsKHRhcmdldENvbXBvbmVudFByb2plY3RzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbiByZW1vdmVXTFBSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0IHRhcmdldENvbXBvbmVudFByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJbW9kSGFuZGxlc0xpc3QuYWRkQWxsKHRhcmdldENvbXBvbmVudFByb2plY3RzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQkKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCIvV0VCLUlORi9saWIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcmV0dXJuIG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24obW9kZWwpOwotCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uIHJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbihJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wb25lbnQsIExpc3QgdGFyZ2V0Q29tcG9uZW50UHJvamVjdHMpIHsKLQkJSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBzb3VyY2VDb21wb25lbnQpOwotCQlMaXN0IG1vZEhhbmRsZXNMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQltb2RIYW5kbGVzTGlzdC5hZGRBbGwodGFyZ2V0Q29tcG9uZW50UHJvamVjdHMpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RIYW5kbGVzTGlzdCk7Ci0JCXJldHVybiBuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uKG1vZGVsKTsKLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0Q29tcG9uZW50cyhJUHJvamVjdFtdIHByb2plY3RzKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJvamVjdHMhPW51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChwcm9qZWN0c1tpXSAhPSBudWxsKSB7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0c1tpXSk7Ci0JCQkJCWlmIChjb21wICE9IG51bGwgJiYgY29tcC5leGlzdHMoKSkKLQkJCQkJCXJlc3VsdC5hZGQoY29tcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElWaXJ0dWFsQ29tcG9uZW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSB0aGUgY29udGV4dCByb290IGZvciB0aGUgYXNzb2NpYXRlZCB3b3JrYmVuY2ggbW9kdWxlIHdoaWNoIGlzIHVzZWQKLQkgKiBieSB0aGUgc2VydmVyIGF0IHJ1bnRpbWUuICBUaGlzIG1ldGhvZCBpcyBub3QgeWV0IGNvbXBsZXRlZCBhcyB0aGUgY29udGV4dCByb290IGhhcyB0byBiZQotCSAqIGFic3RyYWN0ZWQgYW5kIGFkZGVkIHRvIHRoZSB3b3JrYmVuY2hNb2R1bGUgbW9kZWwuICBUaGlzIEFQSSB3aWxsIG5vdCBjaGFuZ2UgdGhvdWdoLgotCSAqIFJldHVybnMgbnVsbCBmb3Igbm93LgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHRoZSBjb250ZXh0IHJvb3QgZm9yIHJ1bnRpbWUgb2YgdGhlIGFzc29jaWF0ZWQgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyQ29udGV4dFJvb3QoSVByb2plY3QgcHJvamVjdCkgewkJCi0JCQotCQlpZighQ29udGV4dFJvb3RNYXBwaW5nLmhhc0NoYW5nZWQocHJvamVjdCkpIHsKLQkJCS8qU2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIGRhdGEqLwotCQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQkJaWYoIUNvbnRleHRSb290TWFwcGluZy5oYXNDYWNoZUVycm9yKHByb2plY3QpICYmIENvbnRleHRSb290TWFwcGluZy5oYXNDYWNoZURhdGEocHJvamVjdCkpCi0JCQkJZGF0YSA9IChTdHJpbmcpIENvbnRleHRSb290TWFwcGluZy5nZXREYXRhKHByb2plY3QpOwotCQkJcmV0dXJuIGRhdGE7Ci0JCX0KLQkJCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWlmIChtb2R1bGVDb3JlID09IG51bGwgfHwgbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKSA9PSBudWxsKSB7Ci0JCQkJQ29udGV4dFJvb3RNYXBwaW5nLm1hcmtFcnJvcihwcm9qZWN0KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlMaXN0IGV4aXN0aW5nUHJvcHMgPSB3YkNvbXBvbmVudC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdQcm9wcy5zaXplKCk7IGkrKykgewotCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgZXhpc3RpbmdQcm9wcy5nZXQoaSk7Ci0JCQlpZihwcm9wLmdldE5hbWUoKS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5DT05URVhUUk9PVCkpewotCQkJCUNvbnRleHRSb290TWFwcGluZy5tYXJrKHByb2plY3QsIHByb3AuZ2V0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuIHByb3AuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQkJCi0JCUNvbnRleHRSb290TWFwcGluZy5tYXJrRXJyb3IocHJvamVjdCk7Ci0JCS8vIElmIGFsbCBlbHNlIGZhaWxzLi4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgY29udGV4dCByb290IG9uIHRoZSBhc3NvY2lhdGVkIHdvcmtiZW5jaCBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nCi0JICogdmFsdWUgcGFzc2VkIGluLiAgVGhpcyBjb250ZXh0IHJvb3QgaXMgdXNlZCBieSB0aGUgc2VydmVyIGF0IHJ1bnRpbWUuICBUaGlzIG1ldGhvZCBpcyBub3QgeWV0Ci0JICogY29tcGxldGVkIGFzIHRoZSBjb250ZXh0IHJvb3Qgc3RpbGwgbmVlZHMgdG8gYmUgYWJzdHJhY3RlZCBhbmQgYWRkZWQgdG8gdGhlIHdvcmtiZW5jaCBtb2R1bGUKLQkgKiBtb2RlbC4gIFRoaXMgQVBJIHdpbGwgbm90IGNoYW5nZSB0aG91Z2guCi0JICogRG9lcyBub3RoaW5nIGFzIG9mIG5vdy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dFJvb3Qgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNlcnZlckNvbnRleHRSb290KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb250ZXh0Um9vdCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWNvbXAuc2V0TWV0YVByb3BlcnR5KElNb2R1bGVDb25zdGFudHMuQ09OVEVYVFJPT1QsIGNvbnRleHRSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXREZXBsb3lVcmlPZkNvbXBvbmVudChJVmlydHVhbFJlZmVyZW5jZSwgU3RyaW5nKX0KLQkgKiBAcGFyYW0gcmVmZXJlbmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlcGxveVVyaU9mVXRpbENvbXBvbmVudChJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UpewotCQlyZXR1cm4gQ29tcG9uZW50VXRpbGl0aWVzLmdldERlcGxveVVyaU9mQ29tcG9uZW50KHJlZmVyZW5jZSwgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlcGxveVVyaU9mQ29tcG9uZW50KElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSByZWZlcmVuY2UuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCWlmKCBhcmNoaXZlTmFtZSAhPSBudWxsICYmICFhcmNoaXZlTmFtZS5lcXVhbHMoIiIpICl7IC8vJE5PTi1OTFMtMSQKLQkJCXVyaSA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpICsgIi8iICsgcmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfWVsc2V7Ci0JCQl1cmkgPSByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSArICIvIiArIHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArIGV4dGVuc2lvbjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudGNvcmVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50Y29yZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTYyOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50Y29yZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb25lbnRjb3JlQWRhcHRlckZhY3RvcnkuamF2YSx2IDEuNiAyMDA1LzEwLzE4IDIyOjI3OjE4IGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRjb3JlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvbmVudGNvcmVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50Y29yZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb25lbnRjb3JlU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IENvbXBvbmVudGNvcmVTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrYmVuY2hDb21wb25lbnQoV29ya2JlbmNoQ29tcG9uZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrYmVuY2hDb21wb25lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb25lbnRSZXNvdXJjZShDb21wb25lbnRSZXNvdXJjZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50UmVzb3VyY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb25lbnRUeXBlKENvbXBvbmVudFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvcGVydHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWZlcmVuY2VkQ29tcG9uZW50KFJlZmVyZW5jZWRDb21wb25lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9qZWN0Q29tcG9uZW50cyhQcm9qZWN0Q29tcG9uZW50cyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvamVjdENvbXBvbmVudHNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCA8ZW0+V29ya2JlbmNoIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtiZW5jaENvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlIDxlbT5Db21wb25lbnQgUmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvbmVudFJlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9uZW50VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvcGVydHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50IDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWZlcmVuY2VkQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMgPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvamVjdENvbXBvbmVudHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQ29tcG9uZW50Y29yZUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRjb3JlU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRjb3JlU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NTZhYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50Y29yZVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9uZW50Y29yZVN3aXRjaC5qYXZhLHYgMS42IDIwMDUvMTAvMTggMjI6Mjc6MTggY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudGNvcmVTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9uZW50Y29yZVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRjb3JlU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UOiB7Ci0JCQkJV29ya2JlbmNoQ29tcG9uZW50IHdvcmtiZW5jaENvbXBvbmVudCA9IChXb3JrYmVuY2hDb21wb25lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtiZW5jaENvbXBvbmVudCh3b3JrYmVuY2hDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFOiB7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2UgY29tcG9uZW50UmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbXBvbmVudFJlc291cmNlKGNvbXBvbmVudFJlc291cmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFOiB7Ci0JCQkJQ29tcG9uZW50VHlwZSBjb21wb25lbnRUeXBlID0gKENvbXBvbmVudFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbXBvbmVudFR5cGUoY29tcG9uZW50VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9QRVJUWTogewotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVDogewotCQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IChSZWZlcmVuY2VkQ29tcG9uZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZWZlcmVuY2VkQ29tcG9uZW50KHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTOiB7Ci0JCQkJUHJvamVjdENvbXBvbmVudHMgcHJvamVjdENvbXBvbmVudHMgPSAoUHJvamVjdENvbXBvbmVudHMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2plY3RDb21wb25lbnRzKHByb2plY3RDb21wb25lbnRzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2JlbmNoIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrYmVuY2hDb21wb25lbnQoV29ya2JlbmNoQ29tcG9uZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcG9uZW50UmVzb3VyY2UoQ29tcG9uZW50UmVzb3VyY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb25lbnQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb25lbnQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcG9uZW50VHlwZShDb21wb25lbnRUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb3BlcnR5KFByb3BlcnR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlZmVyZW5jZWRDb21wb25lbnQoUmVmZXJlbmNlZENvbXBvbmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9qZWN0IENvbXBvbmVudHM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2plY3RDb21wb25lbnRzKFByb2plY3RDb21wb25lbnRzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Db21wb25lbnRjb3JlU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9EZXBlbmRlbmN5VHlwZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0RlcGVuZGVuY3lUeXBlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTkxMjdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0RlcGVuZGVuY3lUeXBlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBhZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lUeXBlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXVFBNb2R1bGVzWG1sTWFwcGVySXsKLQkKLQlwdWJsaWMgRGVwZW5kZW5jeVR5cGVUcmFuc2xhdG9yKCl7Ci0JCXN1cGVyKERFUEVOREVOQ1lfVFlQRSxDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbmN5VHlwZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJU3RyaW5nIGNvcnJlY3QgPSBzdHJWYWx1ZTsKLQkJaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJDT05TVU1FUyIpKSAvLyROT04tTkxTLTEkCi0JCQljb3JyZWN0ID0gRGVwZW5kZW5jeVR5cGUuQ09OU1VNRVNfTElURVJBTC5nZXROYW1lKCk7IAotCQllbHNlIGlmIChzdHJWYWx1ZS50b1VwcGVyQ2FzZSgpLmVxdWFscygiVVNFUyIpKSAvLyROT04tTkxTLTEkCi0JCQljb3JyZWN0ID0gRGVwZW5kZW5jeVR5cGUuVVNFU19MSVRFUkFMLmdldE5hbWUoKTsgCi0JCQkKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKGNvcnJlY3QsIG93bmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0RlcGxveWVkUGF0aFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9EZXBsb3llZFBhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY0MjMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0RlcGxveWVkUGF0aFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgRGVwbG95ZWRQYXRoUHJvdmlkZXIgaW1wbGVtZW50cyBJUGF0aFByb3ZpZGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRGVwbG95ZWRQYXRoUHJvdmlkZXIoKTsKLQkKLQlwcml2YXRlIERlcGxveWVkUGF0aFByb3ZpZGVyKCkge30gCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudXRpbC5JUGF0aFByb3ZpZGVyI2dldFBhdGgob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChDb21wb25lbnRSZXNvdXJjZSBhTW9kdWxlUmVzb3VyY2UpIHsgCi0JCXJldHVybiBhTW9kdWxlUmVzb3VyY2UuZ2V0UnVudGltZVBhdGgoKTsKLQl9Ci0JCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudFJlc291cmNlX1J1bnRpbWVQYXRoKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9FY2xpcHNlUmVzb3VyY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9FY2xpcHNlUmVzb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMDk1MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvRWNsaXBzZVJlc291cmNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVJlc291cmNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQWRhcHRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfVFlQRSA9IEVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIuY2xhc3M7Ci0JcHJpdmF0ZSBJUmVzb3VyY2UgcmVzb3VyY2U7IAotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIGFOb3RpZmljYXRpb24pIHsKLQkJaWYgKGFOb3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRSZXNvdXJjZV9Tb3VyY2VQYXRoKCkpIHsKLQkJCWlmIChhTm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQpIHsKLQkJCQlyZXNvdXJjZSA9IG51bGw7Ci0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldEVjbGlwc2VSZXNvdXJjZSgpIHsgCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQotCQkJCUlQcm9qZWN0IGNvbnRhaW5lciA9IG51bGw7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2UgbW9kdWxlUmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpIGdldFRhcmdldCgpOwotCQkJCWlmIChtb2R1bGVSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCUlQYXRoIHNvdXJjZVBhdGggPSBtb2R1bGVSZXNvdXJjZS5nZXRTb3VyY2VQYXRoKCk7Ci0JCQkJCWlmIChtb2R1bGVSZXNvdXJjZS5nZXRPd25pbmdQcm9qZWN0KCkgIT0gbnVsbCkKLQkJCQkJCWNvbnRhaW5lciA9IG1vZHVsZVJlc291cmNlLmdldE93bmluZ1Byb2plY3QoKTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGFpbmVyID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChtb2R1bGVSZXNvdXJjZS5nZXRDb21wb25lbnQoKSk7Ci0JCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCXJlc291cmNlID0gY29udGFpbmVyLmZpbmRNZW1iZXIoc291cmNlUGF0aCk7IAotCQkJCQlpZihyZXNvdXJjZSA9PSBudWxsKQotCQkJCQkJcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoc291cmNlUGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IGFUeXBlKSB7Ci0JCXJldHVybiBBREFQVEVSX1RZUEUgPT0gYVR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSFJlZlRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0hSZWZUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYTAxNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSFJlZlRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUGF0aDsKLQotcHVibGljIGNsYXNzIEhSZWZUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwdWJsaWMgSFJlZlRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBlQ2xhc3MpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwdWJsaWMgSFJlZlRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIEhSZWZUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLAotCQkJRUNsYXNzIGVDbGFzcykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIGVDbGFzcyk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBIUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3JQYXRoIHBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIEhSZWZUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLAotCQkJVHJhbnNsYXRvclBhdGhbXSBwYXRocykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHBhdGhzKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIEhSZWZUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLAotCQkJaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgc3R5bGUpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBhVmFsdWUsIEVPYmplY3QgYW5Pd25lcikgewotCQlPYmplY3QgcmV0VmFsID0gbnVsbDsKLQkJaWYgKGFWYWx1ZSAhPSBudWxsKQotCQl7Ci0JCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlXb3JrYmVuY2hDb21wb25lbnQgZWFyQ29tcCA9IChXb3JrYmVuY2hDb21wb25lbnQpYW5Pd25lci5lQ29udGFpbmVyKCk7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGVhckNvbXApKTsKLQkJCQlBcnRpZmFjdEVkaXQgZWRpdCA9IChBcnRpZmFjdEVkaXQpdmlydHVhbENvbXAuZ2V0QWRhcHRlcihBcnRpZmFjdEVkaXQuY2xhc3MpOwotCQkJCWlmIChlZGl0ICE9IG51bGwpCi0JCQkJewotCQkJCQlFT2JqZWN0IGNvbnRlbnRNb2RlbFJvb3QgPSBlZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsgCi0JCQkJCWlmKCBjb250ZW50TW9kZWxSb290ICE9IG51bGwgKQotCQkJCQl7Ci0JCQkJCQlyZXMgPSBjb250ZW50TW9kZWxSb290LmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCQkJCXJldFZhbCA9IHJlcy5nZXRFT2JqZWN0KGFWYWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotLy8JCQlpZiAoKHJlcyAhPSBudWxsKSAmJiByZXMuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKSB7Ci0vLwkJCQlyZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzKTsKLS8vCQkJCXJlcy51bmxvYWQoKTsKLS8vCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXRWYWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCBhVmFsdWUsIEVPYmplY3QgYW5Pd25lcikgeyAKLQkJU3RyaW5nIGZyYWcgPSBudWxsOwotCQlSZXNvdXJjZSB0aGVSZXNvdXJjZSA9ICgoRU9iamVjdClhVmFsdWUpLmVSZXNvdXJjZSgpOwotCQlpZiAodGhlUmVzb3VyY2UgIT0gbnVsbCkKLQkJewotCQkJaWYgKHRoZVJlc291cmNlIGluc3RhbmNlb2YgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKQotCQkJCWZyYWcgPSB0aGVSZXNvdXJjZS5nZXRVUklGcmFnbWVudCgoRU9iamVjdClhVmFsdWUpOwotCQkJZWxzZQotCQkJCWZyYWcgPSBudWxsOwotCQl9Ci0JCWVsc2UKLQkJCWZyYWcgPSBFY29yZVV0aWwuZ2V0SUQoKEVPYmplY3QpYVZhbHVlKTsKLQkJcmV0dXJuIGZyYWc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JQXJ0aWZhY3RFZGl0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSUFydGlmYWN0RWRpdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1ZjQ3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JQXJ0aWZhY3RFZGl0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBcnRpZmFjdEVkaXRGYWN0b3J5IHsKLQkKLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCk7Ci0JCi0JcHVibGljIEFydGlmYWN0RWRpdCBjcmVhdGVBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSUNvbXBvbmVudEltcGxGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JQ29tcG9uZW50SW1wbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3M2IxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JQ29tcG9uZW50SW1wbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLQotcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50SW1wbEZhY3RvcnkgewotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGNyZWF0ZUNvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCk7Ci0JCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGNyZWF0ZUZvbGRlcihJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKTsKLQkKLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIGFyY2hpdmVMb2NhdGlvbiwgSVBhdGggYVJ1bnRpbWVQYXRoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSU1vZHVsZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSU1vZHVsZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM5OGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lNb2R1bGVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVDb25zdGFudHMgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9TRVRUSU5HUyA9ICAiLnNldHRpbmdzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTVBPTkVOVF9GSUxFX05BTUUgPSAiLmNvbXBvbmVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFBhdGggQ09NUE9ORU5UX0ZJTEVfUEFUSCA9IG5ldyBQYXRoKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXVFBNT0RVTEVfRklMRV9OQU1FID0gIi53dHBtb2R1bGVzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0aCBSMV9NT0RVTEVfTUVUQV9GSUxFX1BBVEggPSBuZXcgUGF0aCgiLnNldHRpbmdzLy5jb21wb25lbnQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0aCBXVFBNT0RVTEVfRklMRV9QQVRIID0gbmV3IFBhdGgoV1RQTU9EVUxFX0ZJTEVfTkFNRSk7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTU9EVUxFX1BMVUdfSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1PRFVMRV9OQVRVUkVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiOyAvLyROT04tTkxTLTEkCi0KLQkvL21vZHVsZVR5cGVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNUX1dFQl9NT0RVTEUgPSAianN0LndlYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfRUpCX01PRFVMRSA9ICJqc3QuZWpiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9VVElMSVRZX01PRFVMRSA9ICJqc3QudXRpbGl0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU1RfV0VCX01PRFVMRSA9ICJ3c3Qud2ViIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9FQVJfTU9EVUxFID0gImpzdC5lYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNUX0FQUENMSUVOVF9NT0RVTEUgPSAianN0LmFwcGNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfQ09OTkVDVE9SX01PRFVMRSA9ICJqc3QuY29ubmVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9KQVZBID0gImpzdC5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFUEVOREVOVF9NT0RVTEUgPSAiZGVwZW5kZW50IjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vUHJvcGVydHkgQ29uc3RhbnRzCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPSl9SRUxfSkFWQV9PVVRQVVRfUEFUSCA9ICJqYXZhLW91dHB1dC1wYXRoIjsgLy8kTk9OLU5MUy0xJCAKLSAgICAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05URVhUUk9PVCA9ICJjb250ZXh0LXJvb3QiOyAvLyROT04tTkxTLTEkCi0JIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSVBhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSVBhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODllZGQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lQYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUGF0aFByb3ZpZGVyIHsKLQkKLQlJUGF0aCBnZXRQYXRoKENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSk7Ci0JCi0JRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSVBhdGhUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JUGF0aFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxMmNiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JUGF0aFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUGF0aDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBJUGF0aFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCXB1YmxpYyBJUGF0aFRyYW5zbGF0b3IoU3RyaW5nIGFEb21QYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoYURvbVBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JcHVibGljIElQYXRoVHJhbnNsYXRvcihTdHJpbmcgYURvbVBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGggYVRyYW5zbGF0b3JQYXRoKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSwgbmV3IFRyYW5zbGF0b3JQYXRoW117YVRyYW5zbGF0b3JQYXRofSk7Ci0JfQotCQotCXB1YmxpYyBJUGF0aFRyYW5zbGF0b3IoU3RyaW5nIGFEb21QYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gdGhlVHJhbnNsYXRvclBhdGhzKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSwgdGhlVHJhbnNsYXRvclBhdGhzKTsKLQl9Ci0JCi0JcHVibGljIElQYXRoVHJhbnNsYXRvcihTdHJpbmcgYURvbVBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IGFTdHlsZU1hc2spIHsKLQkJc3VwZXIoYURvbVBhdGgsIGFGZWF0dXJlLCBhU3R5bGVNYXNrKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIGFWYWx1ZSwgRU9iamVjdCBhbk93bmVyKSB7IAotCQlyZXR1cm4gbmV3IFBhdGgoYVZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IGFWYWx1ZSwgRU9iamVjdCBhbk93bmVyKSB7IAotCQlpZihhVmFsdWUgaW5zdGFuY2VvZiBJUGF0aCkgCi0JCQlyZXR1cm4gKChJUGF0aClhVmFsdWUpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VmFsdWVUb1N0cmluZyhhVmFsdWUsIGFuT3duZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvTW9kdWxlQ29yZUVjbGlwc2VBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvTW9kdWxlQ29yZUVjbGlwc2VBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTNlNjA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL01vZHVsZUNvcmVFY2xpcHNlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZVN0cnVjdHVyYWxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlRWNsaXBzZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBNT0RVTEVfQ09SRV9DTEFTUyA9IFN0cnVjdHVyZUVkaXQuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgVklSVFVBTF9DT01QT05FTlRfQ0xBU1MgPSBJVmlydHVhbENvbXBvbmVudC5jbGFzczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsgTU9EVUxFX0NPUkVfQ0xBU1MsIFZJUlRVQUxfQ09NUE9ORU5UX0NMQVNTfTsKLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZSwgQ2xhc3MgYW5BZGFwdGVyVHlwZSkgewotCQlpZihhbkFkYXB0ZXJUeXBlID09IE1PRFVMRV9DT1JFX0NMQVNTKQotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlRWRpdCgoTW9kdWxlU3RydWN0dXJhbE1vZGVsKWFkYXB0YWJsZSk7Ci0JCWlmKGFuQWRhcHRlclR5cGUgPT0gVklSVFVBTF9DT01QT05FTlRfQ0xBU1MpCi0JCQlyZXR1cm4gZ2V0Q29tcG9uZW50KChJUmVzb3VyY2UpYWRhcHRhYmxlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0Q29tcG9uZW50KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gbnVsbDsKLQkJaWYgKCFyZXNvdXJjZS5leGlzdHMoKSkgcmV0dXJuIG51bGw7Ci0JCQkKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQlpZiAobW9kdWxlQ29yZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCVdvcmtiZW5jaENvbXBvbmVudFtdIGNvbXBzID0gbW9kdWxlQ29yZS5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCQkJaWYgKGNvbXBzLmxlbmd0aCA+IDApCi0JCQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJbW9kdWxlID0gbW9kdWxlQ29yZS5maW5kQ29tcG9uZW50KHJlc291cmNlLmdldEZ1bGxQYXRoKCksUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7CQotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbW9kdWxlID09IG51bGwgPyBudWxsIDogQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsgCi0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Nb2R1bGVDb3JlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL01vZHVsZUNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2UzOTVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL01vZHVsZUNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1vZHVsZUNvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAibW9kdWxlY29yZU5MUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIE1vZHVsZUNvcmVNZXNzYWdlcygpIHsKLQkJLy9kbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTW9kdWxlQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfUmVhZF9FeGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfV3JpdGVfRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvU291cmNlUGF0aFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Tb3VyY2VQYXRoUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjNGFiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Tb3VyY2VQYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VQYXRoUHJvdmlkZXIgaW1wbGVtZW50cyBJUGF0aFByb3ZpZGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgU291cmNlUGF0aFByb3ZpZGVyKCk7Ci0JCi0JcHJpdmF0ZSBTb3VyY2VQYXRoUHJvdmlkZXIoKSB7fSAKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51dGlsLklQYXRoUHJvdmlkZXIjZ2V0UGF0aChvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50KQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSkgewotCQlyZXR1cm4gYU1vZHVsZVJlc291cmNlLmdldFNvdXJjZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2VfU291cmNlUGF0aCgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1VSSVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1VSSVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3NDNmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9VUklUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JQYXRoOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFVSSVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCXB1YmxpYyBVUklUcmFuc2xhdG9yKFN0cmluZyBhRG9tUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCXB1YmxpYyBVUklUcmFuc2xhdG9yKFN0cmluZyBhRG9tUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBhVHJhbnNsYXRvclBhdGgpIHsKLQkJc3VwZXIoYURvbVBhdGgsIGFGZWF0dXJlLCBuZXcgVHJhbnNsYXRvclBhdGhbXXthVHJhbnNsYXRvclBhdGh9KTsKLQl9Ci0JCi0JcHVibGljIFVSSVRyYW5zbGF0b3IoU3RyaW5nIGFEb21QYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gdGhlVHJhbnNsYXRvclBhdGhzKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSwgdGhlVHJhbnNsYXRvclBhdGhzKTsKLQl9Ci0JCi0JcHVibGljIFVSSVRyYW5zbGF0b3IoU3RyaW5nIGFEb21QYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBhU3R5bGVNYXNrKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSwgYVN0eWxlTWFzayk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBhVmFsdWUsIEVPYmplY3QgYW5Pd25lcikgeyAKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoYVZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IGFWYWx1ZSwgRU9iamVjdCBhbk93bmVyKSB7IAotCQlpZihhVmFsdWUgaW5zdGFuY2VvZiBVUkkpIAotCQkJcmV0dXJuICgoVVJJKWFWYWx1ZSkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGFWYWx1ZSwgYW5Pd25lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9XVFBNb2R1bGVzVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvV1RQTW9kdWxlc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4YWY2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9XVFBNb2R1bGVzVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBXVFBNb2R1bGVzVHJhbnNsYXRvciBleHRlbmRzIFJvb3RUcmFuc2xhdG9yIGltcGxlbWVudHMgV1RQTW9kdWxlc1htbE1hcHBlckl7Ci0JcHVibGljIHN0YXRpYyBXVFBNb2R1bGVzVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBXVFBNb2R1bGVzVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRjb3JlUGFja2FnZSBNT0RVTEVfQ09SRV9QS0cgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBXVFBNb2R1bGVzVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoUFJPSkVDVF9NT0RVTEVTLCBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvamVjdENvbXBvbmVudHMoKSk7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCWNoaWxkcmVuID0gY3JlYXRlV1RQTW9kdWxlc1RyYW5zbGF0b3IoKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY3JlYXRlV1RQTW9kdWxlc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoUFJPSkVDVF9WRVJTSU9OLCBNT0RVTEVfQ09SRV9QS0cuZ2V0UHJvamVjdENvbXBvbmVudHNfVmVyc2lvbigpLCBET01fQVRUUklCVVRFKSwgCi0JCQkJY3JlYXRlV0JNb2R1bGVUcmFuc2xhdG9yKE1PRFVMRV9DT1JFX1BLRy5nZXRQcm9qZWN0Q29tcG9uZW50c19Db21wb25lbnRzKCkpCi0JCX07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlV0JNb2R1bGVUcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV09SS0JFTkNIX0NPTVBPTkVOVCwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkvL25ldyBUcmFuc2xhdG9yKEhBTkRMRSwgTU9EVUxFX0NPUkVfUEtHLmdldFdvcmtiZW5jaENvbXBvbmVudF9IYW5kbGUoKSwgRE9NX0FUVFJJQlVURSksIFJFTU9WRUQgU0lOQ0UgSEFORExFIFNIT1VMRCBOT1cgQkUgREVSSVZFRCAtTURFCi0JCQluZXcgVHJhbnNsYXRvcihSVU5USU1FX05BTUUsIE1PRFVMRV9DT1JFX1BLRy5nZXRXb3JrYmVuY2hDb21wb25lbnRfTmFtZSgpLCBET01fQVRUUklCVVRFKSwgCi0JCQljcmVhdGVNb2R1bGVUeXBlVHJhbnNsYXRvcihNT0RVTEVfQ09SRV9QS0cuZ2V0V29ya2JlbmNoQ29tcG9uZW50X0NvbXBvbmVudFR5cGUoKSksCi0JCQljcmVhdGVXQlJlc291cmNlVHJhbnNsYXRvcihNT0RVTEVfQ09SRV9QS0cuZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Jlc291cmNlcygpKSwKLQkJCWNyZWF0ZURlcGVuZGVudE1vZHVsZVRyYW5zbGF0b3IoTU9EVUxFX0NPUkVfUEtHLmdldFdvcmtiZW5jaENvbXBvbmVudF9SZWZlcmVuY2VkQ29tcG9uZW50cygpKSwKLQkJCW5ldyBJUGF0aFRyYW5zbGF0b3IoTUVUQV9SRVNPVVJDRVMsIE1PRFVMRV9DT1JFX1BLRy5nZXRXb3JrYmVuY2hDb21wb25lbnRfTWV0YWRhdGFSZXNvdXJjZXMoKSksCi0JCQljcmVhdGVQcm9wZXJ0aWVzVHJhbnNsYXRvcihNT0RVTEVfQ09SRV9QS0cuZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Byb3BlcnRpZXMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTW9kdWxlVHlwZVRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNT0RVTEVfVFlQRSwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7CQkJCi0JCQluZXcgVHJhbnNsYXRvcihDT01QT05FTlRfVFlQRV9JRCwgTU9EVUxFX0NPUkVfUEtHLmdldENvbXBvbmVudFR5cGVfQ29tcG9uZW50VHlwZUlkKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVUQV9SRVNPVVJDRVMsIE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRUeXBlX01ldGFkYXRhUmVzb3VyY2VzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09NUE9ORU5UX1RZUEVfVkVSU0lPTiwgTU9EVUxFX0NPUkVfUEtHLmdldENvbXBvbmVudFR5cGVfVmVyc2lvbigpKSwKLQkJCWNyZWF0ZVByb3BlcnRpZXNUcmFuc2xhdG9yKE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKSkKLQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQcm9wZXJ0aWVzVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUFJPUEVSVFksIGFmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoUFJPUEVSVFlfTkFNRSwgTU9EVUxFX0NPUkVfUEtHLmdldFByb3BlcnR5X05hbWUoKSwgRE9NX0FUVFJJQlVURSApLAotCQkJbmV3IFRyYW5zbGF0b3IoUFJPUEVSVFlfVkFMVUUsIE1PRFVMRV9DT1JFX1BLRy5nZXRQcm9wZXJ0eV9WYWx1ZSgpLCBET01fQVRUUklCVVRFICksCi0JCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkJCi0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRGVwZW5kZW50TW9kdWxlVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFRkVSRU5DRURfQ09NUE9ORU5ULCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsgCi0JCQluZXcgSVBhdGhUcmFuc2xhdG9yKFJVTlRJTUVfUEFUSCwgTU9EVUxFX0NPUkVfUEtHLmdldFJlZmVyZW5jZWRDb21wb25lbnRfUnVudGltZVBhdGgoKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVVJJVHJhbnNsYXRvcihIQU5ETEUsIE1PRFVMRV9DT1JFX1BLRy5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0hhbmRsZSgpLCBET01fQVRUUklCVVRFKSwKLQkJCW5ldyBIUmVmVHJhbnNsYXRvcihERVBfT0JKRUNULE1PRFVMRV9DT1JFX1BLRy5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEFSQ0hJVkVfTkFNRSwgTU9EVUxFX0NPUkVfUEtHLmdldFJlZmVyZW5jZWRDb21wb25lbnRfQXJjaGl2ZU5hbWUoKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgRGVwZW5kZW5jeVR5cGVUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVdCUmVzb3VyY2VUcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09NUE9ORU5UX1JFU09VUkNFLCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBJUGF0aFRyYW5zbGF0b3IoU09VUkNFX1BBVEgsIE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRSZXNvdXJjZV9Tb3VyY2VQYXRoKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IElQYXRoVHJhbnNsYXRvcihSVU5USU1FX1BBVEgsIE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRSZXNvdXJjZV9SdW50aW1lUGF0aCgpLCBET01fQVRUUklCVVRFKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFJFU09VUkNFX1RZUEUsIE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRSZXNvdXJjZV9SZXNvdXJjZVR5cGUoKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVHJhbnNsYXRvcihFWENMVVNJT05TLCBNT0RVTEVfQ09SRV9QS0cuZ2V0Q29tcG9uZW50UmVzb3VyY2VfRXhjbHVzaW9ucygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1dUUE1vZHVsZXNYbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9XVFBNb2R1bGVzWG1sTWFwcGVySS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWQ5ZGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1dUUE1vZHVsZXNYbWxNYXBwZXJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV1RQTW9kdWxlc1htbE1hcHBlckkgewotCVN0cmluZyBQUk9KRUNUX01PRFVMRVMgPSAicHJvamVjdC1tb2R1bGVzIjsvLyROT04tTkxTLTEkICAKLQlTdHJpbmcgV09SS0JFTkNIX0NPTVBPTkVOVCA9ICJ3Yi1tb2R1bGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVGRVJFTkNFRF9DT01QT05FTlQgPSAiZGVwZW5kZW50LW1vZHVsZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT01QT05FTlRfUkVTT1VSQ0UgPSAid2ItcmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1PRFVMRV9UWVBFID0gIm1vZHVsZS10eXBlIjsvLyROT04tTkxTLTEkIAotCVN0cmluZyBNRVRBX1JFU09VUkNFUyA9ICJtZXRhLXJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgQ09NUE9ORU5UX1RZUEVfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsvLyROT04tTkxTLTEkIAotCVN0cmluZyBIQU5ETEUgPSAiaGFuZGxlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFUF9PQkpFQ1QgPSAiZGVwZW5kZW50LW9iamVjdCI7Ly8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgT0JKRUNUUkVGID0gImhyZWYiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVQRU5ERU5DWV9UWVBFID0gImRlcGVuZGVuY3ktdHlwZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTT1VSQ0VfUEFUSCA9ICJzb3VyY2UtcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUlVOVElNRV9QQVRIID0gImRlcGxveS1wYXRoIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFWENMVVNJT05TID0gImV4Y2x1c2lvbnMiOy8vJE5PTi1OTFMtMSQgIAotCVN0cmluZyBDT01QT05FTlRfVFlQRV9JRCA9ICJtb2R1bGUtdHlwZS1pZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUlVOVElNRV9OQU1FID0gImRlcGxveS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJuYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBST1BFUlRZX1ZBTFVFID0gInZhbHVlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFU09VUkNFX1RZUEUgPSAicmVzb3VyY2UtdHlwZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBBUkNISVZFX05BTUU9ImFyY2hpdmVOYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBST0pFQ1RfVkVSU0lPTj0icHJvamVjdC12ZXJzaW9uIjsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1ppcEZpbGVFeHBvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvWmlwRmlsZUV4cG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGE1YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvWmlwRmlsZUV4cG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotLyoqCi0gKiBFeHBvcnRzIHJlc291cmNlcyB0byBhIC56aXAgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgWmlwRmlsZUV4cG9ydGVyIHsKLQlwcml2YXRlIFppcE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW07Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlQ29tcHJlc3Npb24gPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbXByZXNzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICogQHBhcmFtIGluY2x1ZGVNYW5pZmVzdEZpbGUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgWmlwRmlsZUV4cG9ydGVyKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBjb21wcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUGF0aCBkaXJlY3RvcnlQYXRoID0gbmV3IFBhdGgoZmlsZW5hbWUpOwotCQlkaXJlY3RvcnlQYXRoID0gKFBhdGgpIGRpcmVjdG9yeVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlGaWxlIG5ld1ppcEZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnlQYXRoLnRvU3RyaW5nKCkpOwotCQluZXdaaXBGaWxlLm1rZGlycygpOwotCQlvdXRwdXRTdHJlYW0gPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSk7Ci0JCXVzZUNvbXByZXNzaW9uID0gY29tcHJlc3M7Ci0JfQotCi0JLyoqCi0JICogRG8gYWxsIHJlcXVpcmVkIGNsZWFudXAgbm93IHRoYXQgd2UncmUgZmluaXNoZWQgd2l0aCB0aGUgY3VycmVudGx5LW9wZW4gLnppcAotCSAqIAotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmlzaGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFppcEVudHJ5IHdpdGggdGhlIHBhc3NlZCBwYXRobmFtZSBhbmQgY29udGVudHMsIGFuZCB3cml0ZSBpdCB0byB0aGUgY3VycmVudAotCSAqIGFyY2hpdmUKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29udGVudHMKLQkgKiAgICAgICAgICAgIGJ5dGVbXQotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlKFN0cmluZyBwYXRobmFtZSwgYnl0ZVtdIGNvbnRlbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlaaXBFbnRyeSBuZXdFbnRyeSA9IG5ldyBaaXBFbnRyeShwYXRobmFtZSk7Ci0KLQkJLy8gaWYgdGhlIGNvbnRlbnRzIGFyZSBiZWluZyBjb21wcmVzc2VkIHRoZW4gd2UgZ2V0IHRoZSBiZWxvdyBmb3IgZnJlZS4KLQkJaWYgKCF1c2VDb21wcmVzc2lvbikgewotCQkJbmV3RW50cnkuc2V0TWV0aG9kKFppcEVudHJ5LlNUT1JFRCk7Ci0JCQluZXdFbnRyeS5zZXRTaXplKGNvbnRlbnRzLmxlbmd0aCk7Ci0JCQlDUkMzMiBjaGVja3N1bUNhbGN1bGF0b3IgPSBuZXcgQ1JDMzIoKTsKLQkJCWNoZWNrc3VtQ2FsY3VsYXRvci51cGRhdGUoY29udGVudHMpOwotCQkJbmV3RW50cnkuc2V0Q3JjKGNoZWNrc3VtQ2FsY3VsYXRvci5nZXRWYWx1ZSgpKTsKLQkJfQotCi0JCW91dHB1dFN0cmVhbS5wdXROZXh0RW50cnkobmV3RW50cnkpOwotCQlvdXRwdXRTdHJlYW0ud3JpdGUoY29udGVudHMpOwotCQlvdXRwdXRTdHJlYW0uY2xvc2VFbnRyeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlRm9sZGVyKFN0cmluZyBkZXN0aW5hdGlvblBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghZGVzdGluYXRpb25QYXRoLmVuZHNXaXRoKCIvIikpCi0JCQlkZXN0aW5hdGlvblBhdGggPSBkZXN0aW5hdGlvblBhdGggKyAnLyc7Ci0JCVppcEVudHJ5IG5ld0VudHJ5ID0gbmV3IFppcEVudHJ5KGRlc3RpbmF0aW9uUGF0aCk7Ci0JCW91dHB1dFN0cmVhbS5wdXROZXh0RW50cnkobmV3RW50cnkpOwotCQlvdXRwdXRTdHJlYW0uY2xvc2VFbnRyeSgpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBwYXNzZWQgcmVzb3VyY2UgdG8gdGhlIGN1cnJlbnQgYXJjaGl2ZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUKLQkgKiBAcGFyYW0gZGVzdGluYXRpb25QYXRoCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKElGaWxlIHJlc291cmNlLCBTdHJpbmcgZGVzdGluYXRpb25QYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbnRlbnRTdHJlYW0gPSByZXNvdXJjZS5nZXRDb250ZW50cyhmYWxzZSk7Ci0JCQl3cml0ZShjb250ZW50U3RyZWFtLCBkZXN0aW5hdGlvblBhdGgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNvbnRlbnRTdHJlYW0gIT0gbnVsbCkKLQkJCQljb250ZW50U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtLCBTdHJpbmcgZGVzdGluYXRpb25QYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKLQotCQl0cnkgewotCQkJb3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJaW50IGNodW5rU2l6ZSA9IGNvbnRlbnRTdHJlYW0uYXZhaWxhYmxlKCk7Ci0JCQlieXRlW10gcmVhZEJ1ZmZlciA9IG5ldyBieXRlW2NodW5rU2l6ZV07Ci0JCQlpbnQgbiA9IGNvbnRlbnRTdHJlYW0ucmVhZChyZWFkQnVmZmVyKTsKLQotCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJb3V0cHV0LndyaXRlKHJlYWRCdWZmZXIpOwotCQkJCW4gPSBjb250ZW50U3RyZWFtLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAob3V0cHV0ICE9IG51bGwpCi0JCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCX0KLQotCQl3cml0ZShkZXN0aW5hdGlvblBhdGgsIG91dHB1dC50b0J5dGVBcnJheSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzkwNGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPm1vZHVsZWNvcmUgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+Ci0gICAgICAgIFRoZSBDb21wb25lbnRDb3JlIEFQSSBhbGxvd3MgY2xpZW50cyB0byB3b3JrIHdpdGggdGhlIFN0cnVjdHVyYWwgCi0gICAgICAgIE1ldGFtb2RlbHMgdGhhdCBkZWZpbmUgYWJzdHJhY3QgbW9kdWxlcyB3aXRoaW4gRWNsaXBzZSBwcm9qZWN0cy4gCi0gICAgICAgIFRoZXNlIG1ldGFtb2RlbHMgYXJlIGV4cG9zZWQgdGhyb3VnaCB0aGUgVmlydHVhbCBQYXRoIEFQSSBsYXllciAKLSAgICAgICAgKHNlZSA8YSBocmVmPSJDb21wb25lbnRDb3JlLmh0bWwiPkNvbXBvbmVudENvcmU8L2E+KS4gQ2xpZW50cyAKLSAgICAgICAgc2hvdWxkIGFsc28gcmV2aWV3IHRoZSA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzPC9iPgotICAgICAgICBwYWNrYWdlLgotCQk8L3A+Ci08YSBuYW1lPSJ0b3AiPjwvYT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotCQkJVGhlIGZvbGxvd2luZyBkb2N1bWVudCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGVzZSB0b3BpY3M6Ci0JCQk8dWw+Ci0JCQkJCi08bGk+Ci08YSBocmVmPSIjc3RydWN0dXJhbC1tZXRhbW9kZWwiPkNvbXBvbmVudENvcmUgTWV0YW1vZGVsIChDQ00pPC9hPiAKLQkJCQkJdXNlZCB0byB1bmRlcnN0YW5kIHdoaWNoIGZpbGVzIHNob3VsZCBvciBzaG91bGQgbm90IGJlIAotCQkJCQlpbmNsdWRlZCB3aXRoaW4gYSBtb2R1bGUuPC9saT4gCi0JCQkJCi08bGk+Ci08YSBocmVmPSIjY29uc3RyYWludHMiPkNvbnN0cmFpbnRzPC9hPiBlbmZvcmNlZCBieSB0aGUgCi0JCQkJCWRlc2lnbjwvbGk+IAotCQkJCQotPGxpPgotPGEgaHJlZj0iI21vZHVsZS1jb3JlLWV4YW1wbGVzIj5UaGUgQVBJIGVudHJ5LXBvaW50PC9hPgotPC9saT4KLQkJCQotPC91bD4KLQkJCi08L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08YSBuYW1lPSJzdHJ1Y3R1cmFsLW1ldGFtb2RlbCI+PC9hPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNSIgY2VsbHBhZGRpbmc9IjIiIGJvcmRlcj0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGJnY29sb3I9IiMwMDgwYzAiIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIyIj48Yj48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiIGNvbG9yPSIjZmZmZmZmIj5Db21wb25lbnRDb3JlIE1ldGFtb2RlbCAoQ0NNKTwvZm9udD48L2I+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxCUj4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAgICAgVGhlIENvbXBvbmVudENvcmUgTWV0YW1vZGVsIChDQ00pIGlzIGFuIEVNRiBtb2RlbCB0aGF0IGFsbG93cyAKLQkJCXRoZSB0b29saW5nIHRvIHVuZGVyc3RhbmQgbW9zdCBwcm9qZWN0IHN0cnVjdHVyZXMuIEVhY2ggcHJvamVjdCAKLQkJCWhhcyBhIHNpbmdsZSBDQ00gd2hpY2ggaXMgc3RvcmVkIHVuZGVyIHRoZSBwcm9qZWN0IHJvb3QgbmFtZWQKLSAgICAgICAgICAgIDxJPi53dHBtb2R1bGVzPC9JPgotICAgICAgICAgICAgLiBUaGUgWE1MIGZvcm1hdCBpcyBkZWZpbmVkIGJ5IHRoZSAKLSAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L2NvbXBvbmVudENvcmUueHNkIj5Db21wb25lbnRDb3JlIHNjaGVtYTwvYT4uCi0gICAgICAgICAgICBUaGUgZm9sbG93aW5nIGRpYWdyYW0gaXMgYSBVTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIAotCQkJQ29tcG9uZW50Q29yZSBNZXRhbW9kZWwuIFRoaXMgaW5mb3JtYXRpb24gaXMgcHVibGlzaGVkIGZvciAKLQkJCXBvdGVudGlhbCBjb250cmlidXRvcnMgb2YgZWRpdG9ycywgYnV0IHRoZSBFTUYgbW9kZWwgaXMgCi0JCQlub3QgZXhwb3NlZCBkaXJlY3RseSBhcyBBUEksIGFuZCBjb3VsZCBjaGFuZ2UgaW4gdmlldyBvZiAKLQkJCWNoYW5nZXMgZm9yIFdUUCAxLjEuCi0JCTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy9jb21wb25lbnRjb3JlX21vZGVsLmpwZyI+PC9wPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpPkZpZ3VyZSAxOiBUaGUgQ29tcG9uZW50IENvcmUgTWV0YW1vZGVsPC9pPgotPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBFYWNoIGxvZ2ljYWwgY29tcG9uZW50IGNvbnRhaW5lZCBpbiB0aGUgcHJvamVjdCBpcyByZXByZXNlbnRlZCBieSBhCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGVsZW1lbnQuIFRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGRlZmluZXMgCi0gICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBjb21wb25lbnQsIHRoZSByZXNvdXJjZXMgY29uc3VtZWQgYnkgdGhlIAotICAgICAgICAgICAgbW9kdWxlIGZyb20gdGhlIHByb2plY3QsIGFuZCB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnRzLiBUaGUgCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGlzIHZlcnkgZ2VuZXJpYywgYW5kIGFzIG1vZGVsZWQsIGRvZXMgCi0gICAgICAgICAgICBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBvbmx5IEoyRUUgYXJ0aWZhY3RzLgotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLSAgICAgICAgICAgIFRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGhhcyBhCi0gICAgICAgICAgICA8aT5uYW1lPC9pPgotICAgICAgICAgICAgLCB3aGljaCBpcyB0aGUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHRoZSBydW50aW1lIGZvcm0gb2YgdGhlCi0gICAgICAgICAgICBjb21wb25lbnQgaXMgY29uc3RydWN0ZWQuIEZvciBhIHdlYiBhcHBsaWNhdGlvbiwgdGhlCi0gICAgICAgICAgICA8aT5uYW1lPC9pPgotICAgICAgICAgICAgbWlnaHQgYmUgIk15V2ViQXBwbGljYXRpb24iLgotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLSAgICAgICAgICAgIFRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IG1heSBiZSB1bmlxdWVseSByZWZlcmVuY2VkIGJ5IGEgVVJJLiBUaGUgCi0gICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgVVJJIHRvIGFueSBjb21wb25lbnQgbXVzdCBiZWdpbiB3aXRoIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIHByb3RvY29sICgiY29tcG9uZW50OiIpLCBzcGVjaWZ5IGEgc3VicHJvdG9jb2wgKCJyZXNvdXJjZXxjbGFzc3BhdGgiKSBhbmQKLSAgICAgICAgICAgIHRoZW4gYSBwYXRoIHRvIHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudC4gQSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IHdpdGggdGhlCi0gICAgICAgICAgICBuYW1lICJNeVdlYkFwcGxpY2F0aW9uIiBkZWZpbmVkIGluIGEgcHJvamVjdCBuYW1lZAotICAgICAgICAgICAgIk15V2ViTW9kdWxlc1Byb2plY3QiIHdvdWxkIGJlIHJlZmVyZW5jZWQgYnkgdGhlIGZvbGxvd2luZyBVUkk6Ci0gICAgICAgICAgICAiY29tcG9uZW50Oi9yZXNvdXJjZS9NeVdlYk1vZHVsZXNQcm9qZWN0L015V2ViQXBwbGljYXRpb24iLiBBcyBhIGZ1dHVyZSAKLSAgICAgICAgICAgIGV4dGVuc2lvbiwgYSBjb21wb25lbnQgcmVmZXJlbmNlZCBvbiB0aGUgY2xhc3NwYXRoIG9mIGEgcHJvamVjdCAocGVyaGFwcyAKLSAgICAgICAgICAgIGEgVXRpbGl0eSBKYXIgb3IgYW4gRUpCIENsaWVudCBKYXIpLCB0aGUgVVJJIG1pZ2h0IGJlIHNvbWV0aGluZyBsaWtlOgotICAgICAgICAgICAgImNvbXBvbmVudDovY2xhc3NwYXRoL015V2ViTW9kdWxlc1Byb2plY3QvQ3VzdG9tZXJFSkJDbGllbnQuamFyIi4gCi0gICAgICAgIDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gaGFzIGEgPGI+Q29tcG9uZW50VHlwZTwvYj4uIFRoZSAKLSAgICAgICAgICAgIDxiPkNvbXBvbmVudFR5cGU8L2I+IGRlZmluZXMgYSA8aT5jb21wb25lbnRUeXBlSWQ8L2k+Ci0gICAgICAgICAgICAsIHdoaWNoIGluZGljYXRlcyB0aGUgc3BlY2lmaWMga2luZCBvZiBjb21wb25lbnQuIFRoZSBXZWIgVG9vbHMgUGxhdGZvcm0KLSAgICAgICAgICAgIHVzZXMgdGhlIDxpPmNvbXBvbmVudFR5cGVJZDwvaT4KLSAgICAgICAgICAgIHRvIGRldGVybWluZSBob3cgdG8gd29yayB3aXRoIHRoZSBjb250ZW50IGNvbXBvbmVudCBvZiB0aGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPgotICAgICAgICAgICAgYW5kIHByZXBhcmUgdGhlIGNvbXBvbmVudCBmb3IgZGVwbG95bWVudC4gVGhlIDxiPkNvbXBvbmVudFR5cGU8L2I+IG1heSAKLSAgICAgICAgICAgIGFsc28gZGVmaW5lIHRoZSBydW50aW1lLXBhdGhzIG9mIHNwZWNpYWwgbWV0YWRhdGEgcmVzb3VyY2VzIHdoaWNoIGFyZSAKLSAgICAgICAgICAgIGltcG9ydGFudCB0byB0aGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPi4gIk1ldGFkYXRhIiByZWZlcnMgdG8gcmVzb3VyY2VzIAotICAgICAgICAgICAgd2hpY2ggZXhwbGFpbiB0aGUgY29udGVudCBkZXRhaWxzIG9mIHRoZSBzcGVjaWZpYyBtb2R1bGVzLiBBbiBleGFtcGxlIG9mIAotICAgICAgICAgICAgc3VjaCBhIGZpbGUgd291bGQgYmUgdGhlICJXRUItSU5GL3dlYi54bWwiIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgCi0gICAgICAgICAgICBXZWIgQXBwbGljYXRpb25zLgotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLSAgICAgICAgICAgIFRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGNvbnRhaW5zIGEgbGlzdCBvZiBDb21wb25lbnRSZXNvdXJjZXMuIEVhY2gKLSAgICAgICAgICAgIDxiPkNvbXBvbmVudFJlc291cmNlPC9iPiBoYXMgInNvdXJjZVBhdGgiIGFuZCBhIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgICJydW50aW1lUGF0aCIuIFRoZSAic291cmNlUGF0aCIgY2FuIHJlZmVyZW5jZSBlaXRoZXIgYSBmaWxlIG9yIGZvbGRlciwKLSAgICAgICAgICAgIGJ1dCB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZSBtdXN0IGJlIGNvbnRhaW5lZCBpbiB0aGUgc2FtZSBwcm9qZWN0IGFzIHRoZQotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBkZWZpbml0aW9uLiBUaGUgInJ1bnRpbWVQYXRoIiBzcGVjaWZpZXMgYSBsb2NhdGlvbgotICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGRlcGxveWVkIHN0cnVjdHVyZSBvZiB0aGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiB3aGVyZSB0aGUKLSAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoZSByZWZlcmVuY2VkIHJlc291cmNlIHdpbGwgYmUgcmVwcmVzZW50ZWQgd2hlbiB0aGUgbW9kdWxlIGlzCi0gICAgICAgICAgICBwcmVwYXJlZCBmb3IgcnVudGltZS4KLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBjb250YWlucyBhIGxpc3Qgb2YgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj5zLiAKLSAgICAgICAgICAgIEVhY2ggPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj4gcHJvdmlkZXMgYSBoYW5kbGUgdGhhdCBtdXN0IHJlc29sdmUgdG8gYSAKLSAgICAgICAgICAgIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4sIGEgcnVudGltZVBhdGggdGhhdCBkZWZpbmVzIHdoZXJlIHRoZSBjb25zdHJ1Y3RlZCAKLSAgICAgICAgICAgIGNvbXBvbmVudCB3aWxsIGJlIHBsYWNlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJ1bnRpbWUgCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LCBhbmQgYSA8Yj5EZXBlbmRlbmN5VHlwZTwvYj4KLSAgICAgICAgICAgIHRoYXQgY2FuIGJlIGVpdGhlciAiY29uc3VtZSIgb3IgInVzZSIgdG8gaW5kaWNhdGUgaG93IHRoZSBjb250ZW50cyBvZgotICAgICAgICAgICAgdGhhdCA8Yj5SZWZlcmVuY2VkQ29tcG9uZW50PC9iPiBzaG91bGQgYmUgYWJzb3JiZWQgYnkgdGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4uCi0gICAgICAgICAgICA8Yj5SZWZlcmVuY2VkQ29tcG9uZW50PC9iPnMgbWF5IHJlZmVyZW5jZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+cyBpbiAKLSAgICAgICAgICAgIG90aGVyIHByb2plY3RzIGFuZCBvbiBjdXJyZW50IHByb2plY3QncyBjbGFzc3BhdGggKE5vdCB5ZXQgaW1wbGVtZW50ZWQpLiAKLSAgICAgICAgICAgIFRoZSA8Yj5EZXBlbmRlbmN5VHlwZTwvYj4gd2lsbCBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udGVudHMgb2YKLSAgICAgICAgICAgIHRoZSA8Yj5SZWZlcmVuY2VkQ29tcG9uZW50PC9iPiBhcmUgYWJzb3JiZWQgYXMtaXMgb3IgYXJjaGl2ZWQgaW50byBhICoue3d8anxlfWFyCi0gICAgICAgICAgICBmaWxlLgotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLSAgICAgICAgICAgIFRoZSA8Yj5Qcm9qZWN0Q29tcG9uZW50czwvYj4gb2JqZWN0IHByb3ZpZGVzIGEgcm9vdCBjb250YWluZXIgZm9yIGFsbAotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPnMgZGVmaW5lZCBpbiBhIGdpdmVuIHByb2plY3QuCi0gICAgICAgIDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAgICAgCi08Yj5Db21wb25lbnRDb3JlPC9iPiBwcm92aWRlcyBhIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwgZm9yCi0gICAgICAgICAgICBjbGllbnRzLiBTdGF0aWMgbWV0aG9kcwotICAgICAgICAgICAgPGNvZGU+TW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yUmVhZCgpPC9jb2RlPgotICAgICAgICAgICAgYW5kCi0gICAgICAgICAgICA8Y29kZT5Nb2R1bGVDb3JlLmdldE1vZHVsZUNvcmVGb3JXcml0ZSgpPC9jb2RlPgotICAgICAgICAgICAgbWF5IGJlIHVzZWQgdG8gYWNxdWlyZSBhbiBNb2R1bGVDb3JlIGFkYXB0ZXIsIGFuZCBjbGllbnRzIGFyZSByZXNwb25zaWJsZQotICAgICAgICAgICAgZm9yIGludm9raW5nCi0gICAgICAgICAgICA8Y29kZT5kaXNwb3NlKCk8L2NvZGU+Ci0gICAgICAgICAgICB3aGVuZXZlciB0aGV5IGFyZSBmaW5pc2hlZCB1c2luZyB0aGUgbW9kZWwuCi0gICAgICAgIDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxhIGhyZWY9IiN0b3AiPnRvcDwvYT48YSBuYW1lPSJjb25zdHJhaW50cyI+PC9hPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNSIgY2VsbHBhZGRpbmc9IjIiIGJvcmRlcj0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGJnY29sb3I9IiMwMDgwYzAiIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIyIj48Yj48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiIGNvbG9yPSIjZmZmZmZmIj5Db25zdHJhaW50cyBlbmZvcmNlZCBieSB0aGUgQ0NNPC9mb250PjwvYj48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFyZSBlbmZvcmNlZCBieSB0aGUgbW9kZWw6Ci0gICAgICAgICAgICA8b2w+Ci0gICAgICAgICAgICAgICAgCi08bGk+Ci0gICAgICAgICAgICAgICAgICAgIAotPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgc29sdXRpb24gd2lsbCBub3QgY2hlY2sgZGVwZW5kZW5jaWVzIGZvciBjb21wb25lbnRzIHRoYXQgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWQgaW4gdGhlIHNhbWUgcHJvamVjdC4gVG8gZ2V0IHRoZSBmdWxsIGJlbmVmaXRzIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlci1jb21wb25lbnQgZGVwZW5kZW5jeSBjaGVja2luZywgY29tcG9uZW50cyBtdXN0IGJlIHNlcGFyYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgaW50byBkaWZmZXJlbnQgcHJvamVjdHMuIFdlIGRvIG5vdCBoYXZlIHRoZSBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhpYmlsaXR5IGluIGNvbnN0cnVjdGluZyBhbmQgc2NvcGluZyBjbGFzc3BhdGhzIG9uIGEgbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgZ3JhbnVsYXIgdGhhbiB0aGUgcHJvamVjdCBsZXZlbCwgd2hpY2ggd291bGQgYmUgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eS4KLSAgICAgICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICAgIAotPC9saT4KLSAgICAgICAgICAgICAgICAKLTxsaT4KLSAgICAgICAgICAgICAgICAgICAgCi08cD4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzb2x1dGlvbiB3aWxsIG5vdCBhbGxvdyBhIHNpbmdsZSBjb21wb25lbnQgdG8gc3BhbiBtb3JlIHRoYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBwcm9qZWN0LiBXaXRoaW4gdGhhdCBwcm9qZWN0LCB3ZSB3aWxsIGhhdmUgZmFpcmx5IGJyb2FkCi0gICAgICAgICAgICAgICAgICAgICAgICBmbGV4aWJpbGl0eSB0byBzcGVjaWZ5IHdoaWNoIHJlc291cmNlcyBtYXAgdG8gd2hpY2ggY29tcG9uZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVhY2ggY29tcG9uZW50IHdpdGhpbiBhIHByb2plY3QgbXVzdCBoYXZlIGl0cyBvd24gc291cmNlIGZvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBhIGNvbXBvbmVudCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIHNvdXJjZSBmb2xkZXIuIEVhY2gKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBmb2xkZXIgbWF5IGJlIGNvbnRhaW5lZCBieSBhdCBtb3N0IG9uZSBjb21wb25lbnQuIENvbXBvbmVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heSByZWZlcmVuY2UgZGVwZW5kZW50IGNvbXBvbmVudHMgaW4gb3RoZXIgcHJvamVjdHMgKHNvIGEgV2ViCi0gICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbiBtYXkgcmVmZXJlbmNlIGEgV2ViIExpYnJhcnkgb3V0c2lkZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgV2ViIEFwcGxpY2F0aW9uKS4KLSAgICAgICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICAgIAotPC9saT4KLSAgICAgICAgICAgICAgICAKLTxsaT4KLSAgICAgICAgICAgICAgICAgICAgCi08cD4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzb2x1dGlvbiB3aWxsIG5vdCBhbGxvdyBtb3JlIHRoYW4gb25lIHNlcnZlciB0YXJnZXQgcGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgKGFuZCByZWFsbHkgcGVyLXByb2plY3QpIGF0IGEgdGltZS4gVGhlIGFiaWxpdHkgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCB0aGlzIHNlcnZlciB0YXJnZXQgKHZpYSBzb21lIGFjdGlvbiBvciBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZykgd2lsbCBjb250aW51ZSB0byBiZSBwb3NzaWJsZS4gVXNlcnMgdGhhdCBuZWVkIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eSB0byBkZXZlbG9wIGZvciBtdWx0aXBsZSBzZXJ2ZXIgdGFyZ2V0cyB3aWxsIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1hbnVhbGx5IHN3aXRjaCBhbmQgdGVzdCBhcyBuZWNlc3NhcnkuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICAKLTwvbGk+Ci0gICAgICAgICAgICAgICAgCi08bGk+Ci0gICAgICAgICAgICAgICAgICAgIAotPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFYWNoIGNvbXBvbmVudCBpbiBhIHByb2plY3QgbWF5IGhhdmUgaXRzIG93biBvdXRwdXQgZm9sZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgYXV0b21hdGljYWxseSBjb25zdHJ1Y3RlZCBmb3IgaXQuIFRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSB3aWxsIG1hdGNoIHRoZSBKMkVFIHNwZWNpZmljYXRpb24gb3V0cHV0IHN0cnVjdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZm9yIHRoZSBjb21wb25lbnQgdHlwZSAoZm9yIEoyRUUgbW9kdWxlcykuIEEgbmV3Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyIHdpbGwgaGFuZGxlIHRoaXMgcmVzcG9uc2liaWxpdHkgYW5kIHdvcmsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvb3BlcmF0aXZlbHkgd2l0aCB0aGUgSmF2YSBidWlsZGVyIHRvIGNvbnN0cnVjdCBhCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3lhYmxlLCBvbi1kaXNrIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2R1bGUgc3RydWN0dXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGZvbGxvdyB0aGlzIHBhdHRlcm4sIGJ1dCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgdG8gdmFyeSB0aGlzIGJlaGF2aW9yLgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG5lY2Vzc2l0eSBmb3IgdGhpcyBvbi1kaXNrIHN0cnVjdHVyZSB0byBtYXRjaCBhCi0gICAgICAgICAgICAgICAgICAgICAgICBKMkVFLWNvbXBsaWFudCBsYXlvdXQgaXMgbW90aXZhdGVkIGJ5IHRoZSByZXF1aXJlbWVudCB0byBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbi13b3JrYmVuY2ggdGVzdGluZywgc28gdGhhdCB1c2VycyB3aWxsIG5vdCBoYXZlIHRvIGRlYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBkZXBsb3llciBhY3R1YWxseSBjb25zdHJ1Y3RpbmcgYSBkZXBsb3lhYmxlIG1vZHVsZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nIGl0IG9mZiB0byBhIHNlcnZlciB0byB0ZXN0IHRoZWlyIGNvZGUuIFRoaXMgYXBwcm9hY2gKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNvbnNpc3RlbnQgd2l0aCBleGlzdGluZyBBbnQtYmFzZWQgYXBwcm9hY2hlcyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uIFNlcnZlcnMgd2hpY2ggY2FuIHJ1biBpbiBhICJkZWJ1ZyIgbW9kZSBvbiBkaXNrLgotICAgICAgICAgICAgICAgICAgICAgICAgT3VyIHZhbHVlLWFkZCB3aWxsIGJlIGdyZWF0ZXIgYXV0b21hdGlvbiBhbmQgaW50ZWdyYXRpb24gd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmtiZW5jaCAtLSBwYXJ0aWN1bGFybHkgZm9yIGluY3JlbWVudGFsIGJhc2VkIHN1cHBvcnQuCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3BlY2lhbGl6ZWQgbW9kdWxlIGJ1aWxkZXIgd291bGQgbm90IGJlIG5lY2Vzc2FyeSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSB3YXMgYWxyZWFkeSBpbiB0aGUgYXBwcm9wcmlhdGUgSjJFRSBzcGVjaWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGlhbnQgc3RydWN0dXJlLiBUaGUgZGVmYXVsdCBjcmVhdGlvbiB3aWxsIHN0aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvdXJhZ2UgYSBzaW5nbGUgbW9kdWxlIHBlciBwcm9qZWN0LCB3aGljaCBjb25mb3JtcyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3QgSjJFRSBzdHJ1Y3R1cmUuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICAKLTwvbGk+Ci0gICAgICAgICAgICAgICAgCi08bGk+Ci0gICAgICAgICAgICAgICAgICAgIAotPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRzIHdpbGwgYmUgZGVzY3JpYmVkIHVzaW5nIGEgc2ltcGxlIFhNTCBmb3JtYXQsIGFuZCBlYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0IHdpbGwgY29udGFpbiBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIDxJPi53dHBtb2R1bGVzPC9JPgotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB0aGF0IHdpbGwgZGVzY3JpYmUgYWxsIG9mIHRoZSBjb21wb25lbnRzIGZvciB0aGF0IHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbGV2ZWwgb2YgdG9vbGluZyB0byBoZWxwIHVzZXJzIGNyZWF0ZSB0aGVzZSBmaWxlcyBpcyB5ZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGRldGVybWluZWQgZm9yIFdUUCBNNC4gVGhpcyB3b3VsZCBiZSBhIGdyZWF0IGFyZWEgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBpbnRlcmVzdGVkIGRldmVsb3BlcnMgdG8gc3VnZ2VzdCBhbmQgcHJvdmlkZSB0b29saW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBhIFdpemFyZCBvciBFZGl0b3IpIHRvIGNyZWF0ZSB0aGVzZSBmaWxlcyBmcm9tIGV4aXN0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzLiBBIHNjaGVtYSBpcyBwcm92aWRlZCB0byBtYWtlIGl0IGVhc2llciBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVycyB0aGF0IHdhbnQgdG8gYnVpbGQgdGhlaXIgb3duCi0gICAgICAgICAgICAgICAgICAgICAgICA8ST4ud3RwbW9kdWxlczwvST4KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGhhbmQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGNvbnRlbnQgYXNzaXN0IGluIHRoZSBYTUwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci4KLSAgICAgICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICAgIAotPC9saT4KLSAgICAgICAgICAgIAotPC9vbD4KLSAgICAgICAgCi08L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08YSBocmVmPSIjdG9wIj50b3A8L2E+PGEgbmFtZT0ibW9kdWxlLWNvcmUtZXhhbXBsZXMiPjwvYT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjUiIGNlbGxwYWRkaW5nPSIyIiBib3JkZXI9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjMDA4MGMwIiBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMiI+PGI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iI2ZmZmZmZiI+Q29tcG9uZW50Q29yZSBBUEk6IFdvcmtpbmcgd2l0aCB0aGUgbWV0YW1vZGVsPC9mb250PjwvYj48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPEJSPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0JCQlDb21wb25lbnRDb3JlIHVzZXMgYSBoYW5kbGUgYmFzZWQgbW9kZWwgbXVjaCBsaWtlIHRoZSBleGlzdGluZyBQbGF0Zm9ybSAKLQkJCVJlc291cmNlIG1vZGVsLiBUaGUgQ29tcG9uZW50Q29yZSBmYWNhZGUgaXMgbm90IHRpZWQgdG8gYW55IHByb2plY3QsIGFuZCAKLQkJCXRoZSBoYW5kbGVzIHRoYXQgaXQgcmV0dXJucyBtYXkgb3IgbWF5IG5vdCBleGlzdC4gVGhlIGNvbXBsZXhpdHkgb2YgCi0JCQltYW5hZ2luZyB0aGUgdW5kZXJseWluZyBFTUYgbW9kZWwgaXMgaGFuZGxlZCB1bmRlciB0aGUgY292ZXIgZm9yIHVzZXJzLiAKLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEwIj4KLTx0cj4KLTx0ZD4KLTxwPgotPGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L2NvbXBvbmVudGNvcmVfcGFja2FnZS5qcGciPjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPHA+Ci08aT5GaWd1cmUgMjogVGhlIENvbXBvbmVudENvcmUgQVBJPC9pPgotPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjVjMDA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+bW9kdWxlY29yZSBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhlIENvbXBvbmVudENvcmUgQVBJIGFsbG93cyBjbGllbnRzIHRvIHdvcmsgd2l0aCB0aGUgU3RydWN0dXJhbCAKLSAgICAgICAgTWV0YW1vZGVscyB0aGF0IGRlZmluZSBhYnN0cmFjdCBtb2R1bGVzIHdpdGhpbiBFY2xpcHNlIHByb2plY3RzLiAKLSAgICAgICAgVGhlc2UgbWV0YW1vZGVscyBhcmUgZXhwb3NlZCB0aHJvdWdoIHRoZSBWaXJ0dWFsIFBhdGggQVBJIGxheWVyIAotICAgICAgICAoc2VlIDxhIGhyZWY9IkNvbXBvbmVudENvcmUuaHRtbCI+Q29tcG9uZW50Q29yZTwvYT4pLiBDbGllbnRzIAotICAgICAgICBzaG91bGQgYWxzbyByZXZpZXcgdGhlIDxiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXM8L2I+Ci0gICAgICAgIHBhY2thZ2UuCi0JCTwvYWJzdHJhY3Q+Ci0KLQkJPGEgbmFtZT0idG9wIi8+Ci0JCTxwPgotCQkJVGhlIGZvbGxvd2luZyBkb2N1bWVudCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGVzZSB0b3BpY3M6Ci0JCQk8dWw+Ci0JCQkJPGxpPjxhIGhyZWY9IiNzdHJ1Y3R1cmFsLW1ldGFtb2RlbCI+Q29tcG9uZW50Q29yZSBNZXRhbW9kZWwgKENDTSk8L2E+IAotCQkJCQl1c2VkIHRvIHVuZGVyc3RhbmQgd2hpY2ggZmlsZXMgc2hvdWxkIG9yIHNob3VsZCBub3QgYmUgCi0JCQkJCWluY2x1ZGVkIHdpdGhpbiBhIG1vZHVsZS48L2xpPiAKLQkJCQk8bGk+PGEgaHJlZj0iI2NvbnN0cmFpbnRzIj5Db25zdHJhaW50czwvYT4gZW5mb3JjZWQgYnkgdGhlIAotCQkJCQlkZXNpZ248L2xpPiAKLQkJCQk8bGk+PGEgaHJlZj0iI21vZHVsZS1jb3JlLWV4YW1wbGVzIj5UaGUgQVBJIGVudHJ5LXBvaW50PC9hPjwvbGk+Ci0JCQk8L3VsPgotCQk8L3A+Ci0JCTxhIG5hbWU9InN0cnVjdHVyYWwtbWV0YW1vZGVsIi8+Ci0gICAgICAgIDxoMj5Db21wb25lbnRDb3JlIE1ldGFtb2RlbCAoQ0NNKTwvaDI+Ci0gICAgICAgIDxCUiAvPiAKLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBUaGUgQ29tcG9uZW50Q29yZSBNZXRhbW9kZWwgKENDTSkgaXMgYW4gRU1GIG1vZGVsIHRoYXQgYWxsb3dzIAotCQkJdGhlIHRvb2xpbmcgdG8gdW5kZXJzdGFuZCBtb3N0IHByb2plY3Qgc3RydWN0dXJlcy4gRWFjaCBwcm9qZWN0IAotCQkJaGFzIGEgc2luZ2xlIENDTSB3aGljaCBpcyBzdG9yZWQgdW5kZXIgdGhlIHByb2plY3Qgcm9vdCBuYW1lZAotICAgICAgICAgICAgPEk+Lnd0cG1vZHVsZXM8L0k+Ci0gICAgICAgICAgICAuIFRoZSBYTUwgZm9ybWF0IGlzIGRlZmluZWQgYnkgdGhlIAotICAgICAgICAgICAgPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXcvY29tcG9uZW50Q29yZS54c2QiPkNvbXBvbmVudENvcmUgc2NoZW1hPC9hPi4KLSAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBpcyBhIFVNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgCi0JCQlDb21wb25lbnRDb3JlIE1ldGFtb2RlbC4gVGhpcyBpbmZvcm1hdGlvbiBpcyBwdWJsaXNoZWQgZm9yIAotCQkJcG90ZW50aWFsIGNvbnRyaWJ1dG9ycyBvZiBlZGl0b3JzLCBidXQgdGhlIEVNRiBtb2RlbCBpcyAKLQkJCW5vdCBleHBvc2VkIGRpcmVjdGx5IGFzIEFQSSwgYW5kIGNvdWxkIGNoYW5nZSBpbiB2aWV3IG9mIAotCQkJY2hhbmdlcyBmb3IgV1RQIDEuMS4KLQkJPC9wPgkgIAotCQk8aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXcvY29tcG9uZW50Y29yZV9tb2RlbC5qcGciIGNhcHRpb249IlRoZSBDb21wb25lbnQgQ29yZSBNZXRhbW9kZWwiIC8+IAotICAgICAgICA8cD4KLSAgICAgICAgICAgIEVhY2ggbG9naWNhbCBjb21wb25lbnQgY29udGFpbmVkIGluIHRoZSBwcm9qZWN0IGlzIHJlcHJlc2VudGVkIGJ5IGEKLSAgICAgICAgICAgIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gZWxlbWVudC4gVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gZGVmaW5lcyAKLSAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGNvbXBvbmVudCwgdGhlIHJlc291cmNlcyBjb25zdW1lZCBieSB0aGUgCi0gICAgICAgICAgICBtb2R1bGUgZnJvbSB0aGUgcHJvamVjdCwgYW5kIHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudHMuIFRoZSAKLSAgICAgICAgICAgIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gaXMgdmVyeSBnZW5lcmljLCBhbmQgYXMgbW9kZWxlZCwgZG9lcyAKLSAgICAgICAgICAgIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIG9ubHkgSjJFRSBhcnRpZmFjdHMuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBoYXMgYQotICAgICAgICAgICAgPGk+bmFtZTwvaT4KLSAgICAgICAgICAgICwgd2hpY2ggaXMgdGhlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgcnVudGltZSBmb3JtIG9mIHRoZQotICAgICAgICAgICAgY29tcG9uZW50IGlzIGNvbnN0cnVjdGVkLiBGb3IgYSB3ZWIgYXBwbGljYXRpb24sIHRoZQotICAgICAgICAgICAgPGk+bmFtZTwvaT4KLSAgICAgICAgICAgIG1pZ2h0IGJlICJNeVdlYkFwcGxpY2F0aW9uIi4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLSAgICAgICAgICAgIFRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IG1heSBiZSB1bmlxdWVseSByZWZlcmVuY2VkIGJ5IGEgVVJJLiBUaGUgCi0gICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgVVJJIHRvIGFueSBjb21wb25lbnQgbXVzdCBiZWdpbiB3aXRoIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIHByb3RvY29sICgiY29tcG9uZW50OiIpLCBzcGVjaWZ5IGEgc3VicHJvdG9jb2wgKCJyZXNvdXJjZXxjbGFzc3BhdGgiKSBhbmQKLSAgICAgICAgICAgIHRoZW4gYSBwYXRoIHRvIHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudC4gQSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IHdpdGggdGhlCi0gICAgICAgICAgICBuYW1lICJNeVdlYkFwcGxpY2F0aW9uIiBkZWZpbmVkIGluIGEgcHJvamVjdCBuYW1lZAotICAgICAgICAgICAgIk15V2ViTW9kdWxlc1Byb2plY3QiIHdvdWxkIGJlIHJlZmVyZW5jZWQgYnkgdGhlIGZvbGxvd2luZyBVUkk6Ci0gICAgICAgICAgICAiY29tcG9uZW50Oi9yZXNvdXJjZS9NeVdlYk1vZHVsZXNQcm9qZWN0L015V2ViQXBwbGljYXRpb24iLiBBcyBhIGZ1dHVyZSAKLSAgICAgICAgICAgIGV4dGVuc2lvbiwgYSBjb21wb25lbnQgcmVmZXJlbmNlZCBvbiB0aGUgY2xhc3NwYXRoIG9mIGEgcHJvamVjdCAocGVyaGFwcyAKLSAgICAgICAgICAgIGEgVXRpbGl0eSBKYXIgb3IgYW4gRUpCIENsaWVudCBKYXIpLCB0aGUgVVJJIG1pZ2h0IGJlIHNvbWV0aGluZyBsaWtlOgotICAgICAgICAgICAgImNvbXBvbmVudDovY2xhc3NwYXRoL015V2ViTW9kdWxlc1Byb2plY3QvQ3VzdG9tZXJFSkJDbGllbnQuamFyIi4gCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBoYXMgYSA8Yj5Db21wb25lbnRUeXBlPC9iPi4gVGhlIAotICAgICAgICAgICAgPGI+Q29tcG9uZW50VHlwZTwvYj4gZGVmaW5lcyBhIDxpPmNvbXBvbmVudFR5cGVJZDwvaT4KLSAgICAgICAgICAgICwgd2hpY2ggaW5kaWNhdGVzIHRoZSBzcGVjaWZpYyBraW5kIG9mIGNvbXBvbmVudC4gVGhlIFdlYiBUb29scyBQbGF0Zm9ybQotICAgICAgICAgICAgdXNlcyB0aGUgPGk+Y29tcG9uZW50VHlwZUlkPC9pPgotICAgICAgICAgICAgdG8gZGV0ZXJtaW5lIGhvdyB0byB3b3JrIHdpdGggdGhlIGNvbnRlbnQgY29tcG9uZW50IG9mIHRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+Ci0gICAgICAgICAgICBhbmQgcHJlcGFyZSB0aGUgY29tcG9uZW50IGZvciBkZXBsb3ltZW50LiBUaGUgPGI+Q29tcG9uZW50VHlwZTwvYj4gbWF5IAotICAgICAgICAgICAgYWxzbyBkZWZpbmUgdGhlIHJ1bnRpbWUtcGF0aHMgb2Ygc3BlY2lhbCBtZXRhZGF0YSByZXNvdXJjZXMgd2hpY2ggYXJlIAotICAgICAgICAgICAgaW1wb3J0YW50IHRvIHRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LiAiTWV0YWRhdGEiIHJlZmVycyB0byByZXNvdXJjZXMgCi0gICAgICAgICAgICB3aGljaCBleHBsYWluIHRoZSBjb250ZW50IGRldGFpbHMgb2YgdGhlIHNwZWNpZmljIG1vZHVsZXMuIEFuIGV4YW1wbGUgb2YgCi0gICAgICAgICAgICBzdWNoIGEgZmlsZSB3b3VsZCBiZSB0aGUgIldFQi1JTkYvd2ViLnhtbCIgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciAKLSAgICAgICAgICAgIFdlYiBBcHBsaWNhdGlvbnMuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBjb250YWlucyBhIGxpc3Qgb2YgQ29tcG9uZW50UmVzb3VyY2VzLiBFYWNoCi0gICAgICAgICAgICA8Yj5Db21wb25lbnRSZXNvdXJjZTwvYj4gaGFzICJzb3VyY2VQYXRoIiBhbmQgYSBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICAicnVudGltZVBhdGgiLiBUaGUgInNvdXJjZVBhdGgiIGNhbiByZWZlcmVuY2UgZWl0aGVyIGEgZmlsZSBvciBmb2xkZXIsCi0gICAgICAgICAgICBidXQgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2UgbXVzdCBiZSBjb250YWluZWQgaW4gdGhlIHNhbWUgcHJvamVjdCBhcyB0aGUKLSAgICAgICAgICAgIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gZGVmaW5pdGlvbi4gVGhlICJydW50aW1lUGF0aCIgc3BlY2lmaWVzIGEgbG9jYXRpb24KLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBkZXBsb3llZCBzdHJ1Y3R1cmUgb2YgdGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gd2hlcmUgdGhlCi0gICAgICAgICAgICBjb250ZW50cyBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZSB3aWxsIGJlIHJlcHJlc2VudGVkIHdoZW4gdGhlIG1vZHVsZSBpcwotICAgICAgICAgICAgcHJlcGFyZWQgZm9yIHJ1bnRpbWUuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBjb250YWlucyBhIGxpc3Qgb2YgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj5zLiAKLSAgICAgICAgICAgIEVhY2ggPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj4gcHJvdmlkZXMgYSBoYW5kbGUgdGhhdCBtdXN0IHJlc29sdmUgdG8gYSAKLSAgICAgICAgICAgIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4sIGEgcnVudGltZVBhdGggdGhhdCBkZWZpbmVzIHdoZXJlIHRoZSBjb25zdHJ1Y3RlZCAKLSAgICAgICAgICAgIGNvbXBvbmVudCB3aWxsIGJlIHBsYWNlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJ1bnRpbWUgCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LCBhbmQgYSA8Yj5EZXBlbmRlbmN5VHlwZTwvYj4KLSAgICAgICAgICAgIHRoYXQgY2FuIGJlIGVpdGhlciAiY29uc3VtZSIgb3IgInVzZSIgdG8gaW5kaWNhdGUgaG93IHRoZSBjb250ZW50cyBvZgotICAgICAgICAgICAgdGhhdCA8Yj5SZWZlcmVuY2VkQ29tcG9uZW50PC9iPiBzaG91bGQgYmUgYWJzb3JiZWQgYnkgdGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4uCi0gICAgICAgICAgICA8Yj5SZWZlcmVuY2VkQ29tcG9uZW50PC9iPnMgbWF5IHJlZmVyZW5jZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+cyBpbiAKLSAgICAgICAgICAgIG90aGVyIHByb2plY3RzIGFuZCBvbiBjdXJyZW50IHByb2plY3QncyBjbGFzc3BhdGggKE5vdCB5ZXQgaW1wbGVtZW50ZWQpLiAKLSAgICAgICAgICAgIFRoZSA8Yj5EZXBlbmRlbmN5VHlwZTwvYj4gd2lsbCBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udGVudHMgb2YKLSAgICAgICAgICAgIHRoZSA8Yj5SZWZlcmVuY2VkQ29tcG9uZW50PC9iPiBhcmUgYWJzb3JiZWQgYXMtaXMgb3IgYXJjaGl2ZWQgaW50byBhICoue3d8anxlfWFyCi0gICAgICAgICAgICBmaWxlLgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIDxiPlByb2plY3RDb21wb25lbnRzPC9iPiBvYmplY3QgcHJvdmlkZXMgYSByb290IGNvbnRhaW5lciBmb3IgYWxsCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+cyBkZWZpbmVkIGluIGEgZ2l2ZW4gcHJvamVjdC4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLSAgICAgICAgICAgIDxiPkNvbXBvbmVudENvcmU8L2I+IHByb3ZpZGVzIGEgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBtb2RlbCBmb3IKLSAgICAgICAgICAgIGNsaWVudHMuIFN0YXRpYyBtZXRob2RzCi0gICAgICAgICAgICA8Y29kZT5Nb2R1bGVDb3JlLmdldE1vZHVsZUNvcmVGb3JSZWFkKCk8L2NvZGU+Ci0gICAgICAgICAgICBhbmQKLSAgICAgICAgICAgIDxjb2RlPk1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvcldyaXRlKCk8L2NvZGU+Ci0gICAgICAgICAgICBtYXkgYmUgdXNlZCB0byBhY3F1aXJlIGFuIE1vZHVsZUNvcmUgYWRhcHRlciwgYW5kIGNsaWVudHMgYXJlIHJlc3BvbnNpYmxlCi0gICAgICAgICAgICBmb3IgaW52b2tpbmcKLSAgICAgICAgICAgIDxjb2RlPmRpc3Bvc2UoKTwvY29kZT4KLSAgICAgICAgICAgIHdoZW5ldmVyIHRoZXkgYXJlIGZpbmlzaGVkIHVzaW5nIHRoZSBtb2RlbC4KLSAgICAgICAgPC9wPiAgCi0JCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLQkJPGEgbmFtZT0iY29uc3RyYWludHMiLz4KLSAgICAgICAgPGgyPkNvbnN0cmFpbnRzIGVuZm9yY2VkIGJ5IHRoZSBDQ008L2gyPgotICAgICAgICA8cD4KLSAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgYXJlIGVuZm9yY2VkIGJ5IHRoZSBtb2RlbDoKLSAgICAgICAgICAgIDxvbD4KLSAgICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNvbHV0aW9uIHdpbGwgbm90IGNoZWNrIGRlcGVuZGVuY2llcyBmb3IgY29tcG9uZW50cyB0aGF0IGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkIGluIHRoZSBzYW1lIHByb2plY3QuIFRvIGdldCB0aGUgZnVsbCBiZW5lZml0cyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXItY29tcG9uZW50IGRlcGVuZGVuY3kgY2hlY2tpbmcsIGNvbXBvbmVudHMgbXVzdCBiZSBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGludG8gZGlmZmVyZW50IHByb2plY3RzLiBXZSBkbyBub3QgaGF2ZSB0aGUgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGV4aWJpbGl0eSBpbiBjb25zdHJ1Y3RpbmcgYW5kIHNjb3BpbmcgY2xhc3NwYXRocyBvbiBhIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGdyYW51bGFyIHRoYW4gdGhlIHByb2plY3QgbGV2ZWwsIHdoaWNoIHdvdWxkIGJlIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHkuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgc29sdXRpb24gd2lsbCBub3QgYWxsb3cgYSBzaW5nbGUgY29tcG9uZW50IHRvIHNwYW4gbW9yZSB0aGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBvbmUgcHJvamVjdC4gV2l0aGluIHRoYXQgcHJvamVjdCwgd2Ugd2lsbCBoYXZlIGZhaXJseSBicm9hZAotICAgICAgICAgICAgICAgICAgICAgICAgZmxleGliaWxpdHkgdG8gc3BlY2lmeSB3aGljaCByZXNvdXJjZXMgbWFwIHRvIHdoaWNoIGNvbXBvbmVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBFYWNoIGNvbXBvbmVudCB3aXRoaW4gYSBwcm9qZWN0IG11c3QgaGF2ZSBpdHMgb3duIHNvdXJjZSBmb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBidXQgYSBjb21wb25lbnQgbWF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBzb3VyY2UgZm9sZGVyLiBFYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZm9sZGVyIG1heSBiZSBjb250YWluZWQgYnkgYXQgbW9zdCBvbmUgY29tcG9uZW50LiBDb21wb25lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXkgcmVmZXJlbmNlIGRlcGVuZGVudCBjb21wb25lbnRzIGluIG90aGVyIHByb2plY3RzIChzbyBhIFdlYgotICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24gbWF5IHJlZmVyZW5jZSBhIFdlYiBMaWJyYXJ5IG91dHNpZGUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIFdlYiBBcHBsaWNhdGlvbikuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgc29sdXRpb24gd2lsbCBub3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBzZXJ2ZXIgdGFyZ2V0IHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IChhbmQgcmVhbGx5IHBlci1wcm9qZWN0KSBhdCBhIHRpbWUuIFRoZSBhYmlsaXR5IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggdGhpcyBzZXJ2ZXIgdGFyZ2V0ICh2aWEgc29tZSBhY3Rpb24gb3IgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpIHdpbGwgY29udGludWUgdG8gYmUgcG9zc2libGUuIFVzZXJzIHRoYXQgbmVlZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHkgdG8gZGV2ZWxvcCBmb3IgbXVsdGlwbGUgc2VydmVyIHRhcmdldHMgd2lsbCBuZWVkCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBtYW51YWxseSBzd2l0Y2ggYW5kIHRlc3QgYXMgbmVjZXNzYXJ5LgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgRWFjaCBjb21wb25lbnQgaW4gYSBwcm9qZWN0IG1heSBoYXZlIGl0cyBvd24gb3V0cHV0IGZvbGRlcgotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGF1dG9tYXRpY2FsbHkgY29uc3RydWN0ZWQgZm9yIGl0LiBUaGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgd2lsbCBtYXRjaCB0aGUgSjJFRSBzcGVjaWZpY2F0aW9uIG91dHB1dCBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0aGUgY29tcG9uZW50IHR5cGUgKGZvciBKMkVFIG1vZHVsZXMpLiBBIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciB3aWxsIGhhbmRsZSB0aGlzIHJlc3BvbnNpYmlsaXR5IGFuZCB3b3JrCi0gICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZWx5IHdpdGggdGhlIEphdmEgYnVpbGRlciB0byBjb25zdHJ1Y3QgYQotICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95YWJsZSwgb24tZGlzayByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kdWxlIHN0cnVjdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gd2lsbCBmb2xsb3cgdGhpcyBwYXR0ZXJuLCBidXQgCi0gICAgICAgICAgICAgICAgICAgICAgICBob29rcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHZhcnkgdGhpcyBiZWhhdmlvci4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuZWNlc3NpdHkgZm9yIHRoaXMgb24tZGlzayBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYQotICAgICAgICAgICAgICAgICAgICAgICAgSjJFRS1jb21wbGlhbnQgbGF5b3V0IGlzIG1vdGl2YXRlZCBieSB0aGUgcmVxdWlyZW1lbnQgdG8gaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgaW4td29ya2JlbmNoIHRlc3RpbmcsIHNvIHRoYXQgdXNlcnMgd2lsbCBub3QgaGF2ZSB0byBkZWFsCi0gICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZGVwbG95ZXIgYWN0dWFsbHkgY29uc3RydWN0aW5nIGEgZGVwbG95YWJsZSBtb2R1bGUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZyBpdCBvZmYgdG8gYSBzZXJ2ZXIgdG8gdGVzdCB0aGVpciBjb2RlLiBUaGlzIGFwcHJvYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyBjb25zaXN0ZW50IHdpdGggZXhpc3RpbmcgQW50LWJhc2VkIGFwcHJvYWNoZXMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbiBTZXJ2ZXJzIHdoaWNoIGNhbiBydW4gaW4gYSAiZGVidWciIG1vZGUgb24gZGlzay4KLSAgICAgICAgICAgICAgICAgICAgICAgIE91ciB2YWx1ZS1hZGQgd2lsbCBiZSBncmVhdGVyIGF1dG9tYXRpb24gYW5kIGludGVncmF0aW9uIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3b3JrYmVuY2ggLS0gcGFydGljdWxhcmx5IGZvciBpbmNyZW1lbnRhbCBiYXNlZCBzdXBwb3J0LgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWxpemVkIG1vZHVsZSBidWlsZGVyIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2Ugd2FzIGFscmVhZHkgaW4gdGhlIGFwcHJvcHJpYXRlIEoyRUUgc3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxpYW50IHN0cnVjdHVyZS4gVGhlIGRlZmF1bHQgY3JlYXRpb24gd2lsbCBzdGlsbAotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb3VyYWdlIGEgc2luZ2xlIG1vZHVsZSBwZXIgcHJvamVjdCwgd2hpY2ggY29uZm9ybXMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0IEoyRUUgc3RydWN0dXJlLgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50cyB3aWxsIGJlIGRlc2NyaWJlZCB1c2luZyBhIHNpbXBsZSBYTUwgZm9ybWF0LCBhbmQgZWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCB3aWxsIGNvbnRhaW4gb25lCi0gICAgICAgICAgICAgICAgICAgICAgICA8ST4ud3RwbW9kdWxlczwvST4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgdGhhdCB3aWxsIGRlc2NyaWJlIGFsbCBvZiB0aGUgY29tcG9uZW50cyBmb3IgdGhhdCBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGxldmVsIG9mIHRvb2xpbmcgdG8gaGVscCB1c2VycyBjcmVhdGUgdGhlc2UgZmlsZXMgaXMgeWV0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBkZXRlcm1pbmVkIGZvciBXVFAgTTQuIFRoaXMgd291bGQgYmUgYSBncmVhdCBhcmVhIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgaW50ZXJlc3RlZCBkZXZlbG9wZXJzIHRvIHN1Z2dlc3QgYW5kIHByb3ZpZGUgdG9vbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gYSBXaXphcmQgb3IgRWRpdG9yKSB0byBjcmVhdGUgdGhlc2UgZmlsZXMgZnJvbSBleGlzdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlcy4gQSBzY2hlbWEgaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcnMgdGhhdCB3YW50IHRvIGJ1aWxkIHRoZWlyIG93bgotICAgICAgICAgICAgICAgICAgICAgICAgPEk+Lnd0cG1vZHVsZXM8L0k+Ci0gICAgICAgICAgICAgICAgICAgICAgICBieSBoYW5kIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBjb250ZW50IGFzc2lzdCBpbiB0aGUgWE1MCi0gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgPC9vbD4KLSAgICAgICAgPC9wPiAgCi0JCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLQkJPGEgbmFtZT0ibW9kdWxlLWNvcmUtZXhhbXBsZXMiLz4KLSAgICAgICAgPGgyPkNvbXBvbmVudENvcmUgQVBJOiBXb3JraW5nIHdpdGggdGhlIG1ldGFtb2RlbDwvaDI+Ci0gICAgICAgIDxCUiAvPiAgCi0gICAgICAgIDxwPgotCQkJQ29tcG9uZW50Q29yZSB1c2VzIGEgaGFuZGxlIGJhc2VkIG1vZGVsIG11Y2ggbGlrZSB0aGUgZXhpc3RpbmcgUGxhdGZvcm0gCi0JCQlSZXNvdXJjZSBtb2RlbC4gVGhlIENvbXBvbmVudENvcmUgZmFjYWRlIGlzIG5vdCB0aWVkIHRvIGFueSBwcm9qZWN0LCBhbmQgCi0JCQl0aGUgaGFuZGxlcyB0aGF0IGl0IHJldHVybnMgbWF5IG9yIG1heSBub3QgZXhpc3QuIFRoZSBjb21wbGV4aXR5IG9mIAotCQkJbWFuYWdpbmcgdGhlIHVuZGVybHlpbmcgRU1GIG1vZGVsIGlzIGhhbmRsZWQgdW5kZXIgdGhlIGNvdmVyIGZvciB1c2Vycy4gCi0gICAgICAgIDwvcD4gCi0gICAgICAgIDxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy9jb21wb25lbnRjb3JlX3BhY2thZ2UuanBnIiBjYXB0aW9uPSJUaGUgQ29tcG9uZW50Q29yZSBBUEkiIC8+ICAKLSAgICAgICAgPCEtLQotICAgICAgICA8cD4KLSAgICAgICAgICAgIENsaWVudHMgc2hvdWxkIHVzZSBvbmUgb2YKLSAgICAgICAgICAgIDxjb2RlPk1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvclJlYWQoKTwvY29kZT4KLSAgICAgICAgICAgIG9yCi0gICAgICAgICAgICA8Y29kZT5Nb2R1bGVDb3JlLmdldE1vZHVsZUNvcmVGb3JXcml0ZSgpPC9jb2RlPgotICAgICAgICAgICAgdG8gYWNxdWlyZSBhbiBpbnN0YW5jZSBvZiBNb2R1bGVDb3JlLiAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCTxjb2Rlc25pcHBldCBjYXB0aW9uPSJBY3F1aXJpbmcgYW4gaW5zdGFuY2Ugb2YgQ29tcG9uZW50Q29yZSBmb3IgcmVhZC1vbmx5IGFjY2VzcyI+Ci1JUHJvamVjdCBjdXJyZW50UHJvamVjdCA9IC4uLiAKLU1vZHVsZUNvcmUgbW9kdWxlQ29yZUluc3RhbmNlID0gTW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yUmVhZChjdXJyZW50UHJvamVjdCk7Ci1Xb3JrYmVuY2hDb21wb25lbnRbXSBtb2R1bGVzID0gbW9kdWxlQ29yZUluc3RhbmNlLmdldFdvcmtiZW5jaENvbXBvbmVudHMoKTsgCi0uLi4gd29yayB3aXRoIG1vZHVsZXMgLi4uIAotbW9kdWxlQ29yZUluc3RhbmNlLmRpc3Bvc2UoKTsKLQkJCTwvY29kZXNuaXBwZXQ+IAotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgRm9yIGNsaWVudHMgdGhhdCB3b3VsZCBsaWtlIHRvIGJ1aWxkIHVwIHRoZWlyIG93biBtb2RlbHMgZm9yIGEgZ2l2ZW4KLSAgICAgICAgICAgIHByb2plY3QsIG9yIG1vZGlmeSB0aGUgZXhpc3RpbmcgbWV0YW1vZGVsLCB0aGUgTW9kdWxlQ29yZSBpbnN0YW5jZSBzaG91bGQKLSAgICAgICAgICAgIGJlIGFjcXVpcmVkIGZvciB3cml0ZS1hY2Nlc3MuIAotICAgICAgICA8L3A+Ci0JCTxjb2Rlc25pcHBldCBjYXB0aW9uPSJDcmVhdGluZyBhIFdvcmtiZW5jaENvbXBvbmVudCI+ICAgICAgICAgICAgCi0uLi4KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOyAKLS4uLgotCi1wdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlV2ViQXBwTW9kdWxlKElQcm9qZWN0IGFUYXJnZXRQcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIGFKYXZhU291cmNlRm9sZGVyLCAKLSAgICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIGFXZWJDb250ZW50Rm9sZGVyLCAKLSAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgYVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLCAKLSAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIGFQcm9ncmVzc01vbml0b3IpIAotewotICAgIE1vZHVsZUNvcmUgbW9kdWxlQ29yZUluc3RhbmNlID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UgPSAKLSAgICAgICAgICAgIE1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvcldyaXRlKGFUYXJnZXRQcm9qZWN0KTsKLQotICAgICAgICAvKiBDcmVhdGUgYSBuZXcgbW9kdWxlIHRoYXQgd2lsbCBiZSAKLSAgICAgICAgICAgIGNvbnRhaW5lZCBieSB0aGUgY3VycmVudCBNb2R1bGVDb3JlICovCi0gICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCBuZXdNb2R1bGUgPSAKLSAgICAgICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5jcmVhdGVXb3JrYmVuY2hDb21wb25lbnQoIk15V2ViTW9kdWxlLndhciIpOwotCi0gICAgICAgIC8qIEEgSmF2YSBzb3VyY2UgZm9sZGVyIHRoYXQgY29udGFpbnMgCi0gICAgICAgICAgICAgICAgdGhlIGNsYXNzZXMgZm9yIHRoZSBjdXJyZW50IG1vZHVsZSAqLwotICAgICAgICBDb21wb25lbnRSZXNvdXJjZSBqYXZhU291cmNlID0gCi0gICAgICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UuY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSmF2YVNvdXJjZUZvbGRlcik7Ci0gICAgICAgIGphdmFTb3VyY2Uuc2V0RGVwbG95ZWRQYXRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSS5jcmVhdGVVUkkoIi9XRUItSU5GL2NsYXNzZXMiKSk7Ci0gICAgICAgIG5ld01vZHVsZS5nZXRSZXNvdXJjZXMoKS5hZGQoamF2YVNvdXJjZSk7Ci0KLSAgICAgICAgLyogQSByZXNvdXJjZSBmb2xkZXIgdGhhdCBjb250YWlucyAKLSAgICAgICAgICAgIHRoZSAqLmpzcCwgKi5odG1sLCAuaW1nLCAuLi4gZmlsZXMgKi8KLSAgICAgICAgQ29tcG9uZW50UmVzb3VyY2Ugd2ViQ29udGVudCA9IAotICAgICAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlLmNyZWF0ZUNvbXBvbmVudFJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFXZWJDb250ZW50Rm9sZGVyKTsKLSAgICAgICAgd2ViQ29udGVudC5zZXREZXBsb3llZFBhdGgoVVJJLmNyZWF0ZVVSSSgiLyIpKTsKLSAgICAgICAgbmV3TW9kdWxlLmdldFJlc291cmNlcygpLmFkZCh3ZWJDb250ZW50KTsKLQotICAgICAgICAvKiBBIHJlc291cmNlIHRoYXQgcG9pbnRzIHRvIGEgdmFsaWQgd2ViLnhtbCAKLSAgICAgICAgICAgICAgICBmaWxlIHRoYXQgZm9sbG93cyB0aGUgSjJFRSBXZWIgRGVwbG95bWVudAotICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgU3BlY2lmaWNhdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgQ29tcG9uZW50UmVzb3VyY2UgZGVwbG95bWVudERlc2NyaXB0b3IgPSAKLSAgICAgICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5jcmVhdGVDb21wb25lbnRSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcik7Ci0gICAgICAgIGRlcGxveW1lbnREZXNjcmlwdG9yLnNldERlcGxveWVkUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSS5jcmVhdGVVUkkoIi9XRUItSU5GL3dlYi54bWwiKSk7Ci0gICAgICAgIG5ld01vZHVsZS5nZXRSZXNvdXJjZXMoKS5hZGQoZGVwbG95bWVudERlc2NyaXB0b3IpOwotCi0gICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5zYXZlSWZOZWNlc3NhcnkoYVByb2dyZXNzTW9uaXRvcik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgaWYgKG1vZHVsZUNvcmVJbnN0YW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCQk8L2NvZGVzbmlwcGV0PiAgCi0gICAgICAgIDxwPgotICAgICAgICAgICAgRm9yIGNsaWVudHMgdGhhdCB3b3VsZCBsaWtlIHRvIHRha2UgYW4gZXhpc3RpbmcgcHJvamVjdCBhbiBhZGQgRmxleGlibGUKLSAgICAgICAgICAgIFByb2plY3QgU3VwcG9ydCwgdXNlIHRoZSBNb2R1bGVDb3JlTmF0dXJlLmFkZE1vZHVsZUNvcmVJZk5lY2Vzc2FyeSgpIEFQSQotICAgICAgICAgICAgdG8gcHJlcGFyZSB0aGUgcHJvamVjdCB0byBzdXBwb3J0IGZsZXhpYmxlIG1vZHVsZSBzdHJ1Y3R1cmVzLiB0aGUKLSAgICAgICAgICAgIGV4aXN0aW5nIG1ldGFtb2RlbCwgdGhlbiBhY3F1aXJlIHRoZSBNb2R1bGVDb3JlIGluc3RhbmNlIGZvciBtb2RpZmljYXRpb24uCi0gICAgICAgIDwvcD4KLQkJPGNvZGVzbmlwcGV0IGNhcHRpb249IkFkZCBGbGV4aWJsZSBQcm9qZWN0IHN1cHBvcnQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgcHJvamVjdCI+Ci0uLi4gCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsgCi0uLi4KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWtlRmxleGlibGUoSVByb2plY3QgYVRhcmdldFByb2plY3QpIHsKLSAgICBNb2R1bGVDb3JlIG1vZHVsZUNvcmVJbnN0YW5jZSA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgICAgTW9kdWxlQ29yZU5hdHVyZS5hZGRNb2R1bGVDb3JlTmF0dXJlSWZOZWNlc3NhcnkoYVRhcmdldFByb2plY3QpOwotICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UgPSBNb2R1bGVDb3JlLmdldE1vZHVsZUNvcmVGb3JXcml0ZShhVGFyZ2V0UHJvamVjdCk7Ci0gICAgICAgIC4uLiB3b3JrIHdpdGggbW9kdWxlQ29yZUluc3RhbmNlIGFuZCB1bmRlcmx5aW5nIG1vZGVsIC4uLgotICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2Uuc2F2ZUlmTmVjZXNzYXJ5KGFQcm9ncmVzc01vbml0b3IpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGlmIChtb2R1bGVDb3JlSW5zdGFuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQkJPC9jb2Rlc25pcHBldD4gCi0JCS0tPgotCQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZTA4MWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbENvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGNvbXBvbmVudCBhcyBkZWZpbmVkIGJ5IHRoZSAuY29tcG9uZW50IGZpbGUuCi0gKiA8cD4KLSAqIEEgY29tcG9uZW50IGlzIGEgY29udGFpbmVyIG9mIHZpcnR1YWwgcmVzb3VyY2VzIHdoaWNoIGhhcyBvdGhlciBmZWF0dXJlcyB0aGF0IGRlc2NyaWJlIHRoZQotICogY29tcG9uZW50IGluY2x1ZGluZzoKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZpcnR1YWxDb21wb25lbnQgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQkKLQlJUGF0aCBST09UID0gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFR5cGUgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDEpIHdoaWNoIGlkZW50aWZpZXMgY29tcG9uZW50IGJpbmFyeSBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZID0gMHgxOwotCQotCQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGl0cyBlbmNsb3NpbmcgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBkZXBsb3llZCBuYW1lIG9mIHRoZSBjb21wb25lbnQuCi0JICovCi0JU3RyaW5nIGdldERlcGxveWVkTmFtZSgpOwotCi0JLyoqCi0JICogVGhlIGNvbXBvbmVudFR5cGVJZCBpcyB1c2VkIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgY29tcG9uZW50IHNob3VsZCBiZSBlZGl0ZWQgYW5kIGRlcGxveWVkLgotCSAqIEV4YW1wbGVzIGluY2x1ZGUgImpzdC53ZWIiIG9yICJqc3QudXRpbGl0eSIuIFRoZSBjb21wb25lbnRUeXBlSWQgY2FuIGJlIHNldCB0byBhbnkgdmFsdWUgd2hlbgotCSAqIGNyZWF0ZWQgc28gbG9uZyBhcyB0aGF0IHZhbHVlIG1ha2VzIHNlbnNlIHRvIHRoZSBjbGllbnRzLiBTdGFuZGFyZCBjb21wb25lbnRUeXBlSWRzIG1heSBiZQotCSAqIGF2YWlsYWJsZSBmb3IgY29tbW9uIGNvbXBvbmVudCB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb21wb25lbnRUeXBlSWQsIGEgc3RyaW5nIGJhc2VkIGlkZW50aWZpZXIgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbXBvbmVudAotCSAqLwotLy8JU3RyaW5nIGdldENvbXBvbmVudFR5cGVJZCgpOwotCQotCQotCS8qKgotCSAqIFJldHVybnMgcmVmZXJlbmNlIHRvIGl0c2VsZi4KLQkgKiA8cD4KLQkgKiAgCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhlIHZpcnR1YWwgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCk7Ci0JCi0KLQkvKioKLQkgKiAKLQkgKiBUaGUgY29tcG9uZW50VHlwZUlkIGlzIHVzZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBjb21wb25lbnQgc2hvdWxkIGJlIGVkaXRlZCBhbmQgZGVwbG95ZWQuCi0JICogRXhhbXBsZXMgaW5jbHVkZSAianN0LndlYiIgb3IgImpzdC51dGlsaXR5Ii4gVGhlIGNvbXBvbmVudFR5cGVJZCBjYW4gYmUgc2V0IHRvIGFueSB2YWx1ZSB3aGVuCi0JICogY3JlYXRlZCBzbyBsb25nIGFzIHRoYXQgdmFsdWUgbWFrZXMgc2Vuc2UgdG8gdGhlIGNsaWVudHMuIFN0YW5kYXJkIGNvbXBvbmVudFR5cGVJZHMgbWF5IGJlCi0JICogYXZhaWxhYmxlIGZvciBjb21tb24gY29tcG9uZW50IHR5cGVzLgotCSAqIAotCSAqIEBwYXJhbSBhQ29tcG9uZW50VHlwZUlkCi0JICogICAgICAgICAgICBBIHZhbHVlIHdoaWNoIGlzIGVpdGhlciBzdGFuZGFyZCBmb3IgYSBjb21tb24gY29tcG9uZW50IHR5cGUgb3IgY2xpZW50LWRlZmluZWQgZm9yCi0JICogICAgICAgICAgICBhIGN1c3RvbSBjb21wb25lbnQgdHlwZQotCSAqLwotLy8Jdm9pZCBzZXRDb21wb25lbnRUeXBlSWQoU3RyaW5nIGFDb21wb25lbnRUeXBlSWQpOwotCi0JLyoqCi0JICogTWV0YVByb3BlcnRpZXMgYXJlIFN0cmluZy1iYXNlZCBuYW1lLXZhbHVlIHBhaXJzIHRoYXQgaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzCi0JICogY29tcG9uZW50IHRoYXQgbWF5IGJlIHJlbGV2YW50IHRvIGNsaWVudHMgb3IgdGhlIHdheSB0aGF0IGNsaWVudHMgZWRpdCBvciBkZXBsb3kgY29tcG9uZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgYnktcmVmZXJlbmNlIGluc3RhbmNlIG9mIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzIGNvbXBvbmVudC4KLQkgKi8KLQlQcm9wZXJ0aWVzIGdldE1ldGFQcm9wZXJ0aWVzKCk7Ci0JCi0JLyoqCi0JICogQWRkcyBhIHNpbmdsZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqIAkJQSB2YWx1ZSB3aGljaCBpcyBuYW1lLCB2YWx1ZSBwYWlyLCBzZWUgQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCkKLQkgKiAJCQotCSAqLwotCXZvaWQgc2V0TWV0YVByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOwotCQotCS8qKgotCSAqIEFkZHMgdGhlIHByb3BlcnRpZXMgcHJvdmlkZWQgYXMgYSBsaXN0Ci0JICogQHBhcmFtIHByb3BlcnRpZXMKLQkgKiAJCQlBIGxpc3Qgb2YgcHJvcGVydGllcwotCSAqLwotCXZvaWQgc2V0TWV0YVByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKTsKLQotCS8qKgotCSAqIE1ldGFSZXNvdXJjZXMgcHJvdmlkZSBhIGxvb3NlIG1lY2hhbmlzbSBmb3IgY29tcG9uZW50cyB0aGF0IHdvdWxkIGxpa2UgdG8gbGlzdCBvZmYgdGhlCi0JICogbWV0YWRhdGEtcmVzb3VyY2VzIGF2YWlsYWJsZSBpbiB0aGUgY29tcG9uZW50IHdoaWNoIGNhbiBhaWQgb3IgZXhwZWRpdGUgc2VhcmNoaW5nIGZvciB0aGlzCi0JICogcmVzb3VyY2VzLgotCSAqIDxwPgotCSAqIENsaWVudHMgYXJlIG5vdCByZXF1aXJlZCB0byBnZXQgb3Igc2V0IHRoZSBNZXRhUmVzb3VyY2VzIGZvciBhIGNvbXBvbmVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBBIGJ5LXZhbHVlIGNvcHkgb2YgdGhlIE1ldGFSZXNvdXJjZXMgYXJyYXkKLQkgKiBAc2VlICNzZXRNZXRhUmVzb3VyY2VzKElQYXRoW10pCi0JICovCi0JSVBhdGhbXSBnZXRNZXRhUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBNZXRhUmVzb3VyY2VzIHByb3ZpZGUgYSBsb29zZSBtZWNoYW5pc20gZm9yIGNvbXBvbmVudHMgdGhhdCB3b3VsZCBsaWtlIHRvIGxpc3Qgb2ZmIHRoZQotCSAqIG1ldGFkYXRhLXJlc291cmNlcyBhdmFpbGFibGUgaW4gdGhlIGNvbXBvbmVudCB3aGljaCBjYW4gYWlkIG9yIGV4cGVkaXRlIHNlYXJjaGluZyBmb3IgdGhpcwotCSAqIHJlc291cmNlcy4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGFyZSBub3QgcmVxdWlyZWQgdG8gZ2V0IG9yIHNldCB0aGUgTWV0YVJlc291cmNlcyBmb3IgYSBjb21wb25lbnQuIFRoZSBleGlzdGluZwotCSAqIE1ldGFSZXNvdXJjZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBhZnRlciB0aGUgY2FsbCB0byB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHRoZU1ldGFSZXNvdXJjZVBhdGhzCi0JICogICAgICAgICAgICBBbiBhcnJheSBvZiBwYXRocyB0aGF0IHdpbGwgYmVjb21lIHRoZSBuZXcgTWV0YVJlc291cmNlIGFycmF5LgotCSAqLwotCXZvaWQgc2V0TWV0YVJlc291cmNlcyhJUGF0aFtdIHRoZU1ldGFSZXNvdXJjZVBhdGhzKTsKLQotCi0JLyoqCi0JICogVmlydHVhbCBjb21wb25lbnRzIG1heSByZWZlcmVuY2Ugb3RoZXIgdmlydHVhbCBjb21wb25lbnRzIHRvIGJ1aWxkIGxvZ2ljYWwgZGVwZW5kZW5jeSB0cmVlcy4gCi0JICogPHA+Ci0JICogRWFjaCB2aXJ0dWFsIHJlZmVyZW5jZSB3aWxsIGluZGljYXRlIGhvdyB0aGUgY29udGVudCBvZiB0aGUgcmVmZXJlbmNlIHdpbGwgYmUgYWJzb3JiZWQgCi0JICogYnkgdGhpcyBjb21wb25lbnQuIEVhY2ggdmlydHVhbCByZWZlcmVuY2Ugd2lsbCBhbHdheXMgc3BlY2lmeSBhbiBlbmNsb3NpbmcgY29tcG9uZW50IHRoYXQgd2lsbAotCSAqIGJlIHRoaXMgY29tcG9uZW50LiAgIAotCSAqIDwvcD4KLQkgKiBAcmV0dXJuIEEgYnktdmFsdWUgY29weSBvZiB0aGUgdmlydHVhbCByZWZlcmVuY2UgYXJyYXkKLQkgKi8KLQlJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKTsKLQkvKioKLQkgKiBWaXJ0dWFsIGNvbXBvbmVudHMgbWF5IHJlZmVyZW5jZSBvdGhlciB2aXJ0dWFsIGNvbXBvbmVudHMgdG8gYnVpbGQgbG9naWNhbCBkZXBlbmRlbmN5IHRyZWVzLiAKLQkgKiA8cD4KLQkgKiBFYWNoIHZpcnR1YWwgcmVmZXJlbmNlIHdpbGwgaW5kaWNhdGUgaG93IHRoZSBjb250ZW50IG9mIHRoZSByZWZlcmVuY2Ugd2lsbCBiZSBhYnNvcmJlZCAKLQkgKiBieSB0aGlzIGNvbXBvbmVudC4gRWFjaCB2aXJ0dWFsIHJlZmVyZW5jZSB3aWxsIGFsd2F5cyBzcGVjaWZ5IGFuIGVuY2xvc2luZyBjb21wb25lbnQgdGhhdCB3aWxsCi0JICogYmUgdGhpcyBjb21wb25lbnQuICAgCi0JICogPC9wPgotCSAqIEByZXR1cm4gQSBieS12YWx1ZSBjb3B5IG9mIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSB3aXRoIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZSBleGlzdCBtYXRjaGluZyB0aGlzIG5hbWUKLQkgKi8KLQlJVmlydHVhbFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoU3RyaW5nIGFDb21wb25lbnROYW1lKTsKLQkKLQkvKioKLQkgKiBWaXJ0dWFsIGNvbXBvbmVudHMgbWF5IHJlZmVyZW5jZSBvdGhlciB2aXJ0dWFsIGNvbXBvbmVudHMgdG8gYnVpbGQgbG9naWNhbCBkZXBlbmRlbmN5IHRyZWVzLiAKLQkgKiA8cD4KLQkgKiBFYWNoIHZpcnR1YWwgcmVmZXJlbmNlIHdpbGwgaW5kaWNhdGUgaG93IHRoZSBjb250ZW50IG9mIHRoZSByZWZlcmVuY2Ugd2lsbCBiZSBhYnNvcmJlZCAKLQkgKiBieSB0aGlzIGNvbXBvbmVudC4gRWFjaCB2aXJ0dWFsIHJlZmVyZW5jZSB3aWxsIGFsd2F5cyBzcGVjaWZ5IGFuIGVuY2xvc2luZyBjb21wb25lbnQgdGhhdCB3aWxsCi0JICogYmUgdGhpcyBjb21wb25lbnQuIEFueSByZWZlcmVuY2VzIHNwZWNpZmllZCBpbiB0aGUgYXJyYXkgd2hpY2ggZG8gbm90IHNwZWNpZnkgYW4gZW5jbG9zaW5nCi0JICogY29tcG9uZW50IHRoYXQgbWF0Y2hlcyB0aGlzIGNvbXBvbmVudCB3aWxsIGJlIG1vZGlmaWVkIHRvIHNwZWNpZnkgdGhpcyB2aXJ0dWFsIGNvbXBvbmVudC4gCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEV4aXN0aW5nIHZpcnR1YWwgcmVmZXJlbmNlcyB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gdGhlUmVmZXJlbmNlcyBBIGJ5LXZhbHVlIGNvcHkgb2YgdGhlIHZpcnR1YWwgcmVmZXJlbmNlIGFycmF5Ci0JICovCi0Jdm9pZCBzZXRSZWZlcmVuY2VzKElWaXJ0dWFsUmVmZXJlbmNlW10gdGhlUmVmZXJlbmNlcyk7Ci0JCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlcyhJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBpcyBvZiBiaW5hcnkgdHlwZQotCSAqIAotCSAqIEByZXR1cm4gVGhlIGJpbmFyeSBzdGF0dXMuCi0JICovCi0JYm9vbGVhbiBpc0JpbmFyeSgpOwkJCi0JCi0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGVsZW1lbnRzIGlmIHRoZXkgZG8gbm90IGFscmVhZHkgZXhpc3QuIFJlc291cmNlcwotCSAqIG1heSBiZSBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlmIHRoZSBtYXBwZWQgcGF0aCBkb2VzIG5vdCBleGlzdC4gCi0JICogCi0JICogQHBhcmFtIHVwZGF0ZUZsYWdzIEFueSBvZiBJVmlydHVhbFJlc291cmNlIG9yIElSZXNvdXJjZSB1cGRhdGUgZmxhZ3MuIElmIGEgCi0JICogCQkJcmVzb3VyY2UgbXVzdCBiZSBjcmVhdGVkLCB0aGUgdXBkYXRlRmxhZ3Mgd2lsbCBiZSBzdXBwbGllZCB0byB0aGUgCi0JICogCQkJcmVzb3VyY2UgY3JlYXRpb24gb3BlcmF0aW9uLgotCSAqIEBwYXJhbSBhTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZShpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOyAKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSByb290IGZvbGRlci4KLQkgKiA8cD4gCi0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IG5laXRoZXIgdGhlIGNvbnRhaW5lcgotCSAqIG5vciB0aGUgcmVzdWx0IG5lZWQgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiBUaGUgdmFsaWRhdGlvbiBjaGVjayBvbiB0aGUgcmVzb3VyY2UgbmFtZS9wYXRoIGlzIG5vdCBkb25lCi0JICogd2hlbiB0aGUgcmVzb3VyY2UgaGFuZGxlIGlzIGNvbnN0cnVjdGVkOyByYXRoZXIsIGl0IGlzIGRvbmUKLQkgKiBhdXRvbWF0aWNhbGx5IGFzIHRoZSByZXNvdXJjZSBpcyBjcmVhdGVkLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbWVtYmVyIGZvbGRlcgotCSAqIEByZXR1cm4gdGhlIChoYW5kbGUgb2YgdGhlKSBtZW1iZXIgZm9sZGVyCi0JICovCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGdldFJvb3RGb2xkZXIoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBjb21wb25lbnQuIAotCSAqIDxwPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG1heSBub3QgKGFuZCBtb3N0IGxpa2VseSB3aWxsIG5vdCkgYmUgcmVmZXJlbmNlZCBpbiB0aGUgCi0JICogcnVudGltZSBwYXRoIG9mIHRoaXMgdmlydHVhbCBwYXRoLCBidXQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHRoZSB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aC4gCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyBuZWl0aGVyIHRoZSByZXNvdXJjZSBub3IgdGhlIHJlc3VsdGluZyBwcm9qZWN0IG5lZWQKLQkgKiBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcHJvamVjdCBoYW5kbGUKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbXBvbmVudCBpcyBiYWNrZWQgYnkgYW4gYWNjZXNzaWJsZSBDb21wb25lbnQuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBvbmVudHMgd2hpY2ggcmVmZXJlbmNlIHRoaXMgY29tcG9uZW50LiAgVGhpcyBpcyBvbmx5IGEgb25lIGxheWVyCi0JICogZGVlcCBzZWFyY2ggYWxnb3JpdGhtLgotCSAqIAotCSAqIEByZXR1cm4gYXJyYXkgb2YgSVZpcnR1YWxDb21wb25lbnRzCi0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0MTFhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLS8qKgotICogUmVwcmVzZW50cyBhIGNvbXBvbmVudCBhcyBkZWZpbmVkIGJ5IHRoZSBXVFAgTW9kdWxlcyBmaWxlLiBBIAotICogdmlydHVhbCBjb250YWluZXIgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgY29tcG9uZW50LiAKLSAqIDxwPgotICogVmlydHVhbCBjb250YWluZXJzIGNhbiBwcm92aWRlIGhhbmRsZXMgdG8gdmlydHVhbCBmaWxlcyBhbmQgCi0gKiB2aXJ0dWFsIGZvbGRlcnMgdGhhdCBpdCBjb250YWlucy4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRvIGFjcXVpcmUgYSBoYW5kbGUgdG8gYSBjb21wb25lbnQsIHVzZSB0aGUgZm9sbG93aW5nIHNuaXBwZXQ6PGJyPiAKLSAqIDxjb2RlPk1vZHVsZUNvcmUuY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5pbmdQcm9qZWN0LCBjb21wb25lbnROYW1lKTwvY29kZT4KLSAqIHdoaWNoIHdpbGwgY3JlYXRlIGEgaGFuZGxlIHRvIGEgdmlydHVhbCBjb250YWluZXIgY29udGFpbmVkIGJ5IAotICogPGk+Y29udGFpbmluZ1Byb2plY3Q8L2k+IHdpdGggdGhlIG5hbWUgPGk+Y29tcG9uZW50TmFtZTwvaT4uIElmIHRoZSAKLSAqIGEgY29tcG9uZW50IG9mIHRoZSBnaXZlbiBuYW1lIGV4aXN0cywgdGhlbiAKLSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2UjZXhpc3RzKCl9Ci0gKiB3aWxsIHJldHVybiB0cnVlLiBPdGhlcndpc2UsIHVzZSB7QGxpbmsgI2NyZWF0ZShpbnQsIElQcm9ncmVzc01vbml0b3IpfSB0byAKLSAqIGNyZWF0ZSB0aGUgcmVsZXZhbnQgbW9kZWwgZWxlbWVudHMuIElmIGEgY2xpZW50IG5lZWRzIHRvIGFkZCBhIAotICogbWFwcGluZyBmcm9tIGEgZm9sZGVyIGluIHRoZSBzYW1lIHByb2plY3QgdG8gcm9vdCwgdXNlIAotICoge0BsaW5rICNjcmVhdGVMaW5rKElQYXRoLCBpbnQsIElQcm9ncmVzc01vbml0b3IpfSB3aXRoIGEgCi0gKiBwcm9qZWN0LXJlbGF0aXZlIHBhdGguIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWaXJ0dWFsQ29udGFpbmVyIGV4dGVuZHMgSVZpcnR1YWxSZXNvdXJjZSB7ICAKLQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBlbGVtZW50cyBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5IGV4aXN0LiBSZXNvdXJjZXMKLQkgKiBtYXkgYmUgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpZiB0aGUgbWFwcGVkIHBhdGggZG9lcyBub3QgZXhpc3QuIAotCSAqIAotCSAqIEBwYXJhbSB1cGRhdGVGbGFncyBBbnkgb2YgSVZpcnR1YWxSZXNvdXJjZSBvciBJUmVzb3VyY2UgdXBkYXRlIGZsYWdzLiBJZiBhIAotCSAqIAkJCXJlc291cmNlIG11c3QgYmUgY3JlYXRlZCwgdGhlIHVwZGF0ZUZsYWdzIHdpbGwgYmUgc3VwcGxpZWQgdG8gdGhlIAotCSAqIAkJCXJlc291cmNlIGNyZWF0aW9uIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gYU1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsgCi0gCi0gCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIGEgdmlydHVhbCByZXNvdXJjZSBvZiBzb21lIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gcGF0aCAKLQkgKiBleGlzdHMgcmVsYXRpdmUgdG8gdGhpcyByZXNvdXJjZS4KLQkgKiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmU7IGluIGVpdGhlciBjYXNlLCBpdCBpcwotCSAqIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UuICBUcmFpbGluZyBzZXBhcmF0b3JzIGFyZSBpZ25vcmVkLgotCSAqIElmIHRoZSBwYXRoIGlzIGVtcHR5IHRoaXMgY29udGFpbmVyIGlzIGNoZWNrZWQgZm9yIGV4aXN0ZW5jZS4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSByZXNvdXJjZSBvZiBzb21lIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gcGF0aCAKLQkgKiAgICAgZXhpc3RzIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNlZSBJVmlydHVhbFJlc291cmNlI2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKElQYXRoIHBhdGgpOwotCi0JLyoqCi0JICogRmluZHMgYW5kIHJldHVybnMgdGhlIG1lbWJlciB2aXJ0dWFsIHJlc291cmNlIChmb2xkZXIgb3IgZmlsZSkKLQkgKiB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoaXMgY29udGFpbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0JICogcmVzb3VyY2UgZXhpc3RzLgotCSAqIAotCSAqCi0JICogQHBhcmFtIG5hbWUgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBtZW1iZXIgcmVzb3VyY2UKLQkgKiBAcmV0dXJuIHRoZSBtZW1iZXIgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2gKLQkgKiAJCXJlc291cmNlIGV4aXN0cwotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlIGZpbmRNZW1iZXIoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogRmluZHMgYW5kIHJldHVybnMgdGhlIG1lbWJlciByZXNvdXJjZSAoZm9sZGVyLCBvciBmaWxlKQotCSAqIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhpcyBjb250YWluZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAotCSAqIHRoZXJlIGlzIG5vIHN1Y2ggcmVzb3VyY2UuCi0JICogPHA+Ci0JICogSWYgdGhlIDxjb2RlPmluY2x1ZGVQaGFudG9tczwvY29kZT4gYXJndW1lbnQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCAKLQkgKiBvbmx5IGEgbWVtYmVyIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGlzdHMgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiBJZiB0aGUgPGNvZGU+aW5jbHVkZVBoYW50b21zPC9jb2RlPiBhcmd1bWVudCBpcyA8Y29kZT50cnVlPC9jb2RlPiwKLQkgKiB0aGUgbWV0aG9kIGFsc28gcmV0dXJucyBhIHJlc291cmNlIGlmIHRoZSB3b3Jrc3BhY2UgaXMga2VlcGluZyB0cmFjayBvZiBhCi0JICogcGhhbnRvbSB3aXRoIHRoYXQgbmFtZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZSB0aGF0IG5vIGF0dGVtcHQgaXMgbWFkZSB0byBleGNsdWRlIHRlYW0tcHJpdmF0ZSBtZW1iZXIgcmVzb3VyY2VzCi0JICogYXMgd2l0aCA8Y29kZT5tZW1iZXJzPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIG1lbWJlciByZXNvdXJjZQotCSAqIEBwYXJhbSBpbmNsdWRlUGhhbnRvbXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGhhbnRvbSByZXNvdXJjZXMgYXJlCi0JICogICBvZiBpbnRlcmVzdDsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHBoYW50b20gcmVzb3VyY2VzIGFyZSBub3Qgb2YKLQkgKiAgIGludGVyZXN0Ci0JICogQHJldHVybiB0aGUgbWVtYmVyIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0JICogCQlyZXNvdXJjZSBleGlzdHMKLQkgKiBAc2VlICNtZW1iZXJzKCkKLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjaXNQaGFudG9tKCkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKFN0cmluZyBuYW1lLCBpbnQgc2VhcmNoRmxhZ3MpOwotCi0JLyoqCi0JICogRmluZHMgYW5kIHJldHVybnMgdGhlIG1lbWJlciByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwYXRoIGluCi0JICogdGhpcyBjb250YWluZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggcmVzb3VyY2UgZXhpc3RzLgotCSAqIFRoZSBzdXBwbGllZCBwYXRoIG1heSBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZTsgaW4gZWl0aGVyIGNhc2UsIGl0IGlzCi0JICogaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhpcyByZXNvdXJjZS4gICBUcmFpbGluZyBzZXBhcmF0b3JzIGFuZCB0aGUgcGF0aCdzCi0JICogZGV2aWNlIGFyZSBpZ25vcmVkLiBJZiB0aGUgcGF0aCBpcyBlbXB0eSB0aGlzIGNvbnRhaW5lciBpcyByZXR1cm5lZC4gIAotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggb2YgdGhlIGRlc2lyZWQgcmVzb3VyY2UKLQkgKiBAcmV0dXJuIHRoZSBtZW1iZXIgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2gKLQkgKiAJCXJlc291cmNlIGV4aXN0cwotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlIGZpbmRNZW1iZXIoSVBhdGggcGF0aCk7Ci0KLQkvKioKLQkgKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgbWVtYmVyIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHBhdGggaW4KLQkgKiB0aGlzIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCByZXNvdXJjZS4KLQkgKiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmU7IGluIGVpdGhlciBjYXNlLCBpdCBpcwotCSAqIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UuICBUcmFpbGluZyBzZXBhcmF0b3JzIGFuZCB0aGUgcGF0aCdzCi0JICogZGV2aWNlIGFyZSBpZ25vcmVkLgotCSAqIElmIHRoZSBwYXRoIGlzIGVtcHR5IHRoaXMgY29udGFpbmVyIGlzIHJldHVybmVkLiAKLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBkZXNpcmVkIHJlc291cmNlCi0JICogQHBhcmFtIGluY2x1ZGVQaGFudG9tcyA8Y29kZT50cnVlPC9jb2RlPiBpZiBwaGFudG9tIHJlc291cmNlcyBhcmUKLQkgKiAgIG9mIGludGVyZXN0OyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgcGhhbnRvbSByZXNvdXJjZXMgYXJlIG5vdCBvZgotCSAqICAgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIHRoZSBtZW1iZXIgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2gKLQkgKiAJCXJlc291cmNlIGV4aXN0cwotCSAqIEBzZWUgI21lbWJlcnMoYm9vbGVhbikKLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjaXNQaGFudG9tKCkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKElQYXRoIHBhdGgsIGludCBzZWFyY2hGbGFncyk7IAotCi0JLyoqCi0JICogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwYXRoIGluIHRoaXMKLQkgKiBjb250YWluZXIuCi0JICogPHA+IAotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyBuZWl0aGVyIHRoZSByZXNvdXJjZSBub3IKLQkgKiB0aGUgcmVzdWx0IG5lZWQgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiBUaGUgdmFsaWRhdGlvbiBjaGVjayBvbiB0aGUgcmVzb3VyY2UgbmFtZS9wYXRoIGlzIG5vdCBkb25lCi0JICogd2hlbiB0aGUgcmVzb3VyY2UgaGFuZGxlIGlzIGNvbnN0cnVjdGVkOyByYXRoZXIsIGl0IGlzIGRvbmUKLQkgKiBhdXRvbWF0aWNhbGx5IGFzIHRoZSByZXNvdXJjZSBpcyBjcmVhdGVkLgotCSAqIDxwPgotCSAqIFRoZSBzdXBwbGllZCBwYXRoIG1heSBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZTsgaW4gZWl0aGVyIGNhc2UsIGl0IGlzCi0JICogaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhpcyByZXNvdXJjZSBhbmQgaXMgYXBwZW5kZWQKLQkgKiB0byB0aGlzIGNvbnRhaW5lcidzIGZ1bGwgcGF0aCB0byBmb3JtIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJlc3VsdGFudCByZXNvdXJjZS4KLQkgKiBBIHRyYWlsaW5nIHNlcGFyYXRvciBpcyBpZ25vcmVkLiBUaGUgcGF0aCBvZiB0aGUgcmVzdWx0aW5nIHJlc291cmNlIG11c3QgCi0JICogaGF2ZSBhdCBsZWFzdCB0d28gc2VnbWVudHMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggb2YgdGhlIG1lbWJlciBmaWxlCi0JICogQHJldHVybiB0aGUgKGhhbmRsZSBvZiB0aGUpIG1lbWJlciBmaWxlCi0JICogQHNlZSAjZ2V0Rm9sZGVyKElQYXRoKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZpbGUgZ2V0RmlsZShJUGF0aCBwYXRoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGZvbGRlciBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwYXRoIGluIHRoaXMKLQkgKiBjb250YWluZXIuCi0JICogPHA+IAotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyBuZWl0aGVyIHRoZSByZXNvdXJjZSBub3IKLQkgKiB0aGUgcmVzdWx0IG5lZWQgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiBUaGUgdmFsaWRhdGlvbiBjaGVjayBvbiB0aGUgcmVzb3VyY2UgbmFtZS9wYXRoIGlzIG5vdCBkb25lCi0JICogd2hlbiB0aGUgcmVzb3VyY2UgaGFuZGxlIGlzIGNvbnN0cnVjdGVkOyByYXRoZXIsIGl0IGlzIGRvbmUKLQkgKiBhdXRvbWF0aWNhbGx5IGFzIHRoZSByZXNvdXJjZSBpcyBjcmVhdGVkLiAKLQkgKiA8cD4KLQkgKiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmU7IGluIGVpdGhlciBjYXNlLCBpdCBpcwotCSAqIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UgYW5kIGlzIGFwcGVuZGVkCi0JICogdG8gdGhpcyBjb250YWluZXIncyBmdWxsIHBhdGggdG8gZm9ybSB0aGUgZnVsbCBwYXRoIG9mIHRoZSByZXN1bHRhbnQgcmVzb3VyY2UuCi0JICogQSB0cmFpbGluZyBzZXBhcmF0b3IgaXMgaWdub3JlZC4gVGhlIHBhdGggb2YgdGhlIHJlc3VsdGluZyByZXNvdXJjZSBtdXN0Ci0JICogaGF2ZSBhdCBsZWFzdCB0d28gc2VnbWVudHMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggb2YgdGhlIG1lbWJlciBmb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSAoaGFuZGxlIG9mIHRoZSkgbWVtYmVyIGZvbGRlcgotCSAqIEBzZWUgI2dldEZpbGUoSVBhdGgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGdldEZvbGRlcihJUGF0aCBwYXRoKTsgCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhpcyBmb2xkZXIuCi0JICogPHA+IAotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyBuZWl0aGVyIHRoZSByZXNvdXJjZSBub3IKLQkgKiB0aGUgcmVzdWx0IG5lZWQgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiBUaGUgdmFsaWRhdGlvbiBjaGVjayBvbiB0aGUgcmVzb3VyY2UgbmFtZS9wYXRoIGlzIG5vdCBkb25lCi0JICogd2hlbiB0aGUgcmVzb3VyY2UgaGFuZGxlIGlzIGNvbnN0cnVjdGVkOyByYXRoZXIsIGl0IGlzIGRvbmUKLQkgKiBhdXRvbWF0aWNhbGx5IGFzIHRoZSByZXNvdXJjZSBpcyBjcmVhdGVkLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbWVtYmVyIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSAoaGFuZGxlIG9mIHRoZSkgbWVtYmVyIGZpbGUKLQkgKiBAc2VlICNnZXRGb2xkZXIoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBmb2xkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGlzIGZvbGRlci4KLQkgKiA8cD4gCi0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IG5laXRoZXIgdGhlIGNvbnRhaW5lcgotCSAqIG5vciB0aGUgcmVzdWx0IG5lZWQgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiBUaGUgdmFsaWRhdGlvbiBjaGVjayBvbiB0aGUgcmVzb3VyY2UgbmFtZS9wYXRoIGlzIG5vdCBkb25lCi0JICogd2hlbiB0aGUgcmVzb3VyY2UgaGFuZGxlIGlzIGNvbnN0cnVjdGVkOyByYXRoZXIsIGl0IGlzIGRvbmUKLQkgKiBhdXRvbWF0aWNhbGx5IGFzIHRoZSByZXNvdXJjZSBpcyBjcmVhdGVkLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbWVtYmVyIGZvbGRlcgotCSAqIEByZXR1cm4gdGhlIChoYW5kbGUgb2YgdGhlKSBtZW1iZXIgZm9sZGVyCi0JICogQHNlZSAjZ2V0RmlsZShTdHJpbmcpCi0JICovCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGdldEZvbGRlcihTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBleGlzdGluZyBtZW1iZXIgcmVzb3VyY2VzIChwcm9qZWN0cywgZm9sZGVycyBhbmQgZmlsZXMpCi0JICogaW4gdGhpcyByZXNvdXJjZSwgaW4gbm8gcGFydGljdWxhciBvcmRlci4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCBmdWxseSBlcXVpdmFsZW50IHRvIDxjb2RlPm1lbWJlcnMoSVZpcnR1YWxSZXNvdXJjZS5OT05FKTwvY29kZT4uCi0JICogVGVhbS1wcml2YXRlIG1lbWJlciByZXNvdXJjZXMgYXJlIDxiPm5vdDwvYj4gaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4KLQkgKiA8L3A+PHA+Ci0JICogTm90ZSB0aGF0IHRoZSBtZW1iZXJzIG9mIGEgcHJvamVjdCBvciBmb2xkZXIgYXJlIHRoZSBmaWxlcyBhbmQgZm9sZGVycwotCSAqIGltbWVkaWF0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gaXQuICBUaGUgbWVtYmVycyBvZiB0aGUgd29ya3NwYWNlIHJvb3QKLQkgKiBhcmUgdGhlIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtZW1iZXJzIG9mIHRoaXMgcmVzb3VyY2UKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhpcyByZXF1ZXN0IGZhaWxzLiBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT4gVGhpcyByZXNvdXJjZSBkb2VzIG5vdCBleGlzdC48L2xpPgotCSAqIDxsaT4gVGhpcyByZXNvdXJjZSBpcyBhIHByb2plY3QgdGhhdCBpcyBub3Qgb3Blbi48L2xpPgotCSAqIDwvdWw+Ci0JICogQHNlZSAjZmluZE1lbWJlcihJUGF0aCkKLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjaXNBY2Nlc3NpYmxlKCkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBtZW1iZXIgcmVzb3VyY2VzIChwcm9qZWN0cywgZm9sZGVycyBhbmQgZmlsZXMpCi0JICogaW4gdGhpcyByZXNvdXJjZSwgaW4gbm8gcGFydGljdWxhciBvcmRlci4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgPGNvZGU+SU5DTFVERV9QSEFOVE9NUzwvY29kZT4gZmxhZyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBtZW1iZXIgCi0JICogZmxhZ3MgKHJlY29tbWVuZGVkKSwgb25seSBtZW1iZXIgcmVzb3VyY2VzIHRoYXQgZXhpc3Qgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiBJZiB0aGUgPGNvZGU+SU5DTFVERV9QSEFOVE9NUzwvY29kZT4gZmxhZyBpcyBzcGVjaWZpZWQsCi0JICogdGhlIHJlc3VsdCB3aWxsIGFsc28gaW5jbHVkZSBhbnkgcGhhbnRvbSBtZW1iZXIgcmVzb3VyY2VzIHRoZQotCSAqIHdvcmtzcGFjZSBpcyBrZWVwaW5nIHRyYWNrIG9mLgotCSAqIDwvcD48cD4KLQkgKiBJZiB0aGUgPGNvZGU+SU5DTFVERV9URUFNX1BSSVZBVEVfTUVNQkVSUzwvY29kZT4gZmxhZyBpcyBzcGVjaWZpZWQgCi0JICogaW4gdGhlIG1lbWJlciBmbGFncywgdGVhbSBwcml2YXRlIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBhbG9uZyB3aXRoCi0JICogdGhlIG90aGVycy4gSWYgdGhlIDxjb2RlPklOQ0xVREVfVEVBTV9QUklWQVRFX01FTUJFUlM8L2NvZGU+IGZsYWcKLQkgKiBpcyBub3Qgc3BlY2lmaWVkIChyZWNvbW1lbmRlZCksIHRoZSByZXN1bHQgd2lsbCBvbWl0IGFueSB0ZWFtIHByaXZhdGUKLQkgKiBtZW1iZXIgcmVzb3VyY2VzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgPGNvZGU+RVhDTFVERV9ERVJJVkVEPC9jb2RlPiBmbGFnIGlzIG5vdCBzcGVjaWZpZWQsIGRlcml2ZWQgCi0JICogcmVzb3VyY2VzIGFyZSBpbmNsdWRlZC4gSWYgdGhlIDxjb2RlPkVYQ0xVREVfREVSSVZFRDwvY29kZT4gZmxhZyBpcyAKLQkgKiBzcGVjaWZpZWQgaW4gdGhlIG1lbWJlciBmbGFncywgZGVyaXZlZCByZXNvdXJjZXMgYXJlIG5vdCBpbmNsdWRlZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbWVtYmVyRmxhZ3MgYml0LXdpc2Ugb3Igb2YgbWVtYmVyIGZsYWcgY29uc3RhbnRzCi0JICogICAoPGNvZGU+SU5DTFVERV9QSEFOVE9NUzwvY29kZT4sIDxjb2RlPklOQ0xVREVfVEVBTV9QUklWQVRFX01FTUJFUlM8L2NvZGU+Ci0JICogICBhbmQgPGNvZGU+RVhDTFVERV9ERVJJVkVEPC9jb2RlPikgaW5kaWNhdGluZyB3aGljaCBtZW1iZXJzIGFyZSBvZiBpbnRlcmVzdAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWVtYmVycyBvZiB0aGlzIHJlc291cmNlCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgcmVxdWVzdCBmYWlscy4gUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+IFRoaXMgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QuPC9saT4KLQkgKiA8bGk+IHRoZSA8Y29kZT5JTkNMVURFX1BIQU5UT01TPC9jb2RlPiBmbGFnIGlzIG5vdCBzcGVjaWZpZWQgYW5kCi0JICogICAgIHRoaXMgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QuPC9saT4KLQkgKiA8bGk+IHRoZSA8Y29kZT5JTkNMVURFX1BIQU5UT01TPC9jb2RlPiBmbGFnIGlzIG5vdCBzcGVjaWZpZWQgYW5kCi0JICogICAgIHRoaXMgcmVzb3VyY2UgaXMgYSBwcm9qZWN0IHRoYXQgaXMgbm90IG9wZW4uPC9saT4KLQkgKiA8L3VsPgotCSAqIEBzZWUgSVZpcnR1YWxSZXNvdXJjZSNleGlzdHMoKQotCSAqIEBwbGFubmVkZm9yIDIuMAotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyhpbnQgbWVtYmVyRmxhZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlW10gZ2V0UmVzb3VyY2VzKFN0cmluZyBhUmVzb3VyY2VUeXBlKTsJCi19Ci0gCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkNDQ0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotLyoqCi0gKiBSZXByZXNlbnRzIGEgZmlsZSB0aGF0IGNhbiBiZSBuYXZpZ2F0ZWQgdGhyb3VnaCAKLSAqIGFuIGFic3RyYWN0ICgidmlydHVhbCIpIHBhdGguIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWaXJ0dWFsRmlsZSBleHRlbmRzIElWaXJ0dWFsUmVzb3VyY2UgeyAgCi0JLyoqCi0JICogcmV0dXJucyB0aGUgdW5kZXJseWluZyBJRmlsZSwgcmV0dXJucyBmaXJzdCBJRmlsZSBpZiBtdWx0aXBsZSBleGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIElGaWxlCi0JICovCi0JcHVibGljIElGaWxlIGdldFVuZGVybHlpbmdGaWxlKCk7Ci0JLyoqCi0JICogcmV0dXJucyB0aGUgYXJyYXkgb2YgdW5kZXJseWluZyBJRmlsZXMgdGhhdCBhcmUgbWFwcGVkIHRvIHRoZSBzYW1lIHJ1bnRpbWUgcGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB1bmRlcmx5aW5nIElGaWxlcyBtYXBwZWQgdG8gdGhlIHJ1bnRpbWUgcGF0aAotCSAqLwotCXB1YmxpYyBJRmlsZVtdIGdldFVuZGVybHlpbmdGaWxlcygpOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbEZvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbEZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTE5ZTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotLyoqCi0gKiBSZXByZXNlbnRzIGEgZm9sZGVyIHRoYXQgY2FuIGJlIG5hdmlnYXRlZCB0aHJvdWdoIAotICogYW4gYWJzdHJhY3QgKCJ2aXJ0dWFsIikgcGF0aC4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlydHVhbEZvbGRlciBleHRlbmRzIElWaXJ0dWFsQ29udGFpbmVyIHsgCi0JLyoqCi0JICogcmV0dXJucyB0aGUgdW5kZXJseWluZyBJRm9sZGVyIG1hcHBlZCB0byB0aGUgcnVudGltZSBwYXRoLCAKLQkgKiByZXR1cm5zIGZpcnN0IElGb2xkZXIgaWYgbXVsdGlwbGUgZXhpc3QuCi0JICogCi0JICogQHJldHVybiB0aGUgdW5kZXJseWluZyBJRm9sZGVyCi0JICovCi0JcHVibGljIElDb250YWluZXIgZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCS8qKgotCSAqIHJldHVybnMgdGhlIHVuZGVybHlpbmcgSUZvbGRlcnMgbWFwcGVkIHRvIHRoZSBydW50aW1lIHBhdGguIAotCSAqIE11bHRpcGxlIElGb2xkZXJzIGNhbiBiZSBtYXBwZWQgdG8gdGhlIHNhbWUgcnVudGltZSBwYXRoLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHVuZGVybHlpbmcgSUZvbGRlcnMKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsUmVmZXJlbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZjIyNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIGNvbXBvbmVudHM6IEVuY2xvc2luZ0NvbXBvbmVudC0+UmVmZXJlbmNlZENvbXBvbmVudC4gCi0gKiA8cD4KLSAqIFRoZSBSZWZlcmVuY2VkQ29tcG9uZW50IG1heSBleGlzdCBpbiBhbm90aGVyIHByb2plY3Qgb3IgYXMgYSBiaW5hcnkgZm9ybSBvbiB0aGUgY2xhc3NwYXRoIAotICogb2YgdGhlIHByb2plY3QuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlydHVhbFJlZmVyZW5jZSB7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoYXQgdGhlIGRlcGVuZGVuY3kgc2hvdWxkIGJlIGFyY2hpdmVkIGludG8gYSAqLj9hciBmb3JtYXQgYmVmb3JlIGJlaW5nIGFic29yYmVkLgotCSAqLwotCWludCBERVBFTkRFTkNZX1RZUEVfVVNFUyA9IERlcGVuZGVuY3lUeXBlLlVTRVM7Ci0JLyoqCi0JICogSW5kaWNhdGVzIHRoYXQgdGhlIGRlcGVuZGVuY3kgd2lsbCBiZSBhYnNvcmJlZCBhcyBpcyB3aXRob3V0IGFyY2hpdmluZy4gCi0JICovCi0JaW50IERFUEVOREVOQ1lfVFlQRV9DT05TVU1FUyA9IERlcGVuZGVuY3lUeXBlLkNPTlNVTUVTOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhpcyB2aXJ0dWFsIHJlZmVyZW5jZSBpbiBtb2RlbCwgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgotCSAqIEBwYXJhbSB1cGRhdGVGbGFncyBDdXJyZW50bHkgbm8gdXBkYXRlIGZsYWdzIGFwcGx5LiAKLQkgKiBAcGFyYW0gYU1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yIHRvIHRyYWNrIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByZWZlcmVuY2UgYWN0dWFsIGV4aXN0cyBpbiB0aGUgbW9kZWwKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyByZWZlcmVuY2UgYWN0dWFsIGV4aXN0cyBpbiB0aGUgbW9kZWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKTsKLQkKLQkvKioKLQkgKiBUaGUgcnVudGltZSBwYXRoIGluZGljYXRlcyB3aGVyZSB0aGUgY29udGVudHMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgKiBjb21wb25lbnQgd2lsbCBiZSBhYnNvcmJlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGVuY2xvc2luZyBjb21wb25lbnQuCi0JICogQHBhcmFtIGFSdW50aW1lUGF0aCBBIHZhbHVlIGNvbXBvbmVudC1yZWxhdGl2ZSBwYXRoLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lUGF0aChJUGF0aCBhUnVudGltZVBhdGgpOwotCS8qKgotCSAqIFRoZSBydW50aW1lIHBhdGggaW5kaWNhdGVzIHdoZXJlIHRoZSBjb250ZW50cyBvZiB0aGUgcmVmZXJlbmNlZAotCSAqIGNvbXBvbmVudCB3aWxsIGJlIGFic29yYmVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgZW5jbG9zaW5nIGNvbXBvbmVudC4KLQkgKiBAcmV0dXJuIEEgdmFsdWUgY29tcG9uZW50LXJlbGF0aXZlIHBhdGguIAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aCgpOwotCQotCS8qKgotCSAqIFRoZSBkZXBlbmRlbmN5VHlwZSBpbmRpY2F0ZXMgaG93IHRoZSBjb250ZW50cyBvZiB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQgd2lsbCBiZSBhYnNvcmJlZC4KLQkgKiBAcGFyYW0gYURlcGVuZGVuY3lUeXBlIE9uZSBvZiBERVBFTkRFTkNZX1RZUEVfVVNFUyBvciBERVBFTkRFTkNZX1RZUEVfQ09OU1VNRVMKLQkgKiBAc2VlICNERVBFTkRFTkNZX1RZUEVfQ09OU1VNRVMKLQkgKiBAc2VlICNERVBFTkRFTkNZX1RZUEVfVVNFUwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGVuZGVuY3lUeXBlKGludCBhRGVwZW5kZW5jeVR5cGUpOwotCQotCi0JLyoqCi0JICogQHJldHVybiBPbmUgb2YgREVQRU5ERU5DWV9UWVBFX1VTRVMgb3IgREVQRU5ERU5DWV9UWVBFX0NPTlNVTUVTCi0JICogQHNlZSAjREVQRU5ERU5DWV9UWVBFX0NPTlNVTUVTCi0JICogQHNlZSAjREVQRU5ERU5DWV9UWVBFX1VTRVMKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlcGVuZGVuY3lUeXBlKCk7Ci0JCi0JLyoqCi0JICogVGhlIGVuY2xvc2luZyBjb21wb25lbnQgY29udGFpbnMgdGhpcyByZWZlcmVuY2UsIGFuZCB3aWxsIGFic29yYiB0aGUgY29udGVudHMgb2YgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50Ci0JICogQHJldHVybiBUaGUgZW5jbG9zaW5nIGNvbXBvbmVudAotCSAqLwotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRFbmNsb3NpbmdDb21wb25lbnQoKTsKLQkKLQkvKioKLQkgKiBUaGUgcmVmZXJlbmNlZCBjb21wb25lbnQgaXMgInRhcmdldGVkIiBieSB0aGUgcmVmZXJlbmNlLCBhbmQgd2lsbCBiZSBhYnNvcmJlZCBieSB0aGUgZW5jbG9zaW5nIGNvbXBvbmVudC4gCi0JICogQHJldHVybiB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50IHRoYXQgaXMgInRhcmdldGVkIiBieSB0aGUgcmVmZXJlbmNlIGFuZCB3aWxsIGJlIGFic29yYmVkIGJ5IHRoZSBlbmNsb3NpbmcgY29tcG9uZW50LiAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZENvbXBvbmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCwgRU9iamVjdCBkZXBlbmRlbnRPYmplY3QpOwotCQotCQotCS8qKgotCSAqIEdldCB0aGUgYXJjaGl2ZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFyY2hpdmVOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGFyY2hpdmUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQKLQkgKiBAcGFyYW0gYXJjaGl2ZU5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlTmFtZShTdHJpbmcgYXJjaGl2ZU5hbWUpOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlOGUxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotCi0KLS8qKgotICogPHA+Ci0gKiBBbGxvd3MgY2xpZW50cyB0byB3b3JrIHdpdGggZmxleGlibGUgcHJvamVjdCBzdHJ1Y3R1cmVzIAotICogdXNpbmcgQVBJIHNpbWlsYXIgdG8gdGhlIEVjbGlwc2UgUGxhdGZvcm0gSVJlc291cmNlIG1vZGVsLgotICogPC9wPgotICogPHA+Ci0gKiBJVmlydHVhbFJlc291cmNlIGFsbG93cyByZXNvdXJjZXMgdG8gYmUgYWNjZXNzZWQgdGhyb3VnaCBhCi0gKiBhYnN0cmFjdCBwYXRoIHJlZmVycmVkIHRvIGFzIGEgInJ1bnRpbWUgcGF0aCIuIAotICogQSB2aXJ0dWFsIHJlc291cmNlIG1heSByZXByZXNlbnQgbXVsdGlwbGUgdW5kZXJseWluZyByZXNvdXJjZXMuCi0gKiBBIHZpcnR1YWwgcmVzb3VyY2UgaXMgY29udGFpbmVkIGJ5IGV4YWN0bHkgb25lIGNvbXBvbmVudC4KLSAqIEEgcmVzb3VyY2UgbWF5IGJlIHJlcHJlc2VudGVkIGJ5IG11bHRpcGxlIHZpcnR1YWwgcmVzb3VyY2VzLCB3aGljaAotICogbWF5IGJlIGNvbnRhaW5lZCBieSBvbmUgb3IgbW9yZSBjb21wb25lbnRzLiAKLSAqIDwvcD4KLSAqIDxwPgotICogSVZpcnR1YWxSZXNvdXJjZSBhbGxvd3MgY2xpZW50cyB0byBhY3F1aXJlCi0gKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBpbmNsdWRpbmcgdGhlIG5hbWUsIAotICogYW5kIHRoZSBwYXRocyB3aGljaCBhcmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgcmVzb3VyY2UsIHN1Y2gKLSAqIGFzIHRoZSB7QGxpbmsgI2dldFJ1bnRpbWVQYXRoKCkgcnVudGltZSBwYXRofSwgdGhlIAotICoge0BsaW5rICNnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aH0KLSAqIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLCBhbmQgdGhlIAotICoge0BsaW5rICNnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgcHJvamVjdC1yZWxhdGl2ZSBwYXRofQotICogb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKiA8L3A+Ci0gKiA8YSBuYW1lPSJyZWZlcmVuY2VzIiAvPgotICogPHA+RWFjaCBJVmlydHVhbFJlc291cmNlIGNhbiByZXByZXNlbnQgYW4gPGI+aW1wbGljaXQ8L2I+IHJlZmVyZW5jZSBvcgotICogYW4gPGI+ZXhwbGljaXQ8L2I+IHJlZmVyZW5jZS4gQW4gPGI+ZXhwbGljaXQ8L2I+IHJlZmVyZW5jZSBpcyBhIGZvcm1hbAotICogbWFwcGluZyBmcm9tIHNvbWUgcGF0aCB3aXRoaW4gdGhlIGZpbGUgc3RydWN0dXJlIHRvIGEgcnVudGltZSBwYXRoLiBDaGFuZ2luZwotICogb3IgcmVtb3ZpbmcgYW4gZXhwbGljaXQgcmVmZXJlbmNlIG9ubHkgcmVxdWlyZXMgbW9kZWwgbW9kaWZpY2F0aW9ucy4gQW4gCi0gKiA8Yj5pbXBsaWNpdDwvYj4gcmVmZXJlbmNlIGhhcyBhIHJvb3Qgd2hpY2ggaXMgZGVyaXZlZCBmcm9tIGFuIGV4cGxpY2l0IHBhdGgsCi0gKiBidXQgc29tZSBmcmFnbWVudCBvZiB0aGUgcGF0aCB0b3dhcmRzIHRoZSBlbmQgaXMgZGVyaXZlZCBmcm9tIHRoZSBsaXRlcmFsIAotICogcGF0aCB3aXRoaW4gdGhlIGZpbGUgc3RydWN0dXJlLiBNb2RpZmljYXRpb25zIHRvIGltcGxpY2l0IHBhdGhzIG1heSBjYXVzZSAKLSAqIGNoYW5nZXMgdG8gc3RydWN0dXJlIG9uIGRpc2suIEZvciByZXNvdXJjZSBtb2RpZmljYXRpb25zIHRoYXQgc2hvdWxkIG5vdCBtb2RpZnkKLSAqIHN0cnVjdHVyZXMgb24gZGlzaywgdXNlIHtAbGluayAjSUdOT1JFX1VOREVSTFlJTkdfUkVTT1VSQ0V9LgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWaXJ0dWFsUmVzb3VyY2UgZXh0ZW5kcyBJU2NoZWR1bGluZ1J1bGUsIElBZGFwdGFibGUgeyAgCi0JCQkJCQkJCQkJCQkJCQkJCQotCi0JLyoKLQkgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLQkgKiBDb25zdGFudHMgZGVmaW5pbmcgcmVzb3VyY2UgdHlwZXM6IFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIHJlc291cmNlIAotCSAqIHR5cGVzIGFuZCB0aGVpciB0eXBlIGNvbnN0YW50cyBhcmUgaW4gdGhlIGhleCByYW5nZSAweDEwIHRvIDB4ODAgCi0JICogYXMgZGVmaW5lZCBiZWxvdy4KLQkgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCSAqLwotCi0JLyoqCi0JICogVHlwZSBjb25zdGFudCAoYml0IG1hc2sgdmFsdWUgMTYpIHdoaWNoIGlkZW50aWZpZXMgZmlsZSByZXNvdXJjZXMuCi0JICogCi0JICogQHNlZSBJVmlydHVhbFJlc291cmNlI2dldFR5cGUoKQotCSAqIEBzZWUgSVZpcnR1YWxGaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRSA9IDB4MTA7Ci0KLQkvKioKLQkgKiBUeXBlIGNvbnN0YW50IChiaXQgbWFzayB2YWx1ZSAzMikgd2hpY2ggaWRlbnRpZmllcyBmb2xkZXIgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgSVZpcnR1YWxSZXNvdXJjZSNnZXRUeXBlKCkKLQkgKiBAc2VlIElWaXJ0dWFsRm9sZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9MREVSID0gMHgyMDsKLQotCS8qKgotCSAqIFR5cGUgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDY0KSB3aGljaCBpZGVudGlmaWVzIHRoZSByb290IHJlc291cmNlLgotCSAqIAotCSAqIEBzZWUgSVZpcnR1YWxSZXNvdXJjZSNnZXRUeXBlKCkKLQkgKiBAc2VlIElWaXJ0dWFsQ29udGFpbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UID0gMHg0MDsKLQkKLQkvKioKLQkgKiBHZW5lcmFsIHB1cnBvc2UgemVyby12YWx1ZWQgYml0IG1hc2sgY29uc3RhbnQuIFVzZWZ1bCB3aGVuZXZlciB5b3UgbmVlZCB0byBzdXBwbHkgYSBiaXQgbWFzawotCSAqIHdpdGggbm8gYml0cyBzZXQuCi0JICogPHA+Ci0JICogRXhhbXBsZSB1c2FnZTogPGNvZGU+Ci0JICogPHByZT4KLQkgKiBkZWxldGUoSVZpcnR1YWxSZXNvdXJjZS5OT05FLCBudWxsKQotCSAqIDwvcHJlPgotCSAqIDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBsYW5uZWRmb3IgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0KLQkvKgotCSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnN0YW50cyBmb3IgdXBkYXRlCi0JICogZmxhZ3MgZm9yIGRlbGV0ZSwgbW92ZSwgY29weSwgb3BlbiwgZXRjLjoKLQkgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCSAqLwotCi0JLyoqCi0JICogVXBkYXRlIGZsYWcgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDI1NikgaW5kaWNhdGluZyB0aGF0IHRoZSBvcGVyYXRpb24gc2hvdWxkIHByb2NlZWQgZXZlbiBpZgotCSAqIHRoZSByZXNvdXJjZSBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLQkgKiAKLQkgKiBAcGxhbm5lZGZvciAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JDRSA9IDB4MTAwOyAKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IGV4Y2x1c2lvbnMgZW51bWVyYXRlZCBpbiB0aGUgbW9kZWwgc2hvdWxkIGJlIGlnbm9yZWQuIChiaXQgbWFzayB2YWx1ZSA1MTIpICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJR05PUkVfRVhDTFVTSU9OUyA9IDB4MjAwOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoYXQgbW9kaWZpY2F0aW9ucyBzaG91bGQgb25seSBtb2RpZnkgdGhlIG1ldGFtb2RlbCBhbmQgaWdub3JlIHRoZSB1bmRlcmx5aW5nCi0JICogcmVzb3VyY2VzIHdoZXJlIGFwcGxpY2FibGUuICBTZWUgdGhlIAotCSAqIDxhIGhyZWY9IklWaXJ0dWFsUmVzb3VyY2UuaHRtbCNyZWZlcmVuY2VzIj5kb2N1bWVudGF0aW9uIG9uIHJlZmVyZW5jZXM8L2E+IAotCSAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHdoeSB0aGlzIGZsYWcgaXMgcmVsZXZhbnQuIChiaXQgbWFzayB2YWx1ZSAxMDI0KSAgCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUdOT1JFX1VOREVSTFlJTkdfUkVTT1VSQ0UgPSAweDQwMDsgIAotCQotCS8qKgotCSAqIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSB0aGUgc3VwcGxpZWQgbG9jYXRpb24gdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGlzIAotCSAqIHZpcnR1YWwgcmVzb3VyY2UuIE1vZGVsIGNoYW5nZXMgd2lsbCBvY2N1ciBhcyBhIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCwgCi0JICogYW5kIHBvdGVudGlhbGx5IHJlc291cmNlLWxldmVsIGNyZWF0aW9ucyBhcyB3ZWxsLgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24gQSBwcm9qZWN0IHJlbGF0aXZlIGxvY2F0aW9uIHRoYXQgd2lsbCBiZSByZXByZXNlbnRlZCBieSB0aGUgcnVudGltZSBwYXRoIGFmdGVyIHRoaXMgY2FsbAotCSAqIEBwYXJhbSB1cGRhdGVGbGFncyBBIGJpdG1hc2sgb2YgZmxhZ3MgdG8gc3VwcGx5IHRvIHRoZSBtZXRob2QuIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlTGluayhJUGF0aCBhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIG1hcHBpbmcsIGlmIGl0IGV4aXN0cywgZnJvbSB0aGUgc3VwcGxpZWQgbG9jYXRpb24gdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGlzIAotCSAqIHZpcnR1YWwgcmVzb3VyY2UuIE1vZGVsIGNoYW5nZXMgd2lsbCBvY2N1ciBhcyBhIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCwgCi0JICogYW5kIHBvdGVudGlhbGx5IHJlc291cmNlLWxldmVsIGNyZWF0aW9ucyBhcyB3ZWxsLgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24gQSBwcm9qZWN0IHJlbGF0aXZlIGxvY2F0aW9uIHdob3NlIG1hcHBpbmcgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGlzIG9iamVjdCBzaG91bGQgYmUgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MgQSBiaXRtYXNrIG9mIGZsYWdzIHRvIHN1cHBseSB0byB0aGUgbWV0aG9kLiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpbmsoSVBhdGggYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkKLQkvKiogICAKLQkgKiBSZW1vdmUgdGhlIHJlc291cmNlIGZyb20gdGhlIGZsZXhpYmxlIHN0cnVjdHVyZS4gUmVtb3ZpbmcgdGhlIHJlc291cmNlIGNvdWxkIHJlcXVpcmUKLQkgKiBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIG1ldGFtb2RlbCBvciBjaGFuZ2VzIHRvIHRoZSBmaWxlIHN0cnVjdHVyZS4gVG8gYXZvaWQKLQkgKiBjaGFuZ2VzIHRoZSBhY3R1YWwgZGlzayBzdHJ1Y3R1cmUsIHVzZSB7QGxpbmsgI0lHTk9SRV9VTkRFUkxZSU5HX1JFU09VUkNFfS4KLQkgKiA8cD4KLQkgKiBVcGRhdGUgZmxhZ3Mgc3VwcGxpZWQgdG8gdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXNzZWQgaW50byBhbnkgSVJlc291cmNlIG1vZGlmaWNhdGlvbgotCSAqIEFQSSB3aGljaCBpcyBjYWxsZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBtZXRob2QncyBpbnZvY2F0aW9uLiAgCi0JICogPC9wPgotCSAqIEBzZWUgI0lHTk9SRV9VTkRFUkxZSU5HX1JFU09VUkNFCi0JICogQHNlZSBJUmVzb3VyY2UjZGVsZXRlKGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbXBhcmVzIHR3byBvYmplY3RzIGZvciBlcXVhbGl0eTsgZm9yIHJlc291cmNlcywgZXF1YWxpdHkgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiB0aGVpcgotCSAqIGhhbmRsZXM6IHNhbWUgcmVzb3VyY2UgdHlwZSwgZXF1YWwgZnVsbCBwYXRocywgYW5kIGlkZW50aWNhbCB3b3Jrc3BhY2VzLiBSZXNvdXJjZXMgYXJlIG5vdAotCSAqIGVxdWFsIHRvIG9iamVjdHMgb3RoZXIgdGhhbiByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIG90aGVyCi0JICogICAgICAgICAgICB0aGUgb3RoZXIgb2JqZWN0Ci0JICogQHJldHVybiBhbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhlIG9iamVjdHMgYXJlIGVxdWFscwotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdmlydHVhbCByZXNvdXJjZSBpcyBiYWNrZWQgYnkgYW4gYWNjZXNzaWJsZSBJUmVzb3VyY2UuIAotCSAqIDxwPgotCSAqIDxjb2RlPklWaXJ0dWFsUmVzb3VyY2U8L2NvZGU+IG9iamVjdHMgYXJlIGxpZ2h0d2VpZ2h0IGhhbmRsZSBvYmplY3RzIHVzZWQgdG8gYWNjZXNzCi0JICogSVJlc291cmNlcy4gSG93ZXZlciwgaGF2aW5nIGFuIElWaXJ0dWFsUmVzb3VyY2UgaGFuZGxlIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhlCi0JICogdW5kZXJseWluZyByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGUgaGFuZGxlIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlLCBvciBpcyBhY2Nlc3NpYmxlLgotCSAqIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdGhlIGV4aXN0ZW5jZSBvciBhY2Nlc3NpYmlsaXR5IG9mIHRoZSB1bmRlcmx5aW5nIAotCSAqIHJlc291cmNlLCB7QGxpbmsgI2dldFVuZGVybHlpbmdSZXNvdXJjZSgpfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBleGlzdHMgYW5kIGlzIGFjY2Vzc2libGUsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSNleGlzdHMoKQotCSAqIEBzZWUgI2dldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBleHRlbnNpb24gcG9ydGlvbiBvZiB0aGlzIHZpcnR1YWwgcmVzb3VyY2UncyBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2VzCi0JICogbm90IGhhdmUgb25lLiBUaGUgZmlsZSBleHRlbnNpb24gb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2Ugd2lsbCBiZSByZXR1cm5lZCwgd2hpY2ggbWF5IG9yIG1heSBub3QgbWF0Y2gKLQkgKiB0aGF0IG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLiAKLQkgKiA8cD4KLQkgKiBUaGUgZmlsZSBleHRlbnNpb24gcG9ydGlvbiBpcyBkZWZpbmVkIGFzIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0IHBlcmlvZCAoIi4iKSBjaGFyYWN0ZXIKLQkgKiBpbiB0aGUgbmFtZS4gSWYgdGhlcmUgaXMgbm8gcGVyaW9kIGluIHRoZSBuYW1lLCB0aGUgcGF0aCBoYXMgbm8gZmlsZSBleHRlbnNpb24gcG9ydGlvbi4gSWYKLQkgKiB0aGUgbmFtZSBlbmRzIGluIGEgcGVyaW9kLCB0aGUgZmlsZSBleHRlbnNpb24gcG9ydGlvbiBpcyB0aGUgZW1wdHkgc3RyaW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgdGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGZpbGUgZXh0ZW5zaW9uCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxsLCBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2UuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IHRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4gSWYgdGhpcyByZXNvdXJjZSBkb2VzCi0JICogZXhpc3QsIGl0cyBwYXRoIGNhbiBiZSBzYWZlbHkgYXNzdW1lZCB0byBiZSB2YWxpZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGlzIHJlc291cmNlCi0JICogQHNlZSAjZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0RnVsbFBhdGgoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQotCi0JLyoqCi0JICogUmV0dXJucyBhIHJlbGF0aXZlIHBhdGggb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugd2l0aCByZXNwZWN0IHRvIGl0cyBwcm9qZWN0LiAgCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IHRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4gSWYgdGhpcyByZXNvdXJjZSBkb2VzCi0JICogZXhpc3QsIGl0cyBwYXRoIGNhbiBiZSBzYWZlbHkgYXNzdW1lZCB0byBiZSB2YWxpZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogUHJvamVjdC1yZWxhdGl2ZSBwYXRocyBhcmUgcmVjb21tZW5kZWQgb3ZlciBhYnNvbHV0ZSBwYXRocywgc2luY2UgdGhlIGZvcm1lciBhcmUgbm90IGFmZmVjdGVkCi0JICogaWYgdGhlIHByb2plY3QgaXMgcmVuYW1lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGlzIHJlc291cmNlIHdpdGggcmVzcGVjdCB0byBpdHMgcHJvamVjdAotCSAqIEBzZWUgI2dldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpCi0JICovCi0JcHVibGljIElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGlzIHZpcnR1YWwgcmVzb3VyY2UuIFRoZSBydW50aW1lIHBhdGgKLQkgKiBpcyBkZXRlcm1pbmVkIHRocm91Z2ggdGhlIG1ldGFtb2RlbCBhbmQgcmVwcmVzZW50cyB0aGUgcGF0aCB0aGF0IHRoZQotCSAqIHVuZGVybHlpbmcgcmVzb3VyY2Ugd2lsbCBiZSBhY2Nlc3NlZCBhdCBydW50aW1lLiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIHBhdGggb2YgdGhpcyB2aXJ0dWFsIHJlc291cmNlCi0JICovCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgdmlydHVhbCByZXNvdXJjZS4gVGhlIG5hbWUgb2YgYSB2aXJ0dWFsIHJlc291cmNlIAotCSAqIGlzIHN5bm9ueW1vdXMgd2l0aCB0aGUgbGFzdCBzZWdtZW50IG9mIGl0cyBydW50aW1lIHBhdGguCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IHRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhpcyByZXNvdXJjZSBleGlzdHMsIGl0cyBuYW1lIGNhbiBiZSBzYWZlbHkgYXNzdW1lZCB0byBiZSB2YWxpZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdmlydHVhbCByZXNvdXJjZQotCSAqIEBzZWUgI2dldFJ1bnRpbWVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5zIHRoaXMgdmlydHVhbCByZXNvdXJjZS4KLQkgKiA8cD4KLQkgKiBFYWNoIHZpcnR1YWwgcmVzb3VyY2UgaXMgY29udGFpbmVkIGJ5IGF0IGxlYXN0IG9uZSBjb21wb25lbnQuIEEgY29tcG9uZW50Ci0JICogcmVwcmVzZW50cyBhIGxvZ2ljYWwgY29sbGVjdGlvbiBvZiBmaWxlcy4gSWYgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgaXMgCi0JICogY29udGFpbmVkIGJ5IG11bHRpcGxlIGNvbXBvbmVudHMsIHRoZW4gdGhlIGNvbXBvbmVudCBuYW1lIHJldHVybmVkIGJ5Ci0JICogdGhpcyBtZXRob2Qgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IGhvdyB0aGUgdmlydHVhbCByZXNvdXJjZSB3YXMgY3JlYXRlZC4gCi0JICogRm9yIGVhY2ggdmlydHVhbCByZXNvdXJjZSwgdGhlIGNvbXBvbmVudCBuYW1lIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIAotCSAqIGNvbXBvbmVudCBuYW1lIG9mIHRoZSBwYXJlbnQuCi0JICogIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5zIHRoZSB2aXJ0dWFsIHJlc291cmNlCi0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmlydHVhbCByZXNvdXJjZSB3aGljaCBjb250YWlucyB0aGlzIHZpcnR1YWwgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhcwotCSAqIG5vIHBhcmVudCAodGhhdCBpcywgdGhlIHZpcnR1YWwgcmVzb3VyY2UgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgY29tcG9uZW50KS4KLQkgKiA8cD4KLQkgKiBUaGUgZnVsbCBwYXRoIG9mIHRoZSBwYXJlbnQgcmVzb3VyY2UgaXMgdGhlIHNhbWUgYXMgdGhpcyByZXNvdXJjZSdzIGZ1bGwgcGF0aCB3aXRoIHRoZSBsYXN0Ci0JICogc2VnbWVudCByZW1vdmVkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgbmVpdGhlciB0aGUgcmVzb3VyY2Ugbm9yIHRoZSByZXN1bHRpbmcgcmVzb3VyY2UgbmVlZAotCSAqIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250YWluZXIgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgdmlydHVhbCByZXNvdXJjZSByZXByZXNlbnRzIHRoZSByb290IG9mIHRoZSBjb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxDb250YWluZXIgZ2V0UGFyZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBjb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhpcyB2aXJ0dWFsIHJlc291cmNlLiAKLQkgKiA8cD4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCBtYXkgbm90IChhbmQgbW9zdCBsaWtlbHkgd2lsbCBub3QpIGJlIHJlZmVyZW5jZWQgaW4gdGhlIAotCSAqIHJ1bnRpbWUgcGF0aCBvZiB0aGlzIHZpcnR1YWwgcGF0aCwgYnV0IHdpbGwgYmUgcmVmZXJlbmNlZCBieSB0aGUgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGguIAotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgbmVpdGhlciB0aGUgcmVzb3VyY2Ugbm9yIHRoZSByZXN1bHRpbmcgcHJvamVjdCBuZWVkCi0JICogZXhpc3QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgaGFuZGxlCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyByZXNvdXJjZS4gVGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgb25lIG9mIDxjb2RlPkZJTEU8L2NvZGU+LAotCSAqIDxjb2RlPkZPTERFUjwvY29kZT4sIDxjb2RlPkNPTVBPTkVOVDwvY29kZT4KLQkgKiA8cD4KLQkgKiA8dWw+Ci0JICogPGxpPiBBbGwgcmVzb3VyY2VzIG9mIHR5cGUgPGNvZGU+RklMRTwvY29kZT4gaW1wbGVtZW50IDxjb2RlPklWaXJ0dWFsRmlsZTwvY29kZT4uPC9saT4KLQkgKiA8bGk+IEFsbCByZXNvdXJjZXMgb2YgdHlwZSA8Y29kZT5GT0xERVI8L2NvZGU+IGltcGxlbWVudCA8Y29kZT5JVmlydHVhbEZvbGRlcjwvY29kZT4uPC9saT4KLQkgKiA8bGk+IEFsbCByZXNvdXJjZXMgb2YgdHlwZSA8Y29kZT5DT01QT05FTlQ8L2NvZGU+IGltcGxlbWVudCA8Y29kZT5JVmlydHVhbENvbnRhaW5lcjwvY29kZT4uPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgdGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyByZXNvdXJjZQotCSAqIEBzZWUgI0ZJTEUKLQkgKiBAc2VlICNGT0xERVIKLQkgKiBAc2VlICNDT01QT05FTlQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKTsKLQkKLQkvKioKLQkgKiBBIHZpcnR1YWwgcmVzb3VyY2UgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBvbmUgb3IgbW9yZSBFY2xpcHNlIFBsYXRmb3JtIHJlc291cmNlcy4gCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgInByaW1hcnkiIHVuZGVybHlpbmcgcmVzb3VyY2UuIFRoZSByZXNvdXJjZSBtYXkgb3IgbWF5IG5vdCBleGlzdC4gVGhlIHJlc291cmNlCi0JICogd2lsbCBiZSBjb250YWluZWQgYnkgdGhlIHByb2plY3QgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRQcm9qZWN0KCl9LiAgCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFNpbmNlIGEgdmlydHVhbCByZXNvdXJjZSBjb3VsZCByZXByZXNlbnQgbXVsdGlwbGUgcmVzb3VyY2VzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAKLQkgKiB0aGUgInByaW1hcnkiIHJlc291cmNlLiBGb3IgY2xpZW50cyB0aGF0IHdpc2ggdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG11bHRpcGxlIHJlc291cmNlcwotCSAqIGF0IGEgc2luZ2xlIHBhdGgsIHVzZSB7QGxpbmsgI2dldFVuZGVybHlpbmdSZXNvdXJjZXMoKX0uIAotCSAqIEByZXR1cm4gVGhlIHByaW1hcnkgcmVzb3VyY2UgdGhhdCBiYWNrcyB0aGlzIHZpcnR1YWwgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkKLQkvKioKLQkgKiBBIHZpcnR1YWwgcmVzb3VyY2UgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBvbmUgb3IgbW9yZSBFY2xpcHNlIFBsYXRmb3JtIHJlc291cmNlcy4gCi0JICogPHA+Ci0JICogUmV0dXJucyBhbGwgdW5kZXJseWluZyByZXNvdXJjZXMuIFRoZSByZXNvdXJjZXMgbWF5IG9yIG1heSBub3QgZXhpc3QuIFRoZSByZXNvdXJjZXMKLQkgKiB3aWxsIGJlIGNvbnRhaW5lZCBieSB0aGUgcHJvamVjdCByZXR1cm5lZCBieSB7QGxpbmsgI2dldFByb2plY3QoKX0uICAKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogU2luY2UgYSB2aXJ0dWFsIHJlc291cmNlIGNvdWxkIHJlcHJlc2VudCBtdWx0aXBsZSByZXNvdXJjZXMsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIAotCSAqIGFsbCB1bmRlcmx5aW5nIHJlc291cmNlcy4gRm9yIGNsaWVudHMgdGhhdCBwcmVmZXIgdG8gYWNrbm93bGVkZ2Ugb25seSBvbmUgcmVzb3VyY2UsIAotCSAqIGF0IGEgc2luZ2xlIHBhdGgsIHVzZSB7QGxpbmsgI2dldFVuZGVybHlpbmdSZXNvdXJjZSgpfS4gCi0JICogQHJldHVybiBBbGwgcmVzb3VyY2VzIHRoYXQgYmFjayB0aGlzIHZpcnR1YWwgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIElSZXNvdXJjZVtdIGdldFVuZGVybHlpbmdSZXNvdXJjZXMoKTsgCi0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlLiBGb3IgZmlsZXMgYW5kIGZvbGRlcnMsIHRoaXMgaXMgZXF1aXZhbGVudCB0bwotCSAqIGV4aXN0aW5nOyBmb3IgcHJvamVjdHMsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBleGlzdGluZyBhbmQgYmVpbmcgb3Blbi4gVGhlIHdvcmtzcGFjZSByb290IGlzCi0JICogYWx3YXlzIGFjY2Vzc2libGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJlc291cmNlIGlzIGFjY2Vzc2libGUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqIEBzZWUgI2V4aXN0cygpCi0JICogQHNlZSBJUHJvamVjdCNpc09wZW4oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWNjZXNzaWJsZSgpOwotCQotCS8qKgotCSAqIFRoZSByZXNvdXJjZVR5cGUgcHJvdmlkZXMgbWV0YS1pbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZXMgb2YgY29udGVudCB0aGlzIHZpcnR1YWwgcmVzb3VyY2UgbWF5IHJlcHJlc2VudC4gRXhhbXBsZXMKLQkgKiBpbmNsdWRlICJqYXZhIiwgInJlc291cmNlcyIsICJicGVsIiwgZXRjLiAKLQkgKiA8cD4KLQkgKiBUaGUgcmVzb3VyY2VUeXBlIG1heSBiZSBudWxsLCBhbmQge0BsaW5rIElWaXJ0dWFsQ29tcG9uZW50fSB3aWxsIGFsd2F5cyByZXR1cm4gbnVsbCBmb3IgdGhpcyBtZXRob2QuIAotCSAqIDwvcD4KLQkgKiBAcmV0dXJuIEEgY2xpZW50LXNldCByZXNvdXJjZVR5cGUgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKTsKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2VUeXBlIHByb3ZpZGVzIG1ldGEtaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGVzIG9mIGNvbnRlbnQgdGhpcyB2aXJ0dWFsIHJlc291cmNlIG1heSByZXByZXNlbnQuIEV4YW1wbGVzCi0JICogaW5jbHVkZSAiamF2YSIsICJyZXNvdXJjZXMiLCAiYnBlbCIsIGV0Yy4gCi0JICogPHA+Ci0JICogVGhlIHJlc291cmNlVHlwZSBtYXkgYmUgbnVsbCwgYW5kIHtAbGluayBJVmlydHVhbENvbXBvbmVudH0gd2lsbCBhbHdheXMgcmV0dXJuIG51bGwgZm9yIHRoaXMgbWV0aG9kLiAKLQkgKiA8L3A+Ci0JICogQHBhcmFtIEEgY2xpZW50LXNldCByZXNvdXJjZVR5cGUgc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyBhUmVzb3VyY2VUeXBlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5MWJhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5tb2R1bGVjb3JlIHJlc291cmNlcyBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD4KLSAgICAgICAgVGhlIENvbXBvbmVudENvcmUgVmlydHVhbCBQYXRoIEFQSSBhbGxvd3MgY2xpZW50cyB0byBuYXZpZ2F0ZSAKLSAgICAgICAgbG9naWNhbCBjb2xsZWN0aW9ucyBvZiBmaWxlcyB3aXRoaW4gRWNsaXBzZSBwcm9qZWN0cyB1c2luZyBBUEkgCi0gICAgICAgIHNpbWlsYXIgdG8gdGhlIEVjbGlwc2UgSVJlc291cmNlIEFQSS4gCi0JCTwvcD4KLTxhIG5hbWU9InRvcCI+PC9hPjxhIG5hbWU9InZpcnR1YWwtcGF0aCI+PC9hPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNSIgY2VsbHBhZGRpbmc9IjIiIGJvcmRlcj0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGJnY29sb3I9IiMwMDgwYzAiIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIyIj48Yj48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiIGNvbG9yPSIjZmZmZmZmIj5WaXJ0dWFsIFBhdGggQVBJPC9mb250PjwvYj48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPEJSPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0JICAgICAgICBUaGUgVmlydHVhbCBQYXRoIEFQSSBwcm92aWRlcyBhIGZhY2FkZSB0byB0aGUgZmxleGlibGUgcHJvamVjdCBtb2RlbC4gCi0JICAgICAgICBFYWNoIElWaXJ0dWFsUmVzb3VyY2UgcmVwcmVzZW50cyBhIHJlc291cmNlIGZyb20gdGhlIHJ1bnRpbWUgY29tcG9uZW50IAotCSAgICAgICAgdW5kZXIgYSB2aXJ0dWFsIHJ1bnRpbWUgcGF0aC4gRWFjaCBJVmlydHVhbFJlc291cmNlIG1heSByZXByZXNlbnQgb25lIAotCSAgICAgICAgb3IgbW9yZSBFY2xpcHNlIFBsYXRmcm9tIHJlc291cmNlcyBsb2NhdGVkIGF0IHRoZSBzYW1lIHJ1bnRpbWUgcGF0aC4KLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgIAlFYWNoIElWaXJ0dWFsUmVzb3VyY2UgaXMgY29udGFpbmVkIGJ5IGV4YWN0bHkgb25lIElWaXJ0dWFsQ29tcG9uZW50LiAKLSAgICAgICAgCUhvd2V2ZXIsIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlcyB0aGF0IGFyZSByZXByZXNlbnRlZCBieSB0aGUgCi0gICAgICAgIAlJVmlydHVhbFJlc291cmNlIG1heSBiZSBjb250YWluZWQgYnkgbXVsdGlwbGUgSVZpcnR1YWxDb21wb25lbnRzLiAKLSAgICAgICAgCUlWaXJ0dWFsQ29tcG9uZW50cyBhcmUgY29udGFpbmVkIGJ5IElGbGV4aWJsZVByb2plY3RzLiBFYWNoCi0gICAgICAgIAlJRmxleGlibGVQcm9qZWN0IG1heSBjb250YWluIG9uZSBvciBtb3JlIElWaXJ0dWFsQ29tcG9uZW50cy4gCi0gICAgICAgIDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy9tYXBwaW5nLmpwZyI+PC9wPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpPkZpZ3VyZSAxOiBBIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiBhIHBvc3NpYmxlIG1hcHBpbmcgYmV0d2VlbiBhIFZpcnR1YWwgc3RydWN0dXJlIGFuZCBhIFBsYXRmb3JtIFJlc291cmNlIHN0cnVjdHVyZS48L2k+Ci08L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMTAiPgotPHRyPgotPHRkPgotPHA+Ci08aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXcvdmlydHVhbF9wYXRoX2FwaS5qcGciPjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPHA+Ci08aT5GaWd1cmUgMjogVmlydHVhbCBQYXRoIE1vZGVsPC9pPgotPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTlmNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5jb21wb25lbnQgY29yZSByZXNvdXJjZXMgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoZSBDb21wb25lbnRDb3JlIFZpcnR1YWwgUGF0aCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gbmF2aWdhdGUgCi0gICAgICAgIGxvZ2ljYWwgY29sbGVjdGlvbnMgb2YgZmlsZXMgd2l0aGluIEVjbGlwc2UgcHJvamVjdHMgdXNpbmcgQVBJIAotICAgICAgICBzaW1pbGFyIHRvIHRoZSBFY2xpcHNlIElSZXNvdXJjZSBBUEkuIAotCQk8L2Fic3RyYWN0PgotCi0JCTxhIG5hbWU9InRvcCIvPgotCQk8IS0tCi0JCTxwPgotCQkJVGhlIGZvbGxvd2luZyBkb2N1bWVudCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGVzZSB0b3BpY3M6Ci0JCQk8dWw+Ci0JCQkJPGxpPjxhIGhyZWY9IiN2aXJ0dWFsLXBhdGgiPlBvaW50ZXIgMTwvYT4gQSBkZXNjcmlwdGlvbjwvbGk+ICAKLQkJCTwvdWw+Ci0JCTwvcD4KLQkJLS0+Ci0JCTxhIG5hbWU9InZpcnR1YWwtcGF0aCIvPgotICAgICAgICA8aDI+VmlydHVhbCBQYXRoIEFQSTwvaDI+Ci0gICAgICAgIDxCUiAvPiAKLSAgICAgICAgPHA+Ci0JICAgICAgICBUaGUgVmlydHVhbCBQYXRoIEFQSSBwcm92aWRlcyBhIGZhY2FkZSB0byB0aGUgZmxleGlibGUgcHJvamVjdCBtb2RlbC4gCi0JICAgICAgICBFYWNoIElWaXJ0dWFsUmVzb3VyY2UgcmVwcmVzZW50cyBhIHJlc291cmNlIGZyb20gdGhlIHJ1bnRpbWUgY29tcG9uZW50IAotCSAgICAgICAgdW5kZXIgYSB2aXJ0dWFsIHJ1bnRpbWUgcGF0aC4gRWFjaCBJVmlydHVhbFJlc291cmNlIG1heSByZXByZXNlbnQgb25lIAotCSAgICAgICAgb3IgbW9yZSBFY2xpcHNlIFBsYXRmcm9tIHJlc291cmNlcyBsb2NhdGVkIGF0IHRoZSBzYW1lIHJ1bnRpbWUgcGF0aC4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLSAgICAgICAgCUVhY2ggSVZpcnR1YWxSZXNvdXJjZSBpcyBjb250YWluZWQgYnkgZXhhY3RseSBvbmUgSVZpcnR1YWxDb21wb25lbnQuIAotICAgICAgICAJSG93ZXZlciwgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZSAKLSAgICAgICAgCUlWaXJ0dWFsUmVzb3VyY2UgbWF5IGJlIGNvbnRhaW5lZCBieSBtdWx0aXBsZSBJVmlydHVhbENvbXBvbmVudHMuIAotICAgICAgICAJSVZpcnR1YWxDb21wb25lbnRzIGFyZSBjb250YWluZWQgYnkgSUZsZXhpYmxlUHJvamVjdHMuIEVhY2gKLSAgICAgICAgCUlGbGV4aWJsZVByb2plY3QgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUgSVZpcnR1YWxDb21wb25lbnRzLiAKLSAgICAgICAgPC9wPgotICAgICAgICA8aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXcvbWFwcGluZy5qcGciIAotICAgICAgICAJIGNhcHRpb249IkEgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgcG9zc2libGUgbWFwcGluZyBiZXR3ZWVuIGEgVmlydHVhbCBzdHJ1Y3R1cmUgYW5kIGEgUGxhdGZvcm0gUmVzb3VyY2Ugc3RydWN0dXJlLiIgCi0gICAgICAgIAkgd2lkdGg9IjYwMCIgaGVpZ2h0PSI0NjYiCi0gICAgICAgIAkgLz4KLSAgICAgICAgPGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L3ZpcnR1YWxfcGF0aF9hcGkuanBnIiBjYXB0aW9uPSJWaXJ0dWFsIFBhdGggTW9kZWwiIC8+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgPGNvZGVzbmlwcGV0IGNhcHRpb249IkFuIGV4YW1wbGUgc25pcHBldC4iPgotLi4uIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7IAotLi4uCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFrZUZsZXhpYmxlKElQcm9qZWN0IGFUYXJnZXRQcm9qZWN0KSB7Ci0gICAgTW9kdWxlQ29yZSBtb2R1bGVDb3JlSW5zdGFuY2UgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICAgIE1vZHVsZUNvcmVOYXR1cmUuYWRkTW9kdWxlQ29yZU5hdHVyZUlmTmVjZXNzYXJ5KGFUYXJnZXRQcm9qZWN0KTsKLSAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlID0gTW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yV3JpdGUoYVRhcmdldFByb2plY3QpOwotICAgICAgICAuLi4gd29yayB3aXRoIG1vZHVsZUNvcmVJbnN0YW5jZSBhbmQgdW5kZXJseWluZyBtb2RlbCAuLi4KLSAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlLnNhdmVJZk5lY2Vzc2FyeShhUHJvZ3Jlc3NNb25pdG9yKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgICBpZiAobW9kdWxlQ29yZUluc3RhbmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ICAgICAgICAKLSAgICAgICAgPC9jb2Rlc25pcHBldD4KLSAgICAgICAgPGNvZGVzbmlwcGV0IGNhcHRpb249IkFuIGV4YW1wbGUgc25pcHBldC4iPgotLi4uIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7IAotLi4uCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFrZUZsZXhpYmxlKElQcm9qZWN0IGFUYXJnZXRQcm9qZWN0KSB7Ci0gICAgTW9kdWxlQ29yZSBtb2R1bGVDb3JlSW5zdGFuY2UgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICAgIE1vZHVsZUNvcmVOYXR1cmUuYWRkTW9kdWxlQ29yZU5hdHVyZUlmTmVjZXNzYXJ5KGFUYXJnZXRQcm9qZWN0KTsKLSAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlID0gTW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yV3JpdGUoYVRhcmdldFByb2plY3QpOwotICAgICAgICAuLi4gd29yayB3aXRoIG1vZHVsZUNvcmVJbnN0YW5jZSBhbmQgdW5kZXJseWluZyBtb2RlbCAuLi4KLSAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlLnNhdmVJZk5lY2Vzc2FyeShhUHJvZ3Jlc3NNb25pdG9yKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgICBpZiAobW9kdWxlQ29yZUluc3RhbmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ICAgICAgICAKLSAgICAgICAgPC9jb2Rlc25pcHBldD4KLSAgICAgICAgLS0+Ci0JCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDBhODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyPUVjbGlwc2Uub3JnCi0KLUJ1bmRsZS1OYW1lLjAgPSBNb2R1bGVjb3JlIFBsdWctaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFiZjkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJjb21wb25lbnRjb3JlLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+ICAgCi0gICAKLSAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8IS0tIE1vZHVsZSBDb3JlIFByb2plY3QgTmF0dXJlIENvbnRyaWJ1dGlvbnMtLT4KLSAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iTW9kdWxlQ29yZU5hdHVyZSIKLSAgICAgICAgIG5hbWU9IldlYiBQcm9wZXJ0aWVzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hdHVyZXMiPgotICAgICAgPHJ1bnRpbWU+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmUiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3J1bnRpbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWwiPgotICAgICAgPGVkaXRNb2RlbAotICAgICAgICAgICAgZWRpdE1vZGVsSUQ9Im9yZy5lY2xpcHNlLndzdC5tb2R1bGVjb3JlLnN0cnVjdHVyYWxNb2RlbCIKLSAgICAgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlU3RydWN0dXJhbE1vZGVsRmFjdG9yeSI+Ci0gICAgICAgICA8ZWRpdE1vZGVsUmVzb3VyY2UKLSAgICAgICAgICAgICAgIGF1dG9sb2FkPSJmYWxzZSIKLSAgICAgICAgICAgICAgIFVSST0iLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Ii8+Ci0gICAgICA8L2VkaXRNb2RlbD4gCi0gICA8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAJCQk8ZmlsZS1hc3NvY2lhdGlvbgotCQkJCWNvbnRlbnQtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCQlmaWxlLW5hbWVzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCIvPgotCQkJPGZpbGUtYXNzb2NpYXRpb24KLQkJCQljb250ZW50LXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQkJZmlsZS1uYW1lcz0iLmNvbXBvbmVudCIvPgotCQkJPGZpbGUtYXNzb2NpYXRpb24KLQkJCQljb250ZW50LXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQkJZmlsZS1uYW1lcz0iLnd0cG1vZHVsZXMiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5pZ25vcmUiPgotCQk8aWdub3JlCi0gICAgICAgIGVuYWJsZWQ9InRydWUiCi0gICAgICAgIHBhdHRlcm49Ii5kZXBsb3lhYmxlcyIvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9IkNvbXBvbmVudFByb2plY3RNaWdyYXRvciIgbmFtZT0iQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yIiBzY2hlbWE9InNjaGVtYS9Db21wb25lbnRQcm9qZWN0TWlncmF0b3IuZXhzZCIvPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImFydGlmYWN0ZWRpdCIgbmFtZT0iQ29tcG9uZW50IEFydGlmYWN0IEVkaXQiIHNjaGVtYT0ic2NoZW1hL2FydGlmYWN0ZWRpdC5leHNkIi8+Ci0gICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29tcG9uZW50aW1wbCIgbmFtZT0iY29tcG9uZW50aW1wbCIgc2NoZW1hPSJzY2hlbWEvY29tcG9uZW50aW1wbC5leHNkIi8+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0icmVzb3VyY2VGYWN0b3JpZXMiIG5hbWU9IlJlc291cmNlIEZhY3RvcnkgQXNzb2NpYXRpb24gKEludGVybmFsKSIgc2NoZW1hPSJzY2hlbWEvcmVzb3VyY2VGYWN0b3JpZXMuZXhzZCIvPgotCQotCTwhLS0gQ29udHJpYnV0ZSBhIFVSSVJlc29sdmVyRXh0ZW5zaW9uIGZvciBmbGV4aWJsZSBwcm9qZWN0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnJlc29sdmVyRXh0ZW5zaW9ucyI+Ci0gICAgICA8cmVzb2x2ZXJFeHRlbnNpb24KLSAgICAgICAgICAgIHN0YWdlPSJwcmVub3JtYWxpemF0aW9uIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlc29sdmVyIj4KLSAgICAgICAgICAgIDxwcm9qZWN0TmF0dXJlIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSIgLz4KLQkJCTxwcm9qZWN0TmF0dXJlIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud2ViLlN0YXRpY1dlYk5hdHVyZSIvPgotICAgICAgPC9yZXNvbHZlckV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldERhdGFNb2RlbENvbmZpZ0FkYXB0ZXIkRmFjdG9yeSIgCi0gICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwiPgotICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQWN0aW9uQ29uZmlnIi8+Ci0gICAgPC9mYWN0b3J5PgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJNb2R1bGVDb3JlVmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iTW9kdWxlQ29yZSBWYWxpZGF0b3IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAJPHByb2plY3ROYXR1cmUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICA8L3Byb2plY3ROYXR1cmU+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3RwbW9kdWxlcyI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5jb21wb25lbnQiPgotICAgICAgICAgPC9maWx0ZXI+Ci0JCSAgIDxtYXJrZXJJZAotICAgICAgICAgICAgICAgCSAgIG1hcmtlcklkVmFsdWU9Ik1vZHVsZUNvcmVWYWxpZGF0b3JNYXJrZXIiPgotICAgICAgICAgPC9tYXJrZXJJZD4KLSAgICAgICAgIDxoZWxwZXIgICAgICAKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlQ29yZVZhbGlkYXRvckhlbHBlciI+Ci0gICAgICAgICA8L2hlbHBlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlQ29yZVZhbGlkYXRvciI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24KLSAgICAgICAgIGlkPSJNb2R1bGVDb3JlVmFsaWRhdG9yTWFya2VyIgotICAgICAgICAgbmFtZT0iTW9kdWxlQ29yZSBWYWxpZGF0aW9uIE1hcmtlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvcGVyc2lzdGVudD4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9Im93bmVyIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idmFsaWRhdGlvblNldmVyaXR5Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idGFyZ2V0T2JqZWN0Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0iZ3JvdXBOYW1lIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ibWVzc2FnZUlkIj4KLSAgICAgIDwvYXR0cmlidXRlPgotPC9leHRlbnNpb24+IAotCi0gICA8IS0tIFJlZ2lzdGVyIHRoZSBuYXR1cmUgaWQgd2l0aCB0aGUgRU1GTmF0dXJlIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLm5hdHVyZV9yZWdpc3RyYXRpb24iPgotICAgICAgPG5hdHVyZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLSAgICAgIDwvbmF0dXJlPgotICAgPC9leHRlbnNpb24+IAotICAKLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2VkMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL0NvbXBvbmVudFByb2plY3RNaWdyYXRvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIiBpZD0iQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yIiBuYW1lPSJDb21wb25lbnQgUHJvamVjdCBNaWdyYXRvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGFsbG93cyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgb2YgY29tcG9uZW50cyB0byBjb250cmlidXRlIG1pZ3JhdG9ycyBUaG9zZSBwbHVnaW5zIGhhdmUgZGVwZW5kZW5jaWVzIG9uIHRoZSBtb2R1bGVjb3JlIHBsdWdpbiwgYnV0IG5vdCB2aWNlIHZlcnNhLiBJbiBvcmRlciBmb3IgY29kZSBkZWZpbmVkIHdpdGhpbiB0aGUgbW9kdWxlY29yZSBwbHVnaW4gdG8gZXhlY3V0ZSB0aGVzZSBhY3Rpb25zLCB3ZSBuZWVkIHRoaXMgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtaWdyYXRvckV4dGVuc2lvbiIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1pZ3JhdG9yRXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIGZvciB0aGUgbWlncmF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9hcnRpZmFjdGVkaXQuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9hcnRpZmFjdGVkaXQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2Zjc0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvYXJ0aWZhY3RlZGl0LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiIGlkPSJhcnRpZmFjdGVkaXQiIG5hbWU9IkNvbXBvbmVudCBBcnRpZmFjdCBFZGl0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgaXMgZm9yIElOVEVSTkFMIHVzZSBvbmx5ISAgSXQgaXMgdXNlZCBmb3IgdGhlIGJhc2UgYXJ0aWZhY3QgZWRpdCB0eXBlcyBvbmx5LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludCAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYXJ0aWZhY3RlZGl0Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIHRoaXMgYXJ0aWZhY3RFZGl0IGNvbnRyaWJ1dGVzIHRvLCBmb3IgZXhhbXBsZSwgdGhlIGZhY2V0IGlkIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCBwcm9qZWN0cyB3aGljaCBzaG91bGQgdXNlIHRoaXMgYXJ0aWZhY3RFZGl0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgYXJ0aWZhY3QgZWRpdCBjbGFzcyBpbXBsZW1lbnRhdGlvbiB3aGljaCBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9jb21wb25lbnRDb3JlLnhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9jb21wb25lbnRDb3JlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODgyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvY29tcG9uZW50Q29yZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvbW9kdWxlQ29yZSIgeG1sbnM6dG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL21vZHVsZUNvcmUiPg0KLQk8ZWxlbWVudCBuYW1lPSJwcm9qZWN0LW1vZHVsZXMiPg0KLQkJPGNvbXBsZXhUeXBlPg0KLQkJCTxzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0JCQkJPGVsZW1lbnQgbmFtZT0id2ItbW9kdWxlIj4NCi0JCQkJCTxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8ZWxlbWVudCBuYW1lPSJtb2R1bGUtdHlwZSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQkJPGF0dHJpYnV0ZSBuYW1lPSJtb2R1bGUtdHlwZS1pZCINCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQkJdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCTwvY29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTwvZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPGVsZW1lbnQgbmFtZT0id2ItcmVzb3VyY2UiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UtcGF0aCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8YXR0cmlidXRlIG5hbWU9ImRlcGxveS1wYXRoIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCTwvZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJPC9zZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPGVsZW1lbnQgbmFtZT0iZGVwZW5kZW50LW1vZHVsZSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8YXR0cmlidXRlIG5hbWU9ImhhbmRsZSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8YXR0cmlidXRlIG5hbWU9ImRlcGxveS1wYXRoIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iZGVwZW5kZW5jeS10eXBlIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCTwvZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJPC9zZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95LW5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+PC9hdHRyaWJ1dGU+DQotCQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCQk8L2VsZW1lbnQ+DQotCQkJPC9zZXF1ZW5jZT4NCi0JCQk8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPjwvYXR0cmlidXRlPg0KLQkJPC9jb21wbGV4VHlwZT4NCi0JPC9lbGVtZW50Pg0KLQ0KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9jb21wb25lbnRpbXBsLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvY29tcG9uZW50aW1wbC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjczMTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9jb21wb25lbnRpbXBsLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgaWQ9ImNvbXBvbmVudGltcGwiIG5hbWU9ImNvbXBvbmVudGltcGwiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29tcG9uZW50aW1wbCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9yZXNvdXJjZUZhY3Rvcmllcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL3Jlc291cmNlRmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDNiZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL3Jlc291cmNlRmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiIGlkPSJyZXNvdXJjZUZhY3RvcmllcyIgbmFtZT0iUmVzb3VyY2UgRmFjdG9yeSBBc3NvY2lhdGlvbiAoSW50ZXJuYWwpIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEFuICppbnRlcm5hbCogZXh0ZW5zaW9uIHBvaW50IHRoYXQgZGVjbGFyZXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIHNob3J0LXNlZ21lbnQgZmlsZW5hbWUgYW5kIGEgUmVzb3VyY2UuRmFjdG9yeS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVzb3VyY2VGYWN0b3J5Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlc291cmNlRmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQXNzb2NpYXRlcyBhIHNob3J0IG5hbWUgKGUuZy4gJnF1b3Q7d2ViLnhtbCZxdW90Oykgd2l0aCB0aGUgYXBwcm9wcmlhdGUgUmVzb3VyY2UuRmFjdG9yeSB0byBjcmVhdGUgdGhlIFJlc291cmNlIHR5cGUgd2hlbiBsb2FkaW5nIGZpbGVzIG9mIHRoZSBkZWNsYXJlZCBzaG9ydG5hbWUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlQmluZGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIERlY2xhcmVzIGFuIGltcGxlbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5Jmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2hvcnRTZWdtZW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIERlY2xhcmVzIHRoZSBzaG9ydCBzZWdtZW50IG9mIGEgZmlsZW5hbWUgdGhhdCB0aGUgcmVzb3VyY2UgZmFjdG9yeSBhcHBsaWVzIHRvIChlLmcuICZxdW90O3dlYi54bWwmcXVvdDspLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzRGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWYgbXVsdGlwbGUgZmFjdG9yaWVzIGFyZSBkZWNsYXJlZCBmb3IgdGhlIHNhbWUgZmlsZU5hbWUgLSB0aGVuIHRoZSAmcXVvdDtkZWZhdWx0JnF1b3Q7IGlzIHVzZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRUeXBlQmluZGluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iY29udGVudFR5cGVJZCIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBZHZlcnRpc2VzIHRoYXQgdGhlIGNvbnRhaW5pbmcgZWRpdG9yIHVuZGVyc3RhbmRzIHRoZSBnaXZlbiBjb250ZW50IHR5cGUgYW5kIGlzIHN1aXRhYmxlIGZvciBlZGl0aW5nIGZpbGVzIG9mIHRoYXQgdHlwZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY29udGVudCB0eXBlIGlkZW50aWZpZXIuIFRoaXMgaXMgYW4gSUQgZGVmaW5lZCBieSB0aGUgJmFwb3M7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyZhcG9zOyBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDgzODM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtc2VhcmNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Y3OWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXVpLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1NTdlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODMwMzg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jTW9uIEphbiAzMCAyMzo0MTo1OCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTZhNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gSmFuIDMwIDIzOjExOjQ5IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1M2QwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjMwMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9nczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvdmlzaW9uYWwuZWRpdG9ycwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9SRUFETUUudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzkzZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1VSSBVdGlsaXR5IGNsYXNzZXMgZm9yIGFjdGlvbnMsIGRyYWcnbidkcm9wIGFuZCB3aXphcmRzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NmE4NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtc2VhcmNoLwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Q5Y2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIKLQluYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JCi08IS0tCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9jb21tb24vb3ZlcnZpZXcuaHRtbCIgLz4gLS0+Ci0KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS52aWV3ZXJzIj4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJTZWxlY3RTaW5nbGVGaWxlVmlldyIgLz4gIC0tPiAgPCEtLSA/LCBkb2VzIGVjbGlwc2UgcHJvdmlkZSBiZXR0ZXIgc3VwcG9ydD8gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJSZXNvdXJjZUZpbHRlciIgLz4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJTZWxlY3RNdWx0aUZpbGVQYWdlIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlNlbGVjdFNpbmdsZUZpbGVQYWdlIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlRhYmxlTmF2aWdhdG9yIiAvPiAtLT4gICAgICAgPCEtLSBObywgc2hvdWxkIGJlIGluIGVjbGlwc2UgYmFzZSAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9Ik5hdmlnYWJsZVRhYmxlVmlld2VyIiAvPiAtLT4gPCEtLSBObywgc2hvdWxkIGJlIGluIGVjbGlwc2UgYmFzZSAtLT4KLTwhLS0JPC9wYWNrYWdlPiAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5hY3Rpb25oYW5kbGVyLmFjdGlvbiI+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iQ3V0QWN0aW9uIiAvPiAgLS0+ICAgIDwhLS0gTm8gdG8gdGhlc2UgZm91ciwgIHNob3VsZCBiZSByZW1vdmVkPyAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlBhc3RlQWN0aW9uIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkNvcHlBY3Rpb24iIC8+ICAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkVkaXRBY3Rpb24iIC8+IC0tPgotPCEtLQk8L3BhY2thZ2U+ICAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aSI+IC0tPgotPCEtLSAgCTx0eXBlIG5hbWU9IlVJUGx1Z2luIiAvPiAgLS0+ICAgIDwhLS0gTm8sIGRlbGV0ZSB0aGlzIC0tPgotPCEtLSAJPHR5cGUgbmFtZT0iT3ZlcmxheUljb25NYW5hZ2VyIiAvPiAgLS0+IDwhLS0gIE5vIC0tPgotPCEtLSAgCTx0eXBlIG5hbWU9IldpbmRvd1V0aWxpdHkiIC8+ICAtLT4gICA8IS0tIFJlbW92ZSBjbGFzcywgY2xlYW4gdXAgeHNkLnVpIC0tPgotPCEtLSAgICA8dHlwZSBuYW1lPSJJbWFnZUZhY3RvcnkiIC8+ICAtLT4gICA8IS0tIE5vIC0tPgotPCEtLQk8L3BhY2thZ2U+IC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLndpemFyZHMiPiAgLS0+Ci08IS0tICAJCTx0eXBlIG5hbWU9IkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24iIC8+ICAtLT4gIDwhLS0gcmVmZXJlbmNlZCBleHRlcm5hbGx5IG9ubHkgd2l0aGluIHBhY2thZ2UgKEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIC0tPgotPCEtLSAJCTx0eXBlIG5hbWU9IkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIiAvPiAtLT4gPCEtLSByZWZlcmVuY2VkIGV4dGVybmFsbHkgb25seSB3aXRoaW4gcGFja2FnZSAoRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCwgYW5kIE9wZXJhdGlvbiAtLT4KLTwhLS0gIAkJPHR5cGUgbmFtZT0iRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIgLz4gIC0tPiA8IS0tIHJlZmVyZW5jZWQgYnkgWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCwgd2hpY2ggaXMgZGVwcmVjYXRlZCBhbmQgZ29pbmcgdG8gYmUgcmVtb3ZlZCBpbiBNNCAgLS0+Ci08IS0tCTwvcGFja2FnZT4gLS0+Ci08IS0tCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZG5kIj4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJWaWV3ZXJEcm9wQWRhcHRlciIgLz4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iRHJhZ0FuZERyb3BDb21tYW5kIiAvPiAtLT4gIDwhLS0gcmVmZXJlbmNlZCBleHRlcm5hbGx5IG9ubHkgd2l0aGluIHBhY2thZ2UgLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJEcmFnQW5kRHJvcE1hbmFnZXIiIC8+IC0tPiAgPCEtLSAgIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iT2JqZWN0VHJhbnNmZXIiIC8+ICAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQiIC8+ICAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlZpZXdlckRyYWdBZGFwdGVyIiAvPiAtLT4KLTwhLS0JPC9wYWNrYWdlPiAgLS0+Ci08IS0tCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucmVzb3VyY2UiPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlJlc291cmNlRGVsZXRlTGlzdGVuZXIiIC8+ICAtLT4gIDwhLS0gbm8gcmVmZXJlbmNlcyAtLT4KLTwhLS0JPC9wYWNrYWdlPiAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5kaWFsb2dzIj4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iU2VsZWN0U2luZ2xlRmlsZURpYWxvZyIgLz4gIC0tPiAgICA8IS0tIE5vLCBzaG91bGQgbG9vayBpbnRvIGJhc2UgZm9yIHN1cHBvcnQ/IC0tPgotPCEtLQk8L3BhY2thZ2U+ICAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5hY3Rpb25oYW5kbGVyIj4KLQkJPHR5cGUgbmFtZT0iQWN0aW9uSGFuZGxlckxpc3RlbmVyIiAvPgotCTwvcGFja2FnZT4KLS0tPgotPCEtLSBwcm92aXNpb25hbCBBUElzIC0tPgotPCEtLQotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiPgotCQk8dHlwZSBuYW1lPSJVUklSZXNvbHZlclBsdWdpbiIgIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlVSSVJlc29sdmVyIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlVSSVJlc29sdmVyRXh0ZW5zaW9uIiBpbXBsZW1lbnQ9InRydWUiLz4KLQk8L3BhY2thZ2U+Ci0tLT4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9jb2xsYXBzZUFsbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvY29sbGFwc2VBbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRmZmU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9jb2xsYXBzZUFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvZXhwYW5kQWxsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9leHBhbmRBbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTk5NDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9leHBhbmRBbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL3NhdmVhc193aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL3NhdmVhc193aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTIzZDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9zYXZlYXNfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy90c2VhcmNoX2RwZG5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy90c2VhcmNoX2RwZG5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhMjFlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvdHNlYXJjaF9kcGRuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTJmMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLSEgUGx1Z2luIHByb3BlcnRpZXMKLXBsdWdpbk5hbWUgICAgICAgICAgICAgICA9IEVjbGlwc2UgQmFzZSBVSSBleHRlbnNpb25zCi1wbHVnaW5Qcm92aWRlciAgICAgICAgICAgPSBFY2xpcHNlLm9yZwotCi0hIFNlbGVjdFNpbmdsZUZpbGVQYWdlIGFuZCBTZWxlY3RNdWx0aUZpbGVQYWdlCi1fVUlfTEFCRUxfU09VUkNFX0ZJTEVTICAgPSBXb3Jrc3BhY2UgRmlsZXMKLV9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUyA9IFNlbGVjdGVkIEZpbGVzCi1fVUlfUE9QVVBfRVhQQU5EX0FMTAkgPSBFeHBhbmQgQWxsCi1fVUlfUE9QVVBfQ09MTEFQU0VfQUxMCSA9IENvbGxhcHNlIEFsbAotCQotX1VJX0lNUE9SVF9CVVRUT04gICAgICAgICAgPSBJbXBvcnQgRmlsZXMuLi4KLV9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQID0gSW1wb3J0IGZpbGVzIGZyb20gZmlsZSBzeXN0ZW0KLQotCi0hIFNlbGVjdE11bHRpRmlsZVBhZ2UKLSEgTk9URSBUTyBUUkFOU0xBVE9SOiB0aGUgZm9sbG93aW5nIHRocmVlIGxpbmVzIHJlZmVycyB0byBfVUlfTEFCRUxfU0VMRUNURURfRklMRVMgbGFiZWwgYWJvdmUKLV9VSV9BRERfQlVUVE9OX1RPT0xfVElQICAgID0gQWRkIGZpbGVzIHRvIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi1fVUlfUkVNT1ZFX0JVVFRPTl9UT09MX1RJUCA9IFJlbW92ZSBmaWxlcyBmcm9tIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi1fVUlfUkVNT1ZFX0FMTF9CVVRUT05fVE9PTF9USVAgPSAgUmVtb3ZlIGFsbCBmaWxlcyBmcm9tIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi0KLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBObyB0cmFuc2xhdGlvbiBuZWVkZWQgb2YgZm9sbG93aW5nIHRocmVlIGxpbmVzCi1fVUlfQUREX0JVVFRPTiAgICAgICAgICAgICA9ID4KLV9VSV9SRU1PVkVfQlVUVE9OICAgICAgICAgID0gPAotX1VJX1JFTU9WRV9BTExfQlVUVE9OICAgICAgPSA8PAotCi0hIFNlbGVjdEphdmFQcm9qZWN0VmlldwotX1VJX0xBQkVMX0NIT09TRV9GT0xERVIgPSBTZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlcjoKLQotISBTZWxlY3RKYXZhUHJvamVjdERpYWxvZwotX1VJX0xBQkVMX0ZPTERFUl9TRUxFQ1RJT04gPSBDb250YWluZXIgU2VsZWN0aW9uCi0KLSEgVGV4dFZpZXdlck9wZXJhdGlvbkFjdGlvbgotX1VJX01FTlVfQ09QWSAgICAgICAgID0gJkNvcHkKLV9VSV9NRU5VX0NVVCAgICAgICAgICA9IEN1JnQKLV9VSV9NRU5VX0RFTEVURSAgICAgICA9IERlbGV0ZQotX1VJX01FTlVfUEFTVEUgICAgICAgID0gJlBhc3RlCi1fVUlfTUVOVV9QUkVGSVggICAgICAgPSBQcmVmaXgKLV9VSV9NRU5VX1JFRE8gICAgICAgICA9IFJlZG8KLV9VSV9NRU5VX1NFTEVDVF9BTEwgICA9IFNlbGVjdCBBbGwKLV9VSV9NRU5VX1NISUZUX0xFRlQgICA9IFNoaWZ0IExlZnQKLV9VSV9NRU5VX1NISUZUX1JJR0hUICA9IFNoaWZ0IFJpZ2h0Ci1fVUlfTUVOVV9TVFJJUF9QUkVGSVggPSBTdHJpcCBQcmVmaXgKLV9VSV9NRU5VX1VORE8gICAgICAgICA9IFVuZG8KLQotISBTb3VyY2VWaWV3ZXJHb3RvTGluZUFjdGlvbgotX1VJX01FTlVfR09UT19MSU5FICAgICAgICAgICA9IEdvIFRvIExpbmUuLi4KLV9VSV9HT1RPX0xJTkVfRElBTE9HX1RJVExFICAgPSBHbyBUbyBMaW5lCi1fVUlfR09UT19MSU5FX0RJQUxPR19URVhUICAgID0gRW50ZXIgTGluZSBOdW1iZXIKLQotX1VJX0ZJTEVfQ0hBTkdFRF9USVRMRSA9IEZpbGUgQ2hhbmdlZAotX1VJX0ZJTEVfREVMRVRFRF9TQVZFX0NIQU5HRVMgPSBUaGUgZmlsZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBzYXZlIHlvdXIgY2hhbmdlcyBvciBjbG9zZSB0aGUgZWRpdG9yIHdpdGhvdXQgc2F2aW5nPwotX1VJX0ZJTEVfREVMRVRFRF9FRElUT1JfQ0xPU0VEID0gVGhlIGZpbGUgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbS4gVGhpcyBlZGl0b3Igd2lsbCBiZSBjbG9zZWQuCi1fVUlfRklMRV9DSEFOR0VEX0xPQURfQ0hBTkdFUyA9IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBsb2FkIHRoZSBjaGFuZ2VzPwotX1VJX1NBVkVfQlVUVE9OID0gU2F2ZQotX1VJX0NMT1NFX0JVVFRPTiA9IENsb3NlCi0KLQotISBYU0wgUHJlZmVyZXJlbmNlCi1fVUlfWFNMVF9TRUxFQ1QgICAgID0gU2VsZWN0IHdoaWNoIGVsZW1lbnQgdG8gdXNlIGZvciB5b3VyIHN0eWxlc2hlZXQKLV9VSV9YU0xUX1NUWUxFU0hFRVQgPSAmVXNlIDx4c2w6c3R5bGVzaGVldD4KLV9VSV9YU0xUX1RSQU5TRk9STSAgPSBVJnNlIDx4c2w6dHJhbnNmb3JtPgotCi0hIFhTTCBEZWJ1ZyBQcmVmZXJlcmVuY2UKLV9VSV9YU0xfREVCVUdfU0VMRUNUX0xBVU5DSEVSID0gU2V0IHRoZSBkZWZhdWx0IFhTTCBsYXVuY2hlciBmb3IgdGhlIFhTTCBEZWJ1Z2dpbmcgYW5kIFRyYW5zZm9ybWF0aW9uIHRvb2wKLV9VSV9YU0xfREVCVUdfTE9DQUwgICAgICAgICAgID0gJlhTTCBhcHBsaWNhdGlvbgotX1VJX1hTTF9ERUJVR19SRU1PVEUgICAgICAgICAgPSBYUyZMIHJlbW90ZSBhcHBsaWNhdGlvbgotX1VJX1hTTF9USUxFX0VESVRPUiAgICAgICAgICAgPSAmU2hvdyBhbGwgZGVidWdnaW5nIGZpbGVzIGluIGEgdGlsZSBlZGl0b3IKLV9VSV9YU0xfREVCVUdfQU5EX1RSQU5TRk9STSAgID0gJlJ1biB0cmFuc2Zvcm1hdGlvbiBhbmQgb3BlbiBhIGRlYnVnZ2luZyBzZXNzaW9uCi1fVUlfWFNMX0NPTlRFWFRfVVJJICAgICAgICAgICA9IENvbnRleHQgUGF0aCAKLV9VSV9YU0xfQ09OVEVYVCAgICAgICAgICAgICAgID0gU3BlY2lmeSBhICZjb250ZXh0IHBhdGggZm9yIHJlc29sdmluZyBVUklzIGluIHhzbDppbXBvcnQsIHhzbDppbmNsdWRlIG9yIGRvY3VtZW50KCkKLQotCi1fVUlfT1ZFUlJJREVfRklMRSAgICA9IE92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcwotX1VJX0pBVkFfRVhJU1RfRklMRTEgPSBUaGUgZm9sbG93aW5nIEphdmEgY2xhc3NlcyBhbHJlYWR5IGV4aXN0LgotX1VJX0pBVkFfRVhJU1RfRklMRTIgPSBEbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGU/Ci0gICAgICAKLSEgc29tZSBvcHRpb25zIHN0cmluZ3MgY29tbW9uIHRvIHNldmVyYWwgcGx1Z2lucwotX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfVElUTEUgPSBFcnJvciBDcmVhdGluZyBGaWxlCi1fVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9TSE9SVF9ERVNDID0gRXJyb3IgY3JlYXRpbmcgZmlsZSAiezB9IgotX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfTE9OR19ERVNDID0gQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSB0aGUgZmlsZSAiezB9Ii4KLV9VSV9QQVJFTlRfRk9MREVSX0lTX1JFQURfT05MWSA9IFRoZSBwYXJlbnQgZGlyZWN0b3J5ICJ7MH0iIGlzIHJlYWQgb25seS4KLV9VSV9VTktOT1dOX0VSUk9SX1dJVEhfSElOVCA9IFVua25vd24gZXJyb3IuIEVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5ICJ7MH0iIGlzIHdyaXRlYWJsZS4KLV9VSV9VTktOT1dOX0VSUk9SID0gVW5rbm93biBlcnJvci4gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3RvcnkgInswfSIgaXMgd3JpdGVhYmxlLgotCi0hIHVzYWdlIC0gdGhpcyBsYWJlbCBpcyBmb2xsb3dlZCBieSB0d28gcmFkaW8gYnV0dG9uIG9wdGlvbnMgZm9yIHRoZSBmaWxlIGxvY2F0aW9uCi1fVUlfTEFCRUxfSU5DTFVERV9VUkxfRklMRSA9IFNlbGVjdCBmaWxlIGxvY2F0aW9uCi1fVUlfUkFESU9fRklMRSAgICAgICAgICAgICA9IFdvcmtzcGFjZSBwcm9qZWN0cwotX1VJX1JBRElPX1VSTCAgICAgICAgICAgICAgPSBIVFRQCi0KLV9VSV9MQUJFTF9DT01QT05FTlRTCQkJCSAgID0gQ29tcG9uZW50czoKLV9VSV9MQUJFTF9RVUFMSUZJRVIJCQkJCSAgID0gUXVhbGlmaWVyOgotCi0hLSBjb21wb25lbnQgc2VsZWN0aW9uIGRpYWxvZ3MgCi1fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUUJCQkgICA9IENvbXBvbmVudCBOYW1lOgotX1VJX0xBQkVMX01BVENISU5HX0NPTVBPTkVOVFMJCSAgID0gTWF0Y2hpbmcgQ29tcG9uZW50czoKLV9VSV9MQUJFTF9TUEVDSUZJRURfRklMRQkJCSAgID0gU3BlY2lmaWVkIEZpbGUKLV9VSV9MQUJFTF9FTkNMT1NJTkdfUFJPSkVDVAkJCSAgID0gRW5jbG9zaW5nIFByb2plY3QKLV9VSV9MQUJFTF9XT1JLU1BBQ0UJCQkJCSAgID0gV29ya3NwYWNlCi1fVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRQkJCSAgID0gQ3VycmVudCBSZXNvdXJjZQotX1VJX0xBQkVMX1NFQVJDSF9TQ09QRQkJCQkgICA9IFNlYXJjaCBTY29wZQotX1VJX0xBQkVMX05BUlJPV19TRUFSQ0hfU0NPUEVfUkVTT1VSQ0UgPSBVc2UgcmVzb3VyY2UgdmlldyB0byBuYXJyb3cgc2VhcmNoIHNjb3BlCi1fVUlfTEFCRUxfQVZBSUxBQkxFX1RZUEVTCQkJICAgPSBBdmFpbGFibGUgVHlwZXMKLV9VSV9MQUJFTF9XT1JLSU5HX1NFVFMgICAgICAgICAgICAgICAgID0gV29ya2luZyBTZXRzCi0KLV9VSV9MQUJFTF9OZXc9TmV3Li4uCi1fVUlfTEFCRUxfREVDTEFSQVRJT05fTE9DQVRJT049RGVjbGFyYXRpb24gTG9jYXRpb246Ci1fVUlfTEFCRUxfQ0hPT1NFPUNob29zZS4uLgotCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSEKLSEgSGVyZSBpcyB0aGUgbGlzdCBvZiBFcnJvciBzdHJpbmcgdGhhdCBoYXZlIG1lc3NhZ2UgSURzIC0gbWFrZSBzdXJlIHRoZXkgYXJlIHVuaXF1ZQotISAgUmFuZ2UgZm9yIGIyYmd1aSBtZXNzYWdlSURzOiBJV0FYMTIwMSAtIElXQVgxNDAwCi0hCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotX0VSUk9SX1RIRV9DT05UQUlORVJfTkFNRSA9IFRoZSBzcGVjaWZpZWQgY29udGFpbmVyIG11c3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBhbmQgaXRzIHBhdGggbXVzdCBzdGFydCBhdCB0aGUgd29ya3NwYWNlIHJvb3QuCi0KLV9FUlJPUl9MT0NBTF9MT0NBVElPTiAgICAgPSBUaGUgbG9jYWwgbG9jYXRpb24gb2YgdGhpcyBjb250YWluZXIgY2Fubm90IGJlIHJlc29sdmVkLgotX0VSUk9SX05PVF9KQVZBX1BST0pFQ1QgICA9IFRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBub3QgYSBKYXZhIHByb2plY3QuCi0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IHRoaXMgZXJyb3IgbWVzc2FnZSB0ZXh0IGlzIGZvbGxvd2VkIGJ5IGEgbWVzc2FnZSBmcm9tIGFub3RoZXIgcGx1Z2luCi1fRVJST1JfSU5WQUxJRF9KQVZBX1BBQ0tBR0UgPSBJV0FYMTIwMUUgSW52YWxpZCBwYWNrYWdlIG5hbWUgZXJyb3I6Ci0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IChfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTiArIHN0cmluZyArIF9VSV9MQUJFTF9PUiArIHN0cmluZykgb3IgKF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OKQotX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04gICAgICAgICA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aAotX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMgICAgICAgICAgICA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0KLV9FUlJPUl9DT05UQUlORVJfTk9UX0pBVkFfQlVJTERQQVRIID0gVGhlIGNvbnRhaW5lciBpcyBub3QgYSBKYXZhIHNvdXJjZSBmb2xkZXIgZm9yIHRoaXMgcHJvamVjdAotX0VSUk9SX1VTRV9QUk9KRUNUX0pBVkFfU09VUkNFX0ZPTERFUiA9IFRoZSBwcm9qZWN0IGlzIG5vdCBvbiB0aGUgYnVpbGQgcGF0aC4gIFNlbGVjdCBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIHByb2plY3QuCi0KLV9VSV9FUlJPUiAgICAgICAgICAgICA9IEVycm9yCi0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IHRoaXMgd2FybmluZyBtZXNzYWdlIHRleHQgaXMgZm9sbG93ZWQgYnkgYSBtZXNzYWdlIGZyb20gYW5vdGhlciBwbHVnaW4KLV9XQVJOX0lOVkFMSURfSkFWQV9QQUNLQUdFID0gSW52YWxpZCBwYWNrYWdlIG5hbWUgd2FybmluZzoKLQotX0VSUk9SX1JPT1RfRUxFTUVOVCA9IFRoZSBYTUwgc2NoZW1hIGRvZXMgbm90IGNvbnRhaW4gYW55IGdsb2JhbCBlbGVtZW50cyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcm9vdCBlbGVtZW50LgotX0VSUk9SX1NBVklOR19GSUxFID0gRXJyb3Igc2F2aW5nIGZpbGUgInswfSIKLQotISBGaWxlIFZhbGlkYXRvcgotX1VJX0VSUk9SX1ZBTElEQVRFX0ZBSUxfVElUTEUgPSBGYWlsZWQgdG8gY2hlY2sgb3V0IG5lY2Vzc2FyeSBmaWxlcwotX1VJX0VSUk9SX1ZBTElEQVRFX0ZBSUxfTUVTU0FHRSA9IEdlbmVyYXRpb24gZmFpbGVkLiBOZWNlc3NhcnkgZmlsZXMgY291bGQgbm90IGJlIGNoZWNrZWQgb3V0LiAKLQotISBQcm9wZXJ0eURpcnR5Q2hhbmdlTGlzdGVuZXIgYW5kIFByb3BlcnR5UmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotX1VJX0VSUk9SX1ZBTElEQVRFX0VESVRfRkFJTF9PTkVfRklMRSA9IEVycm9yCi0KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQudGl0bGU9TmV3IEV4YW1wbGUgUHJvamVjdAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci50aXRsZT1Qcm9qZWN0IENyZWF0aW9uIEZhaWxlZAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci5tZXNzYWdlPVByb2plY3QgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQub3ZlcndyaXRlcXVlcnkudGl0bGU9T3ZlcndyaXRlCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm92ZXJ3cml0ZXF1ZXJ5Lm1lc3NhZ2U9RG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHswfT8KLQotCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLm9wX2Rlc2M9Q3JlYXRpbmcgZXhhbXBsZSBwcm9qZWN0cy4uLgotRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5vcF9kZXNjX3Byb2o9Q29uZmlndXJpbmcgcHJvamVjdC4uLgotCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5lcnJvci5hbHJlYWR5ZXhpc3RzPVByb2plY3QgYWxyZWFkeSBleGlzdHMuCi1TYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzPVNhdmUgQWxsIE1vZGlmaWVkIFJlc291cmNlcwotU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZT1BbGwgbW9kaWZpZWQgcmVzb3VyY2VzIG11c3QgYmUgc2F2ZWQgYmVmb3JlIHRoaXMgb3BlcmF0aW9uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwYjYzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQiIG5hbWU9IkV4YW1wbGUgUHJvamVjdCBDcmVhdGlvbiBXaXphcmQiIHNjaGVtYT0ic2NoZW1hL2V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuZXhzZCIvPgotICA8ZXh0ZW5zaW9uCi0JcG9pbnQ9Im9yZy5lY2xpcHNlLnNlYXJjaC5zZWFyY2hSZXN1bHRWaWV3UGFnZXMiPgotCTx2aWV3UGFnZQotCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guU2VhcmNoUmVzdWx0UGFnZSIKLQkJc2VhcmNoUmVzdWx0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaFJlc3VsdCIKLQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaFJlc3VsdFBhZ2UiPgotCTwvdmlld1BhZ2U+Ci0gIDwvZXh0ZW5zaW9uPgotIAotICA8IS0tCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uIAotICAgICAgICAgaWQ9InRlc3QiIAotICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgaWQ9InRlc3RpdCIgCi0gICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgIGxhYmVsPSJURVNUIFNFQVJDSCBESUFMT0ciIAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuVGVzdCI+IAotICAgICAgICAgPC9hY3Rpb24+ICAgICAgICAgIAotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgICAgICAgICAgCi0gICAgPC9leHRlbnNpb24+IAotICAgLS0+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zY2hlbWEvZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NjaGVtYS9leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OGMzMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NjaGVtYS9leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIiBpZD0iRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIgbmFtZT0iRXhhbXBsZSBQcm9qZWN0IENyZWF0aW9uIFdpemFyZCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgdG8gZXh0ZW5kIE5ldyBwcm9qZWN0IHdpdGhhcmQgd2l0aCB0aGUNCi1wYWdlIHNldCB1cCBzZXR1cCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNyZWF0ZWQgcHJvamVjdCBhcyB3ZWxsIGFzIHNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgYmUgaW1wb3J0ZWQgb24gdGhlIHByb2plY3QgY3JlYXRpb24uDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZCI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3RzZXR1cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBleHRlbnNpb24gaXMgaW50ZW5kZWQgZm9yLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYW5uZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgUGx1Z2luIHJlbGF0aXZlIHBhdGggdG8gdGhlIGltYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgYSBiYW5uZXIgb24gdGhlIHdpemFyZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InByb2plY3RzZXR1cCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhZGRpdGlvbmFsIHByb2plY3Qgc2V0dXAuDQotVGhlcmUgd2lsbCBiZSBhcyBtYW55IHBhZ2VzIGNyZWF0ZWQgZm9yIHRoZSB3aXphcmQgYXMgdGhlcmUgYXJlIHByb2plY3RzZXR1cCBlbGVtZW50cy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbXBvcnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5hdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVmZXJlbmNlcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWdldGl0bGUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGl0bGUgb2YgdGhlIHdpemFyZCZhcG9zO3MgcGFnZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBJbml0aWFsIHByb2plY3QgbmFtZSB0aGF0IHdpbGwgYmUgcHJvdmlkZWQgb24gdGhlIHdpemFyZCBwYWdlLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBMYWJlbCBmb3IgdGhlIHByb2plY3QgbmFtZSBmaWVsZCBvbiB0aGUgd2l6YXJkIHBhZ2UuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhZ2VkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgd2l6YXJkIHBhZ2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3BlbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBQbHVnaW4gcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgb3BlbmVkIHdoZW4gd2l6YXJkIGZpbmlzaGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iaW1wb3J0Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdoYXQgdG8gaW1wb3J0IGludG8gdGhlIHByb2plY3Qgd2hlbiBpdCZhcG9zO3MgY3JlYXRlZC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgUHJvamVjdCByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hlcmUgcHJvamVjdCBmaWxlcyB3aWxsIGJlIGltcG9ydGVkIHRvLCBpZiBub3Qgc3BlY2lmaWVkLCBpdCZhcG9zO3MgdGhlIHByb2plc3QgaXRzZWxmLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgUGx1Z2luIHJlbGF0aXZlIHBhdGggb2YgdGhlIGltcG9ydCAuemlwIGZpbGUgd2l0aCB0aGUgZmlsZXMgdG8gYmUgaW1wb3J0ZWQgaW50byB0aGUgcHJvamVjdC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im5hdHVyZSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRWxlbWVudCB0aGF0IHNwZWNpZmllZCBFY2xpcHNlIG5hdHVyZSB0aGF0IGlzIGFwcGxpY2FibGUgdG8gdGhlIHByb2plY3QuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIG5hdHVyZSB0aGF0IHdpbGwgYmUgb3BlbmVkIHdoZW4gcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VzIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFbGVtZW50IHRoYXQgc3BlY2lmaWVzIHJlZmVyZW5jZSBmb3IgdGhlIHByb2plY3QgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHJlZmVyZW5jZWQgcHJvamVjdC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCZxdW90Ow0KLSAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwudWkuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZEV4dGVuc2lvbiZxdW90OyZndDsgDQotICAgICAgJmx0O3dpemFyZA0KLSAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC51aS5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkJnF1b3Q7DQotICAgICAgICAgICBiYW5uZXI9JnF1b3Q7aWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXpiYW5uZXIuZ2lmJnF1b3Q7Jmd0Ow0KLSAgICAgICAgICZsdDtwcm9qZWN0c2V0dXANCi0gICAgICAgICAgICAgICBwYWdldGl0bGU9JnF1b3Q7JVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQucGFnZXRpdGxlJnF1b3Q7DQotICAgICAgICAgICAgICAgbmFtZT0mcXVvdDslWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wcm9qZWN0bmFtZSZxdW90Ow0KLSAgICAgICAgICAgICAgIGxhYmVsPSZxdW90OyVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmxhYmVsJnF1b3Q7DQotICAgICAgICAgICAgICAgcGFnZWRlc2NyaXB0aW9uPSZxdW90OyVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2VkZXNjcmlwdGlvbiZxdW90Ow0KLSAgICAgICAgICAgICAgIG9wZW49JnF1b3Q7cmVhZG1lLmh0bWwmcXVvdDsmZ3Q7DQotICAgICAgICAgICAgJmx0O2ltcG9ydA0KLSAgICAgICAgICAgICAgICAgIGRlc3Q9JnF1b3Q7JnF1b3Q7DQotICAgICAgICAgICAgICAgICAgc3JjPSZxdW90O2V4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcCZxdW90OyZndDsNCi0gICAgICAgICAgICAmbHQ7L2ltcG9ydCZndDsNCi0gICAgICAgICZsdDsvcHJvamVjdHNldHVwJmd0Ow0KLSAgICAgJmx0Oy93aXphcmQmZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFF1ZXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZTk3ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvQWJzdHJhY3RTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklRdWVyeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGUuTWVzc2FnZXM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VhcmNoUXVlcnkgaW1wbGVtZW50cyBJU2VhcmNoUXVlcnkgewotCQotCXByb3RlY3RlZCBTdHJpbmcgZlBhdHRlcm47Ci0JcHJvdGVjdGVkIFNlYXJjaFNjb3BlIGZTY29wZTsKLQlwcm90ZWN0ZWQgU2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU2NvcGVEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBBYnN0cmFjdFNlYXJjaFF1ZXJ5KFN0cmluZyBwYXR0ZXJuLCBTZWFyY2hTY29wZSBzY29wZSwgU3RyaW5nIHNjb3BlRGVzY3JpcHRpb24pIHsKLQkJc3VwZXIoKTsKLQkJZlBhdHRlcm49IHBhdHRlcm47Ci0JCWZTY29wZT0gc2NvcGU7Ci0JCWZTY29wZURlc2NyaXB0aW9uPSBzY29wZURlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJlcnVuKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5JbkJhY2tncm91bmQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfbGFiZWw7IAotCX0KLQotCXB1YmxpYyBJU2VhcmNoUmVzdWx0IGdldFNlYXJjaFJlc3VsdCgpIHsKLQkJaWYgKGZSZXN1bHQgPT0gbnVsbCkgewotCQkJZlJlc3VsdD0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzKTsKLQkJCW5ldyBTZWFyY2hSZXN1bHRVcGRhdGVyKGZSZXN1bHQpOwotCQl9Ci0JCXJldHVybiBmUmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdExhYmVsKGludCBuTWF0Y2hlcykgewotCQlpZiAobk1hdGNoZXMgPT0gMSkgewotCQkJaWYgKGZQYXR0ZXJuLmxlbmd0aCgpID4gMCkgewotCQkJCU9iamVjdFtdIGFyZ3M9IHsgZlBhdHRlcm4sIGZTY29wZURlc2NyaXB0aW9uIH07Ci0JCQkJcmV0dXJuIE1lc3NhZ2VzLmZvcm1hdChTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfc2luZ3VsYXJMYWJlbCwgYXJncyk7IAotCQkJfQotCQkJT2JqZWN0W10gYXJncz0geyAiIiwgZlNjb3BlRGVzY3JpcHRpb24gfTsKLQkJCXJldHVybiBNZXNzYWdlcy5mb3JtYXQoU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFF1ZXJ5X3Npbmd1bGFyTGFiZWxfZmlsZU5hbWVTZWFyY2gsIGFyZ3MpOyAKLQkJfQotCQlpZiAoZlBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQlPYmplY3RbXSBhcmdzPSB7IGZQYXR0ZXJuLCBuZXcgSW50ZWdlcihuTWF0Y2hlcyksIGZTY29wZURlc2NyaXB0aW9uIH07IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBNZXNzYWdlcy5mb3JtYXQoU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFF1ZXJ5X3BsdXJhbFBhdHRlcm4sIGFyZ3MpOyAKLQkJfQotCQlPYmplY3RbXSBhcmdzPSB7ICIiLCBuZXcgSW50ZWdlcihuTWF0Y2hlcyksIGZTY29wZURlc2NyaXB0aW9uIH07IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1lc3NhZ2VzLmZvcm1hdChTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfcGx1cmFsUGF0dGVybl9maWxlTmFtZVNlYXJjaCwgYXJncyk7IAotCQotCQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlmaW5hbCBTZWFyY2hSZXN1bHQgdGV4dFJlc3VsdD0gKFNlYXJjaFJlc3VsdCkgZ2V0U2VhcmNoUmVzdWx0KCk7Ci0JCXRleHRSZXN1bHQucmVtb3ZlQWxsKCk7Ci0JCVNlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yIGNvbGxlY3Rvcj0gbmV3IFNlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yKHRleHRSZXN1bHQpOwotCQlTdHJpbmcgc2VhcmNoU3RyaW5nPSBmUGF0dGVybjsKLQkJaWYgKHNlYXJjaFN0cmluZy50cmltKCkuZXF1YWxzKFN0cmluZy52YWx1ZU9mKCcqJykpKSB7Ci0JCQlzZWFyY2hTdHJpbmc9IG5ldyBTdHJpbmcoKTsKLQkJfQotCQlTdHJpbmcgbWVzc2FnZT0gU2VhcmNoTWVzc2FnZXMuVGV4dFNlYXJjaEVuZ2luZV9zdGF0dXNNZXNzYWdlOyAKLQkJTXVsdGlTdGF0dXMgc3RhdHVzPSBuZXcgTXVsdGlTdGF0dXMoTmV3U2VhcmNoVUkuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBudWxsKTsKLQkJCi0JCVNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0JCi0JCVF1YWxpZmllZE5hbWUgdHlwZU5hbWUgPSBRdWFsaWZpZWROYW1lLnZhbHVlT2Yoc2VhcmNoU3RyaW5nKTsKLQkJCi0JCXRyeSB7Ci0gICAgICAgICAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBjcmVhdGVTZWFyY2hQYXR0ZXJuKHR5cGVOYW1lKTsKLSAgICAgICAgICAgIHNlYXJjaEVuZ2luZS5zZWFyY2gocGF0dGVybiwgY29sbGVjdG9yLCBmU2NvcGUsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkKLQkJcmV0dXJuIHN0YXR1czsKLQotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2VhcmNoUGF0dGVybiBjcmVhdGVTZWFyY2hQYXR0ZXJuKFF1YWxpZmllZE5hbWUgdHlwZU5hbWUpOwotCQotCXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRVcGRhdGVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElRdWVyeUxpc3RlbmVyIHsKLQkJU2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0KLQkJcHVibGljIFNlYXJjaFJlc3VsdFVwZGF0ZXIoU2VhcmNoUmVzdWx0IHJlc3VsdCkgewotCQkJZlJlc3VsdD0gcmVzdWx0OwotCQkJTmV3U2VhcmNoVUkuYWRkUXVlcnlMaXN0ZW5lcih0aGlzKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YT0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSAhPSBudWxsKQotCQkJCWhhbmRsZURlbHRhKGRlbHRhKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZURlbHRhKElSZXNvdXJjZURlbHRhIGQpIHsKLQkJCXRyeSB7Ci0JCQkJZC5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotCQkJCQkJCQlJUmVzb3VyY2UgcmVzPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCQkJCU1hdGNoW10gbWF0Y2hlcz0gZlJlc3VsdC5nZXRNYXRjaGVzKHJlcyk7Ci0JCQkJCQkJCQlmUmVzdWx0LnJlbW92ZU1hdGNoZXMobWF0Y2hlcyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCQkJCQkJLy8gaGFuZGxlIGNoYW5nZWQgcmVzb3VyY2UKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHF1ZXJ5QWRkZWQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQkvLyBkb24ndCBjYXJlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBxdWVyeVJlbW92ZWQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQlpZiAoZlJlc3VsdC5lcXVhbHMocXVlcnkuZ2V0U2VhcmNoUmVzdWx0KCkpKSB7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJTmV3U2VhcmNoVUkucmVtb3ZlUXVlcnlMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcXVlcnlTdGFydGluZyhJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJCS8vIGRvbid0IGNhcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHF1ZXJ5RmluaXNoZWQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQkvLyBkb24ndCBjYXJlCi0JCX0KLSAgICB9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvSVNlYXJjaENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvSVNlYXJjaENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmMxNDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL0lTZWFyY2hDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotcHVibGljIGludGVyZmFjZSBJU2VhcmNoQ29uc3RhbnRzIHsKLQkKLQkvKioKLQkgKiBUaGUgc2VhcmNoIHJlc3VsdCBpcyBhIGRlY2xhcmF0aW9uLgotCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHMKLQkgKiBzbyBhcyB0byBiZXR0ZXIgbmFycm93IGRvd24gdGhlIHNlYXJjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBERUNMQVJBVElPTlM9IDA7Ci0KLQotCS8qKgotCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIGEgcmVmZXJlbmNlLgotCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHMKLQkgKiBzbyBhcyB0byBiZXR0ZXIgbmFycm93IGRvd24gdGhlIHNlYXJjaC4KLQkgKiBSZWZlcmVuY2VzIGNhbiBjb250YWluIGltcGxlbWVudGVycyBzaW5jZSB0aGV5IGFyZSBtb3JlIGdlbmVyaWMga2luZAotCSAqIG9mIG1hdGNoZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgUkVGRVJFTkNFUz0gMTsKLQotCS8qKgotCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIGEgZGVjbGFyYXRpb24sIG9yIGEgcmVmZXJlbmNlLgotCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHMKLQkgKiBzbyBhcyB0byBiZXR0ZXIgbmFycm93IGRvd24gdGhlIHNlYXJjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBBTExfT0NDVVJSRU5DRVM9IDI7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmZGZlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFNlYXJjaE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBncm91cF9yZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kRGVjbGFyYXRpb25BY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJbldvcmtpbmdTZXRBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFBhZ2VfbGltaXRlZF9mb3JtYXQ7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVTZWFyY2hQYWdlX2Vycm9yX21hcmtlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUGFnZV9zb3J0X2J5X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5XaXRoTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUXVlcnlfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3BsdXJhbFBhdHRlcm47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3Npbmd1bGFyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3Npbmd1bGFyTGFiZWxfZmlsZU5hbWVTZWFyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3BsdXJhbFBhdHRlcm5fZmlsZU5hbWVTZWFyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dFNlYXJjaEVuZ2luZV9zdGF0dXNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVMYWJlbFByb3ZpZGVyX2NvdW50X2Zvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlTGFiZWxQcm92aWRlcl9yZW1vdmVkX3Jlc291cmNlX2xhYmVsOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU2VhcmNoTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlOWY4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1ncm91cF9yZWZlcmVuY2VzPSBSZSZmZXJlbmNlcwotU2VhcmNoX0ZpbmREZWNsYXJhdGlvbkFjdGlvbl9sYWJlbD0gJldvcmtzcGFjZQotU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWw9ICZQcm9qZWN0Ci1TZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbD0gV29ya2luZyAmU2V0Li4uCi1GaWxlU2VhcmNoUGFnZV9saW1pdGVkX2Zvcm1hdD17MH0gKHNob3dpbmcgezF9IG9mIHsyfSBmaWxlcykKLUZpbGVTZWFyY2hQYWdlX2Vycm9yX21hcmtlcj1Db3VsZCBub3QgY3JlYXRlIG1hcmtlcgotRmlsZVNlYXJjaFBhZ2Vfc29ydF9ieV9sYWJlbD1Tb3J0IEJ5Ci1PcGVuV2l0aE1lbnVfbGFiZWw9IE9wZW4gV2l0JmgKLQotRmlsZUxhYmVsUHJvdmlkZXJfY291bnRfZm9ybWF0PXswfSAoezF9IG1hdGNoZXMpCi1GaWxlTGFiZWxQcm92aWRlcl9yZW1vdmVkX3Jlc291cmNlX2xhYmVsPTxyZW1vdmVkIHJlc291cmNlPgotCi1GaWxlU2VhcmNoUXVlcnlfbGFiZWw9RmlsZSBTZWFyY2gKLQotIyBUaGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgcGF0dGVybiwgdGhlIHNlY29uZCBieSB0aGUgY291bnQgYW5kIHRoZSB0aGlyZCBieSB0aGUgc2NvcGUKLUZpbGVTZWFyY2hRdWVyeV9wbHVyYWxQYXR0ZXJuPSAnJ3swfScnIC0gezF9IG1hdGNoZXMgaW4gezJ9Ci0KLSMgVGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHBhdHRlcm4sIHRoZSBzZWNvbmQgYnkgdGhlIHNjb3BlCi1GaWxlU2VhcmNoUXVlcnlfc2luZ3VsYXJMYWJlbD0gJyd7MH0nJyAtIDEgbWF0Y2ggaW4gezF9Ci0KLUZpbGVTZWFyY2hRdWVyeV9zaW5ndWxhckxhYmVsX2ZpbGVOYW1lU2VhcmNoPTEgZmlsZSBuYW1lIG1hdGNoaW5nICcnezB9JycgaW4gezF9Ci1GaWxlU2VhcmNoUXVlcnlfcGx1cmFsUGF0dGVybl9maWxlTmFtZVNlYXJjaD17MX0gZmlsZSBuYW1lcyBtYXRjaGluZyAnJ3swfScnIGluIHsyfQotCi1UZXh0U2VhcmNoRW5naW5lX3N0YXR1c01lc3NhZ2U9IFByb2JsZW1zIGVuY291bnRlcmVkIGR1cmluZyB0ZXh0IHNlYXJjaC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hRdWVyeVJlc3VsdENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWQyMzRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotCi1jbGFzcyBTZWFyY2hRdWVyeVJlc3VsdENvbGxlY3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JcHJpdmF0ZSBTZWFyY2hSZXN1bHQgZlNlYXJjaFJlc3VsdDsKLQotCQotCXByb3RlY3RlZCBTZWFyY2hRdWVyeVJlc3VsdENvbGxlY3RvcihTZWFyY2hSZXN1bHQgcmVzdWx0KXsKLQkJc3VwZXIoKTsKLQkJZlNlYXJjaFJlc3VsdD0gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIG1hdGNoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1hdGNoIGFNYXRjaCA9IG5ldyBNYXRjaChtYXRjaC5nZXRGaWxlKCksIG1hdGNoLmdldE9mZnNldCgpLCBtYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCWZTZWFyY2hSZXN1bHQuYWRkTWF0Y2goYU1hdGNoKTsKLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTQxZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRmlsZU1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGltcGxlbWVudHMgSUVkaXRvck1hdGNoQWRhcHRlciwgSUZpbGVNYXRjaEFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgTWF0Y2hbXSBFTVBUWV9BUlI9IG5ldyBNYXRjaFswXTsKLQkKLQlwcml2YXRlIEFic3RyYWN0U2VhcmNoUXVlcnkgZlF1ZXJ5OwotCi0JcHVibGljIFNlYXJjaFJlc3VsdChBYnN0cmFjdFNlYXJjaFF1ZXJ5IGpvYikgewotCQlmUXVlcnk9IGpvYjsKLQl9Ci0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy90c2VhcmNoX2RwZG5fb2JqLmdpZiIpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZlF1ZXJ5LmdldFJlc3VsdExhYmVsKGdldE1hdGNoQ291bnQoKSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbHRpcCgpIHsKLQkJcmV0dXJuIGdldExhYmVsKCk7Ci0JfQotCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwgSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gZ2V0TWF0Y2hlcyhmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKQotCQkJcmV0dXJuIChJRmlsZSllbGVtZW50OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3duSW5FZGl0b3IoTWF0Y2ggbWF0Y2gsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlJRWRpdG9ySW5wdXQgZWk9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoZWkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZpPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWk7Ci0JCQlyZXR1cm4gbWF0Y2guZ2V0RWxlbWVudCgpLmVxdWFscyhmaS5nZXRGaWxlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlFZGl0b3JJbnB1dCBlaT0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChlaSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmk9IChJRmlsZUVkaXRvcklucHV0KSBlaTsKLQkJCXJldHVybiBnZXRNYXRjaGVzKGZpLmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0FSUjsKLQl9Ci0KLQlwdWJsaWMgSVNlYXJjaFF1ZXJ5IGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gZlF1ZXJ5OwotCX0KLQkKLQlwdWJsaWMgSUZpbGVNYXRjaEFkYXB0ZXIgZ2V0RmlsZU1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBJRWRpdG9yTWF0Y2hBZGFwdGVyIGdldEVkaXRvck1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyNDdiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuRGVsZWdhdGluZ0RyYWdBZGFwdGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklDb250ZXh0TWVudUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdFZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuT3BlbkZpbGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5PcGVuV2l0aE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eURpYWxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5GaWxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGUuU29ydEFjdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0UGFnZSBleHRlbmRzIEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZWNvcmF0b3JJZ25vcmluZ1ZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCXByaXZhdGUgZmluYWwgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXI7Ci0KLQkJcHVibGljIERlY29yYXRvcklnbm9yaW5nVmlld2VyU29ydGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKG51bGwpOyAvLyBsYXp5IGluaXRpYWxpemF0aW9uCi0JCQlmTGFiZWxQcm92aWRlcj0gbGFiZWxQcm92aWRlcjsKLQkJfQotCQkKLQkgICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JICAgICAgICBTdHJpbmcgbmFtZTE9IGZMYWJlbFByb3ZpZGVyLmdldFRleHQoZTEpOwotCSAgICAgICAgU3RyaW5nIG5hbWUyPSBmTGFiZWxQcm92aWRlci5nZXRUZXh0KGUyKTsKLQkgICAgICAgIGlmIChuYW1lMSA9PSBudWxsKQotCSAgICAgICAgICAgIG5hbWUxID0gIiI7Ly8kTk9OLU5MUy0xJAotCSAgICAgICAgaWYgKG5hbWUyID09IG51bGwpCi0JICAgICAgICAgICAgbmFtZTIgPSAiIjsvLyROT04tTkxTLTEkCi0JICAgICAgICByZXR1cm4gZ2V0Q29sbGF0b3IoKS5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JICAgIH0KLQkgICAgCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlciNnZXRDb2xsYXRvcigpCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgQ29sbGF0b3IgZ2V0Q29sbGF0b3IoKSB7Ci0JCQlpZiAoY29sbGF0b3IgPT0gbnVsbCkgewotCQkJCWNvbGxhdG9yPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIGNvbGxhdG9yOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU09SVElORz0gIm9yZy5lY2xpcHNlLnNlYXJjaC5yZXN1bHRwYWdlLnNvcnRpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFjdGlvbkdyb3VwIGZBY3Rpb25Hcm91cDsKLQlwcml2YXRlIElGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBpbnQgZkN1cnJlbnRTb3J0T3JkZXI7Ci0JcHJpdmF0ZSBTb3J0QWN0aW9uIGZTb3J0QnlOYW1lQWN0aW9uOwotCXByaXZhdGUgU29ydEFjdGlvbiBmU29ydEJ5UGF0aEFjdGlvbjsKLQkKLQkvLyBuZXZlciB1c2VkCi0JLy9wcml2YXRlIEVkaXRvck9wZW5lciBmRWRpdG9yT3BlbmVyPSBuZXcgRWRpdG9yT3BlbmVyKCk7Ci0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0hPV19JTl9UQVJHRVRTPSBuZXcgU3RyaW5nW10geyBJUGFnZUxheW91dC5JRF9SRVNfTkFWIH07Ci0JcHJpdmF0ZSAgc3RhdGljIGZpbmFsIElTaG93SW5UYXJnZXRMaXN0IFNIT1dfSU5fVEFSR0VUX0xJU1Q9IG5ldyBJU2hvd0luVGFyZ2V0TGlzdCgpIHsKLQkJcHVibGljIFN0cmluZ1tdIGdldFNob3dJblRhcmdldElkcygpIHsKLQkJCXJldHVybiBTSE9XX0lOX1RBUkdFVFM7Ci0JCX0KLQl9OwotCi0JLy8gcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQkKLQlwdWJsaWMgU2VhcmNoUmVzdWx0UGFnZSgpIHsKLQkJLy8gVE9ETwotCQkvL2ZTb3J0QnlOYW1lQWN0aW9uPSBuZXcgU29ydEFjdGlvbihTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUGFnZV9zb3J0X25hbWVfbGFiZWwsIHRoaXMsIEZpbGVMYWJlbFByb3ZpZGVyLlNIT1dfTEFCRUxfUEFUSCk7IAotCQkvL2ZTb3J0QnlQYXRoQWN0aW9uPSBuZXcgU29ydEFjdGlvbihTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUGFnZV9zb3J0X3BhdGhfbGFiZWwsIHRoaXMsIEZpbGVMYWJlbFByb3ZpZGVyLlNIT1dfUEFUSF9MQUJFTCk7IAotICAgICAgICAvLyBjcyA6IEkndmUgY29tbWVudCB0aGlzIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCS8vIEV2ZW4gbW9yZSBpbXBvcnRhbnRseSB3ZSBuZWVkIHRvIGRpc2N1c3Mgd2l0aCB0aGUgYmFzZSBndXlzIHRvIGdldCBBUEkgbGluZWQgdXAgZm9yIHRoaXMgKHNlZSBidWcgMTYzMTc3KS4KLQkJLyoKLQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoU2VhcmNoUHJlZmVyZW5jZVBhZ2UuTElNSVRfVEFCTEUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpIHx8IFNlYXJjaFByZWZlcmVuY2VQYWdlLkxJTUlUX1RBQkxFX1RPLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkKLQkJCQkJaWYgKGdldFZpZXdlcigpIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpIHsKLQkJCQkJCWdldFZpZXdQYXJ0KCkudXBkYXRlTGFiZWwoKTsKLQkJCQkJCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJfQotCQl9OwotCQlTZWFyY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkqLwotfQotCQotCXB1YmxpYyBTdHJ1Y3R1cmVkVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFZpZXdlcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRHJhZ0FkYXB0ZXJzKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzPSBuZXcgVHJhbnNmZXJbXSB7IFJlc291cmNlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQlpbnQgb3BzPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkJCi0JCURlbGVnYXRpbmdEcmFnQWRhcHRlciBhZGFwdGVyPSBuZXcgRGVsZWdhdGluZ0RyYWdBZGFwdGVyKCk7Ci0JCWFkYXB0ZXIuYWRkRHJhZ1NvdXJjZUxpc3RlbmVyKG5ldyBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIodmlld2VyKSk7Ci0JCQotCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQob3BzLCB0cmFuc2ZlcnMsIGFkYXB0ZXIpOwotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVUYWJsZVZpZXdlcihUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCUZpbGVMYWJlbFByb3ZpZGVyIGlubmVyTGFiZWxQcm92aWRlcj0gbmV3IEZpbGVMYWJlbFByb3ZpZGVyKHRoaXMsIGZDdXJyZW50U29ydE9yZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKGlubmVyTGFiZWxQcm92aWRlciwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcih0aGlzKSk7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmV3IERlY29yYXRvcklnbm9yaW5nVmlld2VyU29ydGVyKGlubmVyTGFiZWxQcm92aWRlcikpOwotCQlmQ29udGVudFByb3ZpZGVyPSAoSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJYWRkRHJhZ0FkYXB0ZXJzKHZpZXdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVHJlZVZpZXdlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQl2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJRmlsZUxhYmVsUHJvdmlkZXIgaW5uZXJMYWJlbFByb3ZpZGVyPSBuZXcgRmlsZUxhYmVsUHJvdmlkZXIodGhpcywgRmlsZUxhYmVsUHJvdmlkZXIuU0hPV19MQUJFTCk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihpbm5lckxhYmVsUHJvdmlkZXIsIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcih2aWV3ZXIpKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgRGVjb3JhdG9ySWdub3JpbmdWaWV3ZXJTb3J0ZXIoaW5uZXJMYWJlbFByb3ZpZGVyKSk7Ci0JCWZDb250ZW50UHJvdmlkZXI9IChJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcikgdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlhZGREcmFnQWRhcHRlcnModmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG93TWF0Y2goTWF0Y2ggbWF0Y2gsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gYWN0aXZhdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGU9IChJRmlsZSkgbWF0Y2guZ2V0RWxlbWVudCgpOwotCQlJV29ya2JlbmNoUGFnZSB3YlBhZ2U9IFVJUGx1Z2luLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclBhcnQgZWRpdG9yPSBJREUub3BlbkVkaXRvcih3YlBhZ2UsIChJRmlsZSkgbWF0Y2guZ2V0RWxlbWVudCgpLCBhY3RpdmF0ZSk7Ci0JCWlmIChvZmZzZXQgIT0gMCAmJiBsZW5ndGggIT0gMCkgewotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvcj0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCQkJdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwob2Zmc2V0LCBsZW5ndGgpOwotCQkJfSBlbHNlIGlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCXNob3dXaXRoTWFya2VyKGVkaXRvciwgZmlsZSwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzaG93V2l0aE1hcmtlcihJRWRpdG9yUGFydCBlZGl0b3IsIElGaWxlIGZpbGUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXIgbWFya2VyPSBudWxsOwotCQl0cnkgewotCQkJbWFya2VyPSBmaWxlLmNyZWF0ZU1hcmtlcihOZXdTZWFyY2hVSS5TRUFSQ0hfTUFSS0VSKTsKLQkJCUhhc2hNYXAgYXR0cmlidXRlcz0gbmV3IEhhc2hNYXAoNCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKG9mZnNldCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIob2Zmc2V0ICsgbGVuZ3RoKSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFBhZ2VfZXJyb3JfbWFya2VyLCBlKTsgCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobWFya2VyICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1ncikgewotCQlzdXBlci5maWxsQ29udGV4dE1lbnUobWdyKTsKLQkJYWRkU29ydEFjdGlvbnMobWdyKTsKLQkJZkFjdGlvbkdyb3VwLnNldENvbnRleHQobmV3IEFjdGlvbkNvbnRleHQoZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJZkFjdGlvbkdyb3VwLmZpbGxDb250ZXh0TWVudShtZ3IpOwotLy8JCUZpbGVTZWFyY2hRdWVyeSBxdWVyeT0gKEZpbGVTZWFyY2hRdWVyeSkgZ2V0SW5wdXQoKS5nZXRRdWVyeSgpOwotCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBhZGRTb3J0QWN0aW9ucyhJTWVudU1hbmFnZXIgbWdyKSB7Ci0JCWlmIChnZXRMYXlvdXQoKSAhPSBGTEFHX0xBWU9VVF9GTEFUKQotCQkJcmV0dXJuOwotCQlNZW51TWFuYWdlciBzb3J0TWVudT0gbmV3IE1lbnVNYW5hZ2VyKFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hQYWdlX3NvcnRfYnlfbGFiZWwpOyAKLQkJc29ydE1lbnUuYWRkKGZTb3J0QnlOYW1lQWN0aW9uKTsKLQkJc29ydE1lbnUuYWRkKGZTb3J0QnlQYXRoQWN0aW9uKTsKLQkJCi0JCWZTb3J0QnlOYW1lQWN0aW9uLnNldENoZWNrZWQoZkN1cnJlbnRTb3J0T3JkZXIgPT0gZlNvcnRCeU5hbWVBY3Rpb24uZ2V0U29ydE9yZGVyKCkpOwotCQlmU29ydEJ5UGF0aEFjdGlvbi5zZXRDaGVja2VkKGZDdXJyZW50U29ydE9yZGVyID09IGZTb3J0QnlQYXRoQWN0aW9uLmdldFNvcnRPcmRlcigpKTsKLQkJCi0JCW1nci5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9WSUVXRVJfU0VUVVAsIHNvcnRNZW51KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3UGFydChJU2VhcmNoUmVzdWx0Vmlld1BhcnQgcGFydCkgewotCQlzdXBlci5zZXRWaWV3UGFydChwYXJ0KTsKLQkJZkFjdGlvbkdyb3VwPSBuZXcgTmV3VGV4dFNlYXJjaEFjdGlvbkdyb3VwKHBhcnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmQWN0aW9uR3JvdXAuZGlzcG9zZSgpOwotCQkvLyBTZWFyY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJaWYgKGZDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCWZDb250ZW50UHJvdmlkZXIuZWxlbWVudHNDaGFuZ2VkKG9iamVjdHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQlpZiAoZkNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJZkNvbnRlbnRQcm92aWRlci5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvcnRPcmRlcihpbnQgc29ydE9yZGVyKSB7Ci0JCWZDdXJyZW50U29ydE9yZGVyPSBzb3J0T3JkZXI7Ci0JCURlY29yYXRpbmdMYWJlbFByb3ZpZGVyIGxwV3JhcHBlcj0gKERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKSBnZXRWaWV3ZXIoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCSgoRmlsZUxhYmVsUHJvdmlkZXIpIGxwV3JhcHBlci5nZXRMYWJlbFByb3ZpZGVyKCkpLnNldE9yZGVyKHNvcnRPcmRlcik7Ci0JCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJZ2V0U2V0dGluZ3MoKS5wdXQoS0VZX1NPUlRJTkcsIGZDdXJyZW50U29ydE9yZGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJc3VwZXIucmVzdG9yZVN0YXRlKG1lbWVudG8pOwotCQl0cnkgewotCQkJZkN1cnJlbnRTb3J0T3JkZXI9IGdldFNldHRpbmdzKCkuZ2V0SW50KEtFWV9TT1JUSU5HKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCS8vZkN1cnJlbnRTb3J0T3JkZXI9IGZTb3J0QnlOYW1lQWN0aW9uLmdldFNvcnRPcmRlcigpOwotCQl9Ci0JCWlmIChtZW1lbnRvICE9IG51bGwpIHsKLQkJCUludGVnZXIgdmFsdWU9IG1lbWVudG8uZ2V0SW50ZWdlcihLRVlfU09SVElORyk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlmQ3VycmVudFNvcnRPcmRlcj0gdmFsdWUuaW50VmFsdWUoKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlzdXBlci5zYXZlU3RhdGUobWVtZW50byk7Ci0JCW1lbWVudG8ucHV0SW50ZWdlcihLRVlfU09SVElORywgZkN1cnJlbnRTb3J0T3JkZXIpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSVNob3dJblRhcmdldExpc3QuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gU0hPV19JTl9UQVJHRVRfTElTVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJU3RyaW5nIGxhYmVsPSBzdXBlci5nZXRMYWJlbCgpOwotCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcj0gZ2V0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikgewotCQkJVGFibGVWaWV3ZXIgdHY9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCi0JCQlBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0PSBnZXRJbnB1dCgpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJaW50IGl0ZW1Db3VudD0gKChJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcikgdHYuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEVsZW1lbnRzKGdldElucHV0KCkpLmxlbmd0aDsKLQkJCQlpbnQgZmlsZUNvdW50PSBnZXRJbnB1dCgpLmdldEVsZW1lbnRzKCkubGVuZ3RoOwotCQkJCWlmIChpdGVtQ291bnQgPCBmaWxlQ291bnQpIHsKLQkJCQkJU3RyaW5nIGZvcm1hdD0gU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFBhZ2VfbGltaXRlZF9mb3JtYXQ7IAotCQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W117bGFiZWwsIG5ldyBJbnRlZ2VyKGl0ZW1Db3VudCksIG5ldyBJbnRlZ2VyKGZpbGVDb3VudCl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQljbGFzcyBOZXdUZXh0U2VhcmNoQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0KLQkJcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlNlbGVjdGlvblByb3ZpZGVyOwkJCi0JCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgZlBhZ2U7Ci0JCXByaXZhdGUgT3BlbkZpbGVBY3Rpb24gZk9wZW5BY3Rpb247Ci0JCXByaXZhdGUgUHJvcGVydHlEaWFsb2dBY3Rpb24gZk9wZW5Qcm9wZXJ0aWVzRGlhbG9nOwotCi0JCXB1YmxpYyBOZXdUZXh0U2VhcmNoQWN0aW9uR3JvdXAoSVZpZXdQYXJ0IHBhcnQpIHsKLQkJCUFzc2VydC5pc05vdE51bGwocGFydCk7Ci0JCQlJV29ya2JlbmNoUGFydFNpdGUgc2l0ZT0gcGFydC5nZXRTaXRlKCk7Ci0JCQlmU2VsZWN0aW9uUHJvdmlkZXI9IHNpdGUuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWZQYWdlPSBzaXRlLmdldFBhZ2UoKTsKLQkJCWZPcGVuUHJvcGVydGllc0RpYWxvZz0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKHNpdGUsIGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JCQlmT3BlbkFjdGlvbj0gbmV3IE9wZW5GaWxlQWN0aW9uKGZQYWdlKTsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBmU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQlmT3BlblByb3BlcnRpZXNEaWFsb2cuc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQkJCWVsc2UKLQkJCQlmT3BlblByb3BlcnRpZXNEaWFsb2cuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQkJLy8gdmlldyBtdXN0IGV4aXN0IGlmIHdlIGNyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgaXQuCi0JCQkKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlhZGRPcGVuV2l0aE1lbnUobWVudSwgKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQkJCWlmIChmT3BlblByb3BlcnRpZXNEaWFsb2cgIT0gbnVsbCAmJiBmT3BlblByb3BlcnRpZXNEaWFsb2cuaXNFbmFibGVkKCkgJiYgc2VsZWN0aW9uICE9IG51bGwgJiZmT3BlblByb3BlcnRpZXNEaWFsb2cuaXNBcHBsaWNhYmxlRm9yU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSkKLQkJCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9QUk9QRVJUSUVTLCBmT3BlblByb3BlcnRpZXNEaWFsb2cpOwotCQkJfQotCQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgYWRkT3BlbldpdGhNZW51KElNZW51TWFuYWdlciBtZW51LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQkJcmV0dXJuOwotCQkKLQkJCU9iamVjdCBvPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQkJaWYgKCEobyBpbnN0YW5jZW9mIElBZGFwdGFibGUpKQotCQkJCXJldHVybjsgCi0JCQotCQkJZk9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBmT3BlbkFjdGlvbik7Ci0JCQotCQkJLy8gQ3JlYXRlIG1lbnUKLQkJCUlNZW51TWFuYWdlciBzdWJtZW51PSBuZXcgTWVudU1hbmFnZXIoU2VhcmNoTWVzc2FnZXMuT3BlbldpdGhNZW51X2xhYmVsKTsgCi0JCQlzdWJtZW51LmFkZChuZXcgT3BlbldpdGhNZW51KGZQYWdlLCAoSUFkYXB0YWJsZSlvKSk7Ci0JCQotCQkJLy8gQWRkIHRoZSBzdWJtZW51LgotCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBzdWJtZW51KTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogTWV0aG9kIGRlY2xhcmVkIGluIEFjdGlvbkdyb3VwCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXIpIHsKLQkJCXN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcik7Ci0JCQlzZXRHbG9iYWxBY3Rpb25IYW5kbGVycyhhY3Rpb25CYXIpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc2V0R2xvYmFsQWN0aW9uSGFuZGxlcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUFJPUEVSVElFUy5nZXRJZCgpLCBmT3BlblByb3BlcnRpZXNEaWFsb2cpOwkJCi0JCX0KLQl9CQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTdkMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGUuSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlI9IG5ldyBPYmplY3RbMF07Ci0JCi0JcHJpdmF0ZSBTZWFyY2hSZXN1bHRQYWdlIGZQYWdlOwotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0KLQlwdWJsaWMgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIoU2VhcmNoUmVzdWx0UGFnZSBwYWdlKSB7Ci0JCWZQYWdlPSBwYWdlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzPSAoKFNlYXJjaFJlc3VsdClpbnB1dEVsZW1lbnQpLmdldEVsZW1lbnRzKCk7Ci0gICAJICAgICAgICAvLyBjcyA6IEkndmUgY29tbWVudCB0aGlzIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCQkvLyBFdmVuIG1vcmUgaW1wb3J0YW50bHkgd2UgbmVlZCB0byBkaXNjdXNzIHdpdGggdGhlIGJhc2UgZ3V5cyB0byBnZXQgQVBJIGxpbmVkIHVwIGZvciB0aGlzIChzZWUgYnVnIDE2MzE3NykuCi0JCQkvKgotCQkJaW50IHRhYmxlTGltaXQ9IFNlYXJjaFByZWZlcmVuY2VQYWdlLmdldFRhYmxlTGltaXQoKTsKLQkJCWlmIChTZWFyY2hQcmVmZXJlbmNlUGFnZS5pc1RhYmxlTGltaXRlZCgpICYmIGVsZW1lbnRzLmxlbmd0aCA+IHRhYmxlTGltaXQpIHsKLQkJCQlPYmplY3RbXSBzaG93bkVsZW1lbnRzPSBuZXcgT2JqZWN0W3RhYmxlTGltaXRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIDAsIHNob3duRWxlbWVudHMsIDAsIHRhYmxlTGltaXQpOwotCQkJCXJldHVybiBzaG93bkVsZW1lbnRzOwotCQkJfSovCi0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0FSUjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgewotCQkJZlJlc3VsdD0gKFNlYXJjaFJlc3VsdCkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cykgewotCQlUYWJsZVZpZXdlciB2aWV3ZXI9IGdldFZpZXdlcigpOwotCSAgICAvLyBjcyA6IEkndmUgY29tbWVudCAndGFibGVMaW1pdGVkJyByZWxhdGVkIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCS8vIEV2ZW4gbW9yZSBpbXBvcnRhbnRseSB3ZSBuZWVkIHRvIGRpc2N1c3Mgd2l0aCB0aGUgYmFzZSBndXlzIHRvIGdldCBBUEkgbGluZWQgdXAgZm9yIHRoaXMgKHNlZSBidWcgMTYzMTc3KS4KLQkJLy9ib29sZWFuIHRhYmxlTGltaXRlZD0gU2VhcmNoUHJlZmVyZW5jZVBhZ2UuaXNUYWJsZUxpbWl0ZWQoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkgewotCQkJCWlmICh2aWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkKLQkJCQkJdmlld2VyLnVwZGF0ZSh1cGRhdGVkRWxlbWVudHNbaV0sIG51bGwpOwotCQkJCWVsc2UgewotCQkJCQkvL2lmICghdGFibGVMaW1pdGVkIHx8IHZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIDwgU2VhcmNoUHJlZmVyZW5jZVBhZ2UuZ2V0VGFibGVMaW1pdCgpKQotCQkJCQkJdmlld2VyLmFkZCh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXZpZXdlci5yZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gKFRhYmxlVmlld2VyKSBmUGFnZS5nZXRWaWV3ZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzljZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUj0gbmV3IE9iamVjdFswXTsKLQotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0JcHJpdmF0ZSBBYnN0cmFjdFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBNYXAgZkNoaWxkcmVuTWFwOwotCQotCVNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIoQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlcikgewotCQlmVHJlZVZpZXdlcj0gdmlld2VyOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSB7Ci0JCQlpbml0aWFsaXplKChTZWFyY2hSZXN1bHQpIG5ld0lucHV0KTsKLQkJfQotCX0KLQkKLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQpIHsKLQkJZlJlc3VsdD0gcmVzdWx0OwotCQlmQ2hpbGRyZW5NYXA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHM9IHJlc3VsdC5nZXRFbGVtZW50cygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5zZXJ0KGVsZW1lbnRzW2ldLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnQoT2JqZWN0IGNoaWxkLCBib29sZWFuIHJlZnJlc2hWaWV3ZXIpIHsKLQkJT2JqZWN0IHBhcmVudD0gZ2V0UGFyZW50KGNoaWxkKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5zZXJ0Q2hpbGQocGFyZW50LCBjaGlsZCkpIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikKLQkJCQkJZlRyZWVWaWV3ZXIuYWRkKHBhcmVudCwgY2hpbGQpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikKLQkJCQkJZlRyZWVWaWV3ZXIucmVmcmVzaChwYXJlbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoaWxkPSBwYXJlbnQ7Ci0JCQlwYXJlbnQ9IGdldFBhcmVudChjaGlsZCk7Ci0JCX0KLQkJaWYgKGluc2VydENoaWxkKGZSZXN1bHQsIGNoaWxkKSkgewotCQkJaWYgKHJlZnJlc2hWaWV3ZXIpCi0JCQkJZlRyZWVWaWV3ZXIuYWRkKGZSZXN1bHQsIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hpbGQgYWxyZWFkeSB3YXMgYSBjaGlsZCBvZiBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnllPC9jb2RlPiBpZiB0aGUgY2hpbGQgd2FzIGFkZGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGluc2VydENoaWxkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCQlTZXQgY2hpbGRyZW49IChTZXQpIGZDaGlsZHJlbk1hcC5nZXQocGFyZW50KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuPSBuZXcgSGFzaFNldCgpOwotCQkJZkNoaWxkcmVuTWFwLnB1dChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gcmVmcmVzaFZpZXdlcikgewotCQkvLyBwcmVjb25kaXRpb24gaGVyZTogIGZSZXN1bHQuZ2V0TWF0Y2hDb3VudChjaGlsZCkgPD0gMAotCQotCQlpZiAoaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKQotCQkJCWZUcmVlVmlld2VyLnJlZnJlc2goZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZlJlc3VsdC5nZXRNYXRjaENvdW50KGVsZW1lbnQpID09IDApIHsKLQkJCQlmQ2hpbGRyZW5NYXAucmVtb3ZlKGVsZW1lbnQpOwotCQkJCU9iamVjdCBwYXJlbnQ9IGdldFBhcmVudChlbGVtZW50KTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIHBhcmVudCk7Ci0JCQkJCXJlbW92ZShwYXJlbnQsIHJlZnJlc2hWaWV3ZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbW92ZUZyb21TaWJsaW5ncyhlbGVtZW50LCBmUmVzdWx0KTsKLQkJCQkJaWYgKHJlZnJlc2hWaWV3ZXIpCi0JCQkJCQlmVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCQlmVHJlZVZpZXdlci5yZWZyZXNoKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVGcm9tU2libGluZ3MoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKLQkJU2V0IHNpYmxpbmdzPSAoU2V0KSBmQ2hpbGRyZW5NYXAuZ2V0KHBhcmVudCk7Ci0JCWlmIChzaWJsaW5ncyAhPSBudWxsKSB7Ci0JCQlzaWJsaW5ncy5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJU2V0IGNoaWxkcmVuPSAoU2V0KSBmQ2hpbGRyZW5NYXAuZ2V0KHBhcmVudEVsZW1lbnQpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9BUlI7Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkKLQkJCQlpbnNlcnQodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJCWVsc2UKLQkJCQlyZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKGZSZXN1bHQpOwotCQlmVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgZWxlbWVudDsKLQkJCXJldHVybiByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9GaWxlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvRmlsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ZTI3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9GaWxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiBEZXJpdmVkIGZyb20gb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLkZpbGVMYWJlbFByb3ZpZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5TZWFyY2hNZXNzYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19MQUJFTD0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0xBQkVMX1BBVEg9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19QQVRIX0xBQkVMPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfUEFUSD0gNDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdTZXBhcmF0b3JGb3JtYXQ9ICJ7MH0gLSB7MX0iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UgZlBhZ2U7Ci0JCQotCXByaXZhdGUgaW50IGZPcmRlcjsKLQlwcml2YXRlIFN0cmluZ1tdIGZBcmdzPSBuZXcgU3RyaW5nWzJdOwotCi0JcHVibGljIEZpbGVMYWJlbFByb3ZpZGVyKEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlIHBhZ2UsIGludCBvcmRlckZsYWcpIHsKLQkJZkxhYmVsUHJvdmlkZXI9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0JCWZPcmRlcj0gb3JkZXJGbGFnOwotCQlmUGFnZT0gcGFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcihpbnQgb3JkZXJGbGFnKSB7Ci0JCWZPcmRlcj0gb3JkZXJGbGFnOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQlyZXR1cm4gZk9yZGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlSZXNvdXJjZSByZXNvdXJjZT0gKElSZXNvdXJjZSllbGVtZW50OwotCQlTdHJpbmcgdGV4dD0gbnVsbDsKLQotCQlpZiAoIXJlc291cmNlLmV4aXN0cygpKQotCQkJdGV4dD0gU2VhcmNoTWVzc2FnZXMuRmlsZUxhYmVsUHJvdmlkZXJfcmVtb3ZlZF9yZXNvdXJjZV9sYWJlbDsgCi0JCQotCQllbHNlIHsKLQkJCUlQYXRoIHBhdGg9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJaWYgKHBhdGguZ2V0RGV2aWNlKCkgPT0gbnVsbCkKLQkJCQlwYXRoPSBwYXRoLm1ha2VSZWxhdGl2ZSgpOwotCQkJaWYgKGZPcmRlciA9PSBTSE9XX0xBQkVMIHx8IGZPcmRlciA9PSBTSE9XX0xBQkVMX1BBVEgpIHsKLQkJCQl0ZXh0PSBmTGFiZWxQcm92aWRlci5nZXRUZXh0KHJlc291cmNlKTsKLQkJCQlpZiAocGF0aCAhPSBudWxsICYmIGZPcmRlciA9PSBTSE9XX0xBQkVMX1BBVEgpIHsKLQkJCQkJZkFyZ3NbMF09IHRleHQ7Ci0JCQkJCWZBcmdzWzFdPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCXRleHQ9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZnU2VwYXJhdG9yRm9ybWF0LCBmQXJncyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGF0aCAhPSBudWxsKQotCQkJCQl0ZXh0PSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQl0ZXh0PSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChmT3JkZXIgPT0gU0hPV19QQVRIX0xBQkVMKSB7Ci0JCQkJCWZBcmdzWzBdPSB0ZXh0OwotCQkJCQlmQXJnc1sxXT0gZkxhYmVsUHJvdmlkZXIuZ2V0VGV4dChyZXNvdXJjZSk7Ci0JCQkJCXRleHQ9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZnU2VwYXJhdG9yRm9ybWF0LCBmQXJncyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpbnQgbWF0Y2hDb3VudD0gMDsKLQkJQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdD0gZlBhZ2UuZ2V0SW5wdXQoKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJbWF0Y2hDb3VudD0gcmVzdWx0LmdldE1hdGNoQ291bnQoZWxlbWVudCk7Ci0JCWlmIChtYXRjaENvdW50IDw9IDEpCi0JCQlyZXR1cm4gdGV4dDsKLQkJU3RyaW5nIGZvcm1hdD0gU2VhcmNoTWVzc2FnZXMuRmlsZUxhYmVsUHJvdmlkZXJfY291bnRfZm9ybWF0OyAKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IE9iamVjdFtdIHsgdGV4dCwgbmV3IEludGVnZXIobWF0Y2hDb3VudCkgfSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVJlc291cmNlIHJlc291cmNlPSAoSVJlc291cmNlKWVsZW1lbnQ7Ci0JCUltYWdlIGltYWdlPSBmTGFiZWxQcm92aWRlci5nZXRJbWFnZShyZXNvdXJjZSk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWZMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZkxhYmVsUHJvdmlkZXIuaXNMYWJlbFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJZkxhYmVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQlmTGFiZWxQcm92aWRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL0lGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWY0MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKgotICogRGVyaXZlZCBmcm9tIG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOTFkYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICogRGVyaXZlZCBmcm9tIG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5NZXNzYWdlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBmb3JtYXQgbWVzc2FnZSBzdHJpbmdzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIG5ldyBPYmplY3RbXSB7IG9iamVjdH0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0W10gb2JqZWN0cykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgb2JqZWN0cyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gTm90IGZvciBpbnN0YW50aWF0aW9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvUmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1MjgxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICogRGVyaXZlZCBmcm9tIG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotCi0vKioKLSAqIEEgZHJhZyBhZGFwdGVyIHRoYXQgdHJhbnNmZXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhcyA8L2NvZGU+Ci0gKiBJUmVzb3VyY2U8L2NvZGU+LiBPbmx5IHRob3NlIGVsZW1lbnRzIGluIHRoZSBzZWxlY3Rpb24gYXJlIHBhcnQgCi0gKiBvZiB0aGUgdHJhbnNmZXIgd2hpY2ggY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGFuIDxjb2RlPklSZXNvdXJjZQotICogPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlciBleHRlbmRzIERyYWdTb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIgZm9yIHRoZSBnaXZlbiBzZWxlY3Rpb24KLQkgKiBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHNlbGVjdGlvbiBwcm92aWRlciB0byBhY2Nlc3MgdGhlIHZpZXdlcidzIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWZQcm92aWRlcj0gcHJvdmlkZXI7Ci0JCUFzc2VydC5pc05vdE51bGwoZlByb3ZpZGVyKTsKLQl9Ci0JCi0JcHVibGljIFRyYW5zZmVyIGdldFRyYW5zZmVyKCkgewotCQlyZXR1cm4gUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCWV2ZW50LmRvaXQ9IGNvbnZlcnRTZWxlY3Rpb24oKS5zaXplKCkgPiAwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCByZXNvdXJjZXM9IGNvbnZlcnRTZWxlY3Rpb24oKTsKLQkJZXZlbnQuZGF0YT0gcmVzb3VyY2VzLnRvQXJyYXkobmV3IElSZXNvdXJjZVtyZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCFldmVudC5kb2l0KQotCQkJcmV0dXJuOwotCX0KLQkKLQlwcml2YXRlIExpc3QgY29udmVydFNlbGVjdGlvbigpIHsKLQkJSVNlbGVjdGlvbiBzPSBmUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghKHMgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHM7Ci0JCUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KHNlbGVjdGlvbi5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50PSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL1NvcnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL1NvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5MWVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9Tb3J0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqIERlcml2ZWQgZnJvbSBvcmcuZWNsaXBzZS5zZWFyY2guaW50ZXJuYWwudWkuU29ydEFjdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5TZWFyY2hSZXN1bHRQYWdlOwotCi1wdWJsaWMgY2xhc3MgU29ydEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJpdmF0ZSBpbnQgZlNvcnRPcmRlcjsKLQlwcml2YXRlIFNlYXJjaFJlc3VsdFBhZ2UgZlBhZ2U7Ci0JCi0JcHVibGljIFNvcnRBY3Rpb24oU3RyaW5nIGxhYmVsLCBTZWFyY2hSZXN1bHRQYWdlIHBhZ2UsIGludCBzb3J0T3JkZXIpIHsKLQkJc3VwZXIobGFiZWwpOwotCQlmUGFnZT0gcGFnZTsKLQkJZlNvcnRPcmRlcj0gc29ydE9yZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZlBhZ2Uuc2V0U29ydE9yZGVyKGZTb3J0T3JkZXIpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U29ydE9yZGVyKCkgewotCQlyZXR1cm4gZlNvcnRPcmRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODk1NTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLk1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgIHByaXZhdGUgU3RyaW5nIGRpYWxvZ1RpdGxlOwotCi0gICAgcHJvdGVjdGVkIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0gICAgcHJpdmF0ZSBMaXN0IGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQ7Ci0gICAgcHJpdmF0ZSBMaXN0IG1hc3RlckNvbXBvbmVudExpc3Q7Ci0gICAgCi0gICAgLy8gd2lkZ2V0cwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgdG9wQ29tcG9zaXRlOwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgYm90dG9tQ29tcG9zaXRlOyAKLSAgICBwcml2YXRlIFRleHQgdGV4dEZpbHRlcjsKLSAgICBwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY29tcG9uZW50VGFibGVWaWV3ZXI7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlTG9jYXRpb25MYWJlbCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9ERUNMQVJBVElPTl9MT0NBVElPTjsKLSAgICBwcm90ZWN0ZWQgVmlld0Zvcm0gZmlsZUxvY2F0aW9uVmlldzsgICAgCi0gICAgcHJvdGVjdGVkIENMYWJlbCBsb2NhdGlvbkxhYmVsOwotCi0gICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgaXRlbSBwcmV2aW91c2x5IHNlbGVjdGVkIGluIHRoZSB0YWJsZQotCXByaXZhdGUgVGFibGVJdGVtIHByZXZJdGVtOwotCXByaXZhdGUgU3RyaW5nIHByZXZJdGVtVGV4dDsKLQotCXByb3RlY3RlZCBPYmplY3QgY29tcG9uZW50U2VsZWN0aW9uOwotICAgIHByb3RlY3RlZCBPYmplY3QgcXVhbGlmaWVyVGV4dFNlbGVjdGlvbjsKLSAgICAKLQlwcm90ZWN0ZWQgVG9vbEJhciBmaWx0ZXJUb29sQmFyOwotCXByb3RlY3RlZCBUb29sSXRlbSB0b29sSXRlbTsKLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgZk1lbnVNYW5hZ2VyOwotCQotCXByb3RlY3RlZCBIYXNoTWFwIFRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sID0gbmV3IEhhc2hNYXAoKTsgIAotICAgIHByaXZhdGUgQnV0dG9uIG5ld0J1dHRvbjsKLSAKLQotCXB1YmxpYyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgc3VwZXIoc2hlbGwpOwotICAgICAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgICAgICB0aGlzLmRpYWxvZ1RpdGxlID0gZGlhbG9nVGl0bGU7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG1hc3RlckNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uaW5pdCh0aGlzKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotICAgICAgICBzdXBlci5jcmVhdGUoKTsKLSAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBzZXRUZXh0RmlsdGVyRm9jdXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGV4dEZpbHRlckZvY3VzKCkgewotICAgICAgICB0ZXh0RmlsdGVyLnNldEZvY3VzKCk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZ2V0U2hlbGwoKS5zZXRUZXh0KGRpYWxvZ1RpdGxlKTsKLQotICAgICAgICBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgICAgR3JpZERhdGEgZ0RhdGEgPSAoR3JpZERhdGEpIG1haW5Db21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBnRGF0YS5oZWlnaHRIaW50ID0gNTAwOwotICAgICAgICBnRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0gICAgICAgIAotICAgICAgICBjb25maWd1cmF0aW9uLmNyZWF0ZVdpZGdldEFib3ZlUXVhbGlmaWVyQm94KG1haW5Db21wb3NpdGUpOyAgICAgICAgCi0gICAgICAgIC8vIFN1YmNsYXNzZXMgbWF5IHVzZSB0aGlzIENvbXBvc2l0ZSB0byBhZGQgZGVzaXJlZCB3aWRnZXRzCi0gICAgICAgIC8vdG9wQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIC8vdG9wQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotICAgICAgICAvL3RvcENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gZG8gd2UgbmVlZCB0byBpbnRyb2R1Y2UgYSBtZXRob2QgaGVyZSB0byBjb250YWluIHRoaXMKLSAgICAgICAgLy8gc28gd2UgY2FuIGFkZCBkaWZmZXJlbnQgcGFyZW50IG90aGVyIHRoYW4gJ3RvcENvbXBvc2l0ZScKLSAgICAgICAgQ29tcG9zaXRlIGZpbHRlckxhYmVsQW5kVGV4dCA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dEZpbHRlckxhYmVsQW5kVGV4dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgbGF5b3V0RmlsdGVyTGFiZWxBbmRUZXh0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0RmlsdGVyTGFiZWxBbmRUZXh0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGZpbHRlckxhYmVsQW5kVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZmlsdGVyTGFiZWxBbmRUZXh0LnNldExheW91dChsYXlvdXRGaWx0ZXJMYWJlbEFuZFRleHQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBUZXh0IHRleHRGaWx0ZXIKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGZpbHRlckxhYmVsID0gbmV3IExhYmVsKGZpbHRlckxhYmVsQW5kVGV4dCwgU1dULk5PTkUpOwotICAgICAgICBmaWx0ZXJMYWJlbC5zZXRUZXh0KGNvbmZpZ3VyYXRpb24uZ2V0RmlsdGVyTGFiZWxUZXh0KCkpOy8vICsgIig/ID0gYW55IGNoYXJhY3RlciwgKiA9IGFueSBzdHJpbmcpOiIpOwotICAgICAgICBHcmlkRGF0YSBmaWx0ZXJMYWJlbERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZmlsdGVyTGFiZWxEYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZmlsdGVyTGFiZWwuc2V0TGF5b3V0RGF0YShmaWx0ZXJMYWJlbERhdGEpOwotCi0gICAgICAgIHRleHRGaWx0ZXIgPSBuZXcgVGV4dChmaWx0ZXJMYWJlbEFuZFRleHQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgdGV4dEZpbHRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsgICAgICAgIAotICAgICAgICB0ZXh0RmlsdGVyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBUZXh0RmlsdGVyTW9kaWZ5QWRhcHRlcigpKTsKLSAgICAgICAgR3JpZERhdGEgdGV4dEZpbHRlckRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgdGV4dEZpbHRlckRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIHRleHRGaWx0ZXJEYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICB0ZXh0RmlsdGVyLnNldExheW91dERhdGEodGV4dEZpbHRlckRhdGEpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSU5ld0NvbXBvbmVudEhhbmRsZXIgaGFuZGxlciA9IGNvbmZpZ3VyYXRpb24uZ2V0TmV3Q29tcG9uZW50SGFuZGxlcigpOwotICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICAgbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihmaWx0ZXJMYWJlbEFuZFRleHQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgbmV3QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX05ldyk7ICAKLSAgICAgICAgICAgbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICAgICAgIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZXIub3Blbk5ld0NvbXBvbmVudERpYWxvZygpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZXIub3Blbk5ld0NvbXBvbmVudERpYWxvZygpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAKLSAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgQ29tcG9uZW50IFRhYmxlVmlld2VyCi0gICAgICAgIGNyZWF0ZUNvbXBvbmVudFRhYmxlVmlld2VyKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb24uY3JlYXRlV2lkZ2V0QWJvdmVRdWFsaWZpZXJCb3gobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgUXVhbGlmaWVyIExpc3Qgd2lkZ2V0Ci0gICAgICAgIExhYmVsIHF1YWxpZmllckxhYmVsID0gbmV3IExhYmVsKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcXVhbGlmaWVyTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfUVVBTElGSUVSKTsKLQkJcXVhbGlmaWVyTGFiZWwuc2V0VGV4dChmaWxlTG9jYXRpb25MYWJlbCk7Ci0KLSAgICAgICAgZmlsZUxvY2F0aW9uVmlldyA9IG5ldyBWaWV3Rm9ybShtYWluQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULkZMQVQgKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSAyMjsKLSAgICAgICAgZmlsZUxvY2F0aW9uVmlldy5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAKLSAgICAJbG9jYXRpb25MYWJlbCA9IG5ldyBDTGFiZWwoZmlsZUxvY2F0aW9uVmlldywgU1dULkZMQVQpOwotICAgICAgICBmaWxlTG9jYXRpb25WaWV3LnNldENvbnRlbnQobG9jYXRpb25MYWJlbCk7Ci0gICAgCWxvY2F0aW9uTGFiZWwuc2V0Rm9udChmaWxlTG9jYXRpb25WaWV3LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbi5jcmVhdGVXaWRnZXRCZWxvd1F1YWxpZmllckJveChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBib3R0b21Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gUG9wdWxhdGUgdGhlIENvbXBvbmVudCBUYWJsZVZpZXdlciB2aWEgdGhlIHByb3ZpZGVyCi0gICAgICAgIC8vIFRPRE86IElzIHRoaXMgdGhlIHJpZ2h0IHdheSB0byBzZXQvZ2V0IHRoZSBDb250ZW50UHJvdmlkZXI/Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQ29tcG9uZW50VGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoY29uZmlndXJhdGlvbi5nZXREZXNjcmlwdGlvblByb3ZpZGVyKCkuZ2V0TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldElucHV0KGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE8gKGNzKSBuZWVkIHRvIGRvIHNvbWUgd29yayB0byBtYWtlIHRoZSBkZWZhdWx0IHNlYXJjaCBzY29wZQotICAgICAgICAvLyBtb3JlIHdlbGwgZGVmaW5lZCwgY3VycmVudGx5IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBwYXNzIGEgbnVsbAotICAgICAgICAvLyBhcmd1bWVudCBpbiB0byBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3QgYnV0IHdlIHNob3VsZCBwcm92aWRlCi0gICAgICAgIC8vIGdldHRlcnMvc2V0dGVycyB0byBhbGxvdyB0aGUgZGVmYXVsdCB0byBiZSBjb250cm9sbGVkCi0gICAgICAgIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdChudWxsKTsKLSAgICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKCIiKTsKLQotICAgICAgICByZXR1cm4gbWFpbkNvbXBvc2l0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBDcmVhdGVzIHRoZSBDb21wb25lbnQgVGFibGVWaWV3ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudFRhYmxlVmlld2VyKENvbXBvc2l0ZSBiYXNlKSB7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyID0gY3JlYXRlRmlsdGVyTWVudUFuZFRhYmxlVmlld2VyKGJhc2UpOyAgICAKLSAgICAgICAgCi0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy9JU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAvL0xpc3QgcXVhbGlmaWVycyA9IHNlYXJjaExpc3RQcm92aWRlci5nZXRRdWFsaWZpZXJzKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIC8vdXBkYXRlUXVhbGlmaWVyTGlzdChxdWFsaWZpZXJzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDYW5GaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAJLy8gQ2hhbmdpbmcgdGhlIHRleHQgZm9yIHRoZSBjb21wb25lbnQgc2VsZWN0ZWQgYW5kIGRpc3BsYXkgaXRzIHNvdXJjZQotICAgICAgICAJLy8gZmlsZSBpbiB0aGUgYm94IHVuZGVyIHRoZSB0YWJsZSB2aWV3ZXIKLSAgICAgICAgICAKLSAgICAgICAgCUlDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGRlc2NyaXB0aW9uUHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldERlc2NyaXB0aW9uUHJvdmlkZXIoKTsgICAgICAgIAkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQkJCi0JCQkJcnVuKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIC8vIGJ1ZyAxNDQ1NDggLSB1bm5lY2Vzc2FyeQotICAgICAgICAvLyBydW4oKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHJ1bigpIHsKLQkJCQkvLyByZXN0b3JlcyB0aGUgdGV4dCBvZiBwcmV2aW91cyBpdGVtCi0JCQkJaWYgKHByZXZJdGVtICE9IG51bGwgJiYgIXByZXZJdGVtLmlzRGlzcG9zZWQoKSl7Ci0JCQkJCXByZXZJdGVtLnNldFRleHQocHJldkl0ZW1UZXh0KTsKLQkJCQl9Ci0JCQkJVGFibGVJdGVtW10gaXRlbXMgPSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBjb21wb25lbnQgPSBpdGVtc1swXS5nZXREYXRhKCk7Ci0KLQkJCQlwcmV2SXRlbSA9IGl0ZW1zWzBdOwotCQkJCXByZXZJdGVtVGV4dCA9IGl0ZW1zWzBdLmdldFRleHQoKTsKLQotCQkJCS8vIGFkZCBjbGFyaWZpY2F0aW9uIGZvciB0aGUgZmlyc3Qgc2VsZWN0ZWQgaXRlbQotCQkJCWl0ZW1zWzBdLnNldFRleHQoICBkZXNjcmlwdGlvblByb3ZpZGVyLmdldE5hbWUoY29tcG9uZW50KSArICIgLSAiICsgCi0gICAgCQkJCQlkZXNjcmlwdGlvblByb3ZpZGVyLmdldFF1YWxpZmllcihjb21wb25lbnQpKTsKLQotCQkJCXVwZGF0ZUxvY2F0aW9uVmlldyhjb21wb25lbnQsIGRlc2NyaXB0aW9uUHJvdmlkZXIpOwotCQkJfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJb2tQcmVzc2VkKCk7Ci0JCQl9Ci0gICAgICAgIAkKLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBUYWJsZVZpZXdlciBjcmVhdGVGaWx0ZXJNZW51QW5kVGFibGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXApIHsKLSAgICAJQ29tcG9zaXRlIGxhYmVsQW5kRmlsdGVyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0gICAgCWxhYmVsQW5kRmlsdGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsgbGF5b3V0Lm1hcmdpbkhlaWdodD0gMDsKLSAgICAJbGFiZWxBbmRGaWx0ZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgCQotICAgICAgICBMYWJlbCB0YWJsZUxhYmVsID0gbmV3IExhYmVsKGxhYmVsQW5kRmlsdGVyLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIHRhYmxlTGFiZWwuc2V0VGV4dChjb25maWd1cmF0aW9uLmdldExpc3RMYWJlbFRleHQoKSk7Ci0gICAgICAgIAotICAgICAgICBmaWx0ZXJUb29sQmFyID0gbmV3IFRvb2xCYXIobGFiZWxBbmRGaWx0ZXIsU1dULkZMQVQpOwotICAgICAgICBjb25maWd1cmF0aW9uLmNyZWF0ZVRvb2xCYXJJdGVtcyhmaWx0ZXJUb29sQmFyKTsKLQotICAgICAgICBUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihuZXcgVGFibGUobGFiZWxBbmRGaWx0ZXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKSk7Ci0gICAgICAgIENvbnRyb2wgVGFibGVXaWRnZXQgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIFRhYmxlV2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIHJldHVybiB0YWJsZVZpZXdlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxvY2F0aW9uVmlldyhPYmplY3QgY29tcG9uZW50LCBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBscCkgewotICAgIAlJRmlsZSBmaWxlID0gbHAuZ2V0RmlsZShjb21wb25lbnQpOwotICAgIAkKLSAgICAJaWYgKCBmaWxlID09IG51bGwgKXsKLSAgICAJCWxvY2F0aW9uTGFiZWwuc2V0VGV4dCgiIik7Ci0gICAgCQlsb2NhdGlvbkxhYmVsLnNldEltYWdlKG51bGwpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCVN0cmluZyBmaWxlUGF0aCA9ICIiOwotICAgIAlmaWxlUGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAvL2xvY2F0aW9uVmlldy5yZWRyYXcoKTsKLSAgICAgICAgCi0gICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0VGV4dChUZXh0UHJvY2Vzc29yLnByb2Nlc3MoZmlsZVBhdGgpKTsKLSAgICAgICAgbG9jYXRpb25MYWJlbC5zZXRJbWFnZShscC5nZXRGaWxlSWNvbihjb21wb25lbnQpKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9jZXNzZWQgZmlsdGVyIHRleHQgZm9yIHRoZSBUZXh0IGZpZWxkLiAgSW5zZXJ0cyBhICIuIgotICAgICAqIGJlZm9yZSBlYWNoIHN1cHBvcnRlZCBtZXRhLWNoYXJhY3Rlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2Nlc3NlZEZpbHRlclN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NGaWx0ZXJTdHJpbmcodGV4dEZpbHRlci5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgc3VwcG9ydGVkIG1ldGFjaGFyYWN0ZXJzIGFyZSB1c2VkIGluIHRoZSBmaWx0ZXIgc3RyaW5nLCB3ZSBuZWVkIHRvCi0gICAgICogaW5zZXJ0IGEgIi4iIGJlZm9yZSBlYWNoIG1ldGFjaGFyYWN0ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0ZpbHRlclN0cmluZyhTdHJpbmcgaW5wdXRTdHJpbmcpIHsKLSAgICAgICAgaWYgKCEoaW5wdXRTdHJpbmcuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgIGlucHV0U3RyaW5nID0gaW5zZXJ0U3RyaW5nKCIqIiwgIi4iLCBpbnB1dFN0cmluZyk7Ci0gICAgICAgICAgICBpbnB1dFN0cmluZyA9IGluc2VydFN0cmluZygiPyIsICIuIiwgaW5wdXRTdHJpbmcpOwotICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSBpbnB1dFN0cmluZyArICIuKiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmluZyA9ICIuKiI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW5wdXRTdHJpbmcudG9Mb3dlckNhc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGluc2VydCBhICIuIiBiZWZvcmUgZWFjaCBtZXRhY2hhcmFjdGVyIGluIHRoZQotICAgICAqIHNlYXJjaC9maWx0ZXIgc3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGluc2VydFN0cmluZyhTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgbmV3U3RyaW5nLCBTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cmluZyk7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gc3RyaW5nQnVmZmVyLmluZGV4T2YodGFyZ2V0KTsKLSAgICAgICAgd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIgPSBzdHJpbmdCdWZmZXIuaW5zZXJ0KGluZGV4LCBuZXdTdHJpbmcpOwotICAgICAgICAgICAgaW5kZXggPSBzdHJpbmdCdWZmZXIuaW5kZXhPZih0YXJnZXQsIGluZGV4ICsgbmV3U3RyaW5nLmxlbmd0aCgpICsgdGFyZ2V0Lmxlbmd0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0KLQotICAgIC8qCi0gICAgICogTGlzdGVucyB0byBjaGFuZ2VzIG1hZGUgaW4gdGhlIHRleHQgZmlsdGVyIHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVGV4dEZpbHRlck1vZGlmeUFkYXB0ZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgaWYgKGUud2lkZ2V0ID09IHRleHRGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVsYXllZEV2ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsYXllZEV2ZW50LkNBTkNFTCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVsYXllZEV2ZW50ID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgICAgICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLnRpbWVyRXhlYyg0MDAsIGRlbGF5ZWRFdmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1RPRE8uLi4gZG8gd2UgcmVhbGx5IG5lZWQgb25lIGluc3RhbmNlPwotICAgIHByaXZhdGUgRGVsYXllZEV2ZW50IGRlbGF5ZWRFdmVudDsKLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBjb21wb25lbnQgVGFibGVWaWV3ZXIgd2hlbiB0aGUgdGV4dCBmaWx0ZXIgaXMgbW9kaWZpZWQuCi0gICAgICogVXNlIGEgRGVsYXllZEV2ZW50IHNvIHdlIGRvbid0IHVwZGF0ZSBvbiBldmVyeSBrZXlzdHJva2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBEZWxheWVkRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIENBTkNFTCA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmICghQ0FOQ0VMKSB7Ci0gICAgICAgICAgICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKGdldFByb2Nlc3NlZEZpbHRlclN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBTZWxlY3QgZmlyc3QgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKClbMF07Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtc1tdID0gbmV3IFRhYmxlSXRlbVsxXTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0gPSBpdGVtOwotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBxdWFsaWZpZXJMaXN0Ci0gICAgICAgICAgICAgICAgLy9JU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC4uLiBtYW5hZ2UgcXVhbGlmaWVycwotICAgICAgICAgICAgICAgIC8vTGlzdCBxdWFsaWZpZXJzID0gc2VhcmNoTGlzdFByb3ZpZGVyLmdldFF1YWxpZmllcnMoc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgLy91cGRhdGVRdWFsaWZpZXJMaXN0KHF1YWxpZmllcnMpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHVwZGF0ZUNhbkZpbmlzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgQ29tcG9uZW50TGlzdCBpbXBsZW1lbnRzIElDb21wb25lbnRMaXN0IHsKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3Igb2JqZWN0VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBwcml2YXRlIGxvbmcgY3VycmVudENoYW5nZUNvdW50ZXIgPSAwOwotICAgICAgICBwcml2YXRlIGxvbmcgbGFzdFVwZGF0ZVRpbWUgPSAwOwotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBvYmplY3RWZWN0b3IuYWRkKG8pOwotICAgICAgICAgICAgY3VycmVudENoYW5nZUNvdW50ZXIrKzsKLSAgICAgICAgICAgIGRvVmlld2VyVXBkYXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBvYmplY3RWZWN0b3IuYWRkQWxsKGNvbGxlY3Rpb24pOwotICAgICAgICAgIGN1cnJlbnRDaGFuZ2VDb3VudGVyICs9IGNvbGxlY3Rpb24uc2l6ZSgpOwotICAgICAgICAgIGRvVmlld2VyVXBkYXRlKCk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZG9WaWV3ZXJVcGRhdGUoKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiB3ZSBzaG91bGQgYWxzbyBhZGQgYSB0aW1lciBjb25kaXRpb24/PwotICAgICAgICAgIC8vICBpZiAoY3VycmVudENoYW5nZUNvdW50ZXIgPj0gMTApIHsKLSAgICAgICAgICAvLyAgICAgIGN1cnJlbnRDaGFuZ2VDb3VudGVyID0gMDsKLSAgICAgICAgICAvLyAgICAgIGZpcmVVcGRhdGVMaXN0KHRoaXMpOwotICAgICAgICAgIC8vICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gY3M6IHllcCBJIHRoaW5rIHdlIHJlYWxseSBkbyBuZWVkIHRvIHVzZSBhIHRpbWUgYmFzZWQgYXBwcm9hY2gKLSAgICAgICAgICAvLyAgICAgICAgICAKLSAgICAgICAgICBsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICBpZiAodGltZSAtIGxhc3RVcGRhdGVUaW1lID4gMzAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBsYXN0VXBkYXRlVGltZSA9IHRpbWU7Ci0gICAgICAgICAgICAgZmlyZVVwZGF0ZUxpc3QoQ29tcG9uZW50TGlzdC50aGlzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIG9iamVjdFZlY3Rvci5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG9iamVjdFZlY3Rvci5zdWJMaXN0KHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG9iamVjdFZlY3Rvci5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgCi0gICAgLy8gdGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgZnJvbSBhIG5vbi11aSB0aHJlYWQgc28gbmVlZHMgdG8gY2FsbAotICAgIC8vIGFzeW5jRXhlYyB0byBlbnN1cmUgdGhlIFVJIHVwZGF0ZXMgaGFwcGVuIG9uIHRoZSBVSSB0aHJlYWQKLSAgICAvLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVVcGRhdGVMaXN0KGZpbmFsIENvbXBvbmVudExpc3QgbGlzdCkgeyAgICAKLSAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKXsKLSAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IG9iamVjdHMKLSAgICAgICAgICAgICAgICBpbnQgZ3Jvd2luZ0xpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaW50IGN1cnJlbnRTaXplID0gbWFzdGVyQ29tcG9uZW50TGlzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3dpbmdMaXN0U2l6ZSA+IGN1cnJlbnRTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hc3RlckNvbXBvbmVudExpc3QuYWRkQWxsKGxpc3Quc3ViTGlzdChjdXJyZW50U2l6ZSwgZ3Jvd2luZ0xpc3RTaXplKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKGdldFByb2Nlc3NlZEZpbHRlclN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOyAgICAgICAgCi0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHZvaWQgdXBkYXRlRm9yRmlsdGVyQ2hhbmdlKCkKLSAgICB7Ci0gICAgICBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3QobnVsbCk7Ci0gICAgICByZWZyZXNoVGFibGVWaWV3ZXIoZ2V0UHJvY2Vzc2VkRmlsdGVyU3RyaW5nKCkpOwotICAgIH0gIAotICAgIAotICAgIC8qCi0gICAgICogUG9wdWxhdGUgdGhlIENvbXBvbmVudCBUcmVlVmlld2VyIHdpdGggaXRlbXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYXN0ZXJDb21wb25lbnRMaXN0KGZpbmFsIFNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlKSB7Ci0gICAgICAgIG1hc3RlckNvbXBvbmVudExpc3QuY2xlYXIoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENvbXBvbmVudExpc3QgY29tcG9uZW50TGlzdCA9IG5ldyBDb21wb25lbnRMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPIChjcykgaXQgZG9lc24ndCBzZWVtIHRvIG1ha2Ugc2VubnNlIHRvIGRvIGFueSBvZiB0aGUgd29yayBvbiB0aGUgVUkgdGhyZWFkCi0gICAgICAgIC8vIEkndmUgY2hhbmdlIHRoZSBiZWhhdmlvdXIgaGVyZSB0byBkbyBhbGwgb2YgdGhlIHdvcmsgaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgLy8KLSAgICAgICAgLy9zZWFyY2hMaXN0UHJvdmlkZXIuX3BvcHVsYXRlQ29tcG9uZW50TGlzdFF1aWNrKGNvbXBvbmVudExpc3QsIDApOyAgICAgICAgCi0gICAgICAgIEpvYiBqb2IgPSBuZXcgSm9iKCJyZWFkIGNvbXBvbmVudHMiKSB7Ci0gICAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgLy8gdGhpcyBzdHVmZiBnZXRzIGV4ZWN1dGVkIG9uIGEgbm9uLVVJIHRocmVhZAotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICBsb25nIHRpbWUxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0U2VhcmNoTGlzdFByb3ZpZGVyKCkucG9wdWxhdGVDb21wb25lbnRMaXN0KGNvbXBvbmVudExpc3QsIHNlYXJjaFNjb3BlLCBudWxsKTsgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAvLyBEbyBhIGZpbmFsIHVwZGF0ZSBvZiBvdXIgSW5wdXQgZm9yIHRoZSBjb21wb25lbnQgdHJlZSB2aWV3ZXIuCi0gICAgICAgICAgICAgIGZpcmVVcGRhdGVMaXN0KGNvbXBvbmVudExpc3QpOwotICAgICAgICAgICAgICBsb25nIHRpbWUyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGltZT0iICsgKHRpbWUyIC0gdGltZTEpICsgIiBpdGVtcz0gIiArIG1hc3RlckNvbXBvbmVudExpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9OwotICAgICAgICBqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFRhYmxlVmlld2VyKFN0cmluZyBmaWx0ZXJUZXh0KSB7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQuY2xlYXIoKTsKLSAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgUGF0dGVybiByZWdleCA9IFBhdHRlcm4uY29tcGlsZShmaWx0ZXJUZXh0KTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBtYXN0ZXJDb21wb25lbnRMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGl0ZW1TdHJpbmcgPSBsYWJlbFByb3ZpZGVyLmdldFRleHQoaXRlbSk7ICAgICAgICAgICAKLSAgICAgICAgICAgIE1hdGNoZXIgbSA9IHJlZ2V4Lm1hdGNoZXIoaXRlbVN0cmluZy50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgIGlmIChpdGVtU3RyaW5nLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChmaWx0ZXJUZXh0KSB8fCBtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQuYWRkKGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIGRlY29yYXRlVGFibGUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9va2luZyBhdCBlYWNoIGl0ZW0gaW4gdGhlIFRhYmxlLiBJZiB0aGVyZSBhcmUgb3RoZXIgaXRlbXMgd2l0aCBzYW1lIG5hbWUKLSAgICAgKiAsIHRoZW4gYWRkIGV4dHJhIGluZm8gKG5hbWVzcGFjZSwgZmlsZSkgaW50byB0aGUgdGhlIHRleHQgbGFiZWwgb2YgYWxsIHRoZXNlCi0gICAgICogZHVwbGljYXRlZCBpdGVtcy4KLSAgICAgKiAtIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBldmVyeXRpbWUgdGhlIFRhYmxlIHZpZXdlciBpcyByZWZyZXNoZWQuLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlY29yYXRlVGFibGUoKXsKLSAgICAJVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wuY2xlYXIoKTsKLSAgICAJCi0gICAgCUlDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGxwID0gY29uZmlndXJhdGlvbi5nZXREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0KLSAgICAJLy8gaW5pdCB0aGUgbmFtZS1kdXBsaWNhdGVzIGNvdW50ZXIKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LnNpemUoKTsgaSsrKXsKLSAgICAJCU9iamVjdCBjdXJyZW50SXRlbSA9IGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQuZ2V0KGkpOwotICAgIAkJU3RyaW5nIG5hbWUgPSBscC5nZXROYW1lKGN1cnJlbnRJdGVtKTsKLSAgICAJCUludGVnZXIgY291bnQgPSAoSW50ZWdlcikgVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wuZ2V0KG5hbWUpOwotCQkJaWYgKCBjb3VudCA9PSBudWxsKXsKLSAgICAJCQlUYWJsZURlY29yYXRvclRyYWNraW5nVG9vbC5wdXQobmFtZSwgbmV3IEludGVnZXIoMSkpOwotICAgIAkJfQotICAgIAkJZWxzZXsKLSAgICAJCQlUYWJsZURlY29yYXRvclRyYWNraW5nVG9vbC5wdXQoCi0gICAgCQkJCQluYW1lLCBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSkpOwotICAgIAkJfQotICAgIAl9Ci0KLSAgICAJLy8gTW9kaWZ5L2RlY29yYXRlIHRob3NlIGl0ZW1zIGluIHRoZSBUYWJsZSB0aGF0IGhhdmUgZHVwbGljYXRlZCBuYW1lCi0gICAgCVRhYmxlSXRlbVtdIGl0ZW1zID0gY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgIAlmb3IgKGludCBpID0wIDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKXsKLSAgICAJCU9iamVjdCBjdXJyZW50SXRlbSA9IGl0ZW1zW2ldLmdldERhdGEoKTsKLSAgICAJCUludGVnZXIgY291bnQgPSAoSW50ZWdlcikgVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wuZ2V0KGxwLmdldE5hbWUoY3VycmVudEl0ZW0pKTsKLSAgICAJCWlmICggY291bnQgIT0gbnVsbCAmJiBjb3VudC5pbnRWYWx1ZSgpID4gMSl7CQotICAgIAkJCWl0ZW1zW2ldLnNldFRleHQobHAuZ2V0TmFtZShjdXJyZW50SXRlbSkgKyAiIC0gIiArIAotICAgIAkJCQkJbHAuZ2V0UXVhbGlmaWVyKGN1cnJlbnRJdGVtKSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0KLSAgICAKLSAgICAvKgotICAgICAqIElmIHRoZXJlIGlzIGEgc2VsZWN0aW9uIGluIHRoZSBDb21wb25lbnRUcmVlVmlld2VyLCBlbmFibGUgT0sKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYW5GaW5pc2goKSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBjb21wb25lbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBjbGFzcyBDb21wb25lbnRUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChMaXN0KSBwYXJlbnRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChjb21wb25lbnRTZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpOwotICAgICAgICBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBjb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5zZXROYW1lKGNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0TmFtZShjb21wb25lbnRTZWxlY3Rpb24pKTsKLSAgICAgICAgcmVzdWx0LnNldFF1YWxpZmllcihjb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmdldFF1YWxpZmllcihjb21wb25lbnRTZWxlY3Rpb24pKTsKLSAgICAgICAgcmVzdWx0LnNldEZpbGUoY29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5nZXRGaWxlKGNvbXBvbmVudFNlbGVjdGlvbikpOwotICAgICAgICByZXN1bHQuc2V0T2JqZWN0KGNvbXBvbmVudFNlbGVjdGlvbik7Ci0gICAgICB9ICAKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgICAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3MTEwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nIGZpbHRlckxhYmVsVGV4dCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DT01QT05FTlRfTkFNRTsKLSAgcHJpdmF0ZSBTdHJpbmcgbGlzdExhYmVsVGV4dCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DT01QT05FTlRTOwotICBwcml2YXRlIElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIgc2VhcmNoTGlzdFByb3ZpZGVyOyAKLSAgcHJpdmF0ZSBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBkZXNjcmlwdGlvblByb3ZpZGVyOwotICBwcml2YXRlIElOZXdDb21wb25lbnRIYW5kbGVyIG5ld0NvbXBvbmVudEhhbmRsZXI7Ci0gIHByaXZhdGUgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2c7Ci0KLSAgcHVibGljIHZvaWQgaW5pdChDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGRpYWxvZykKLSAgewotICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlV2lkZ2V0QXRUb3AoQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAgICAKLSAgfSAgICAKLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVdpZGdldEFib3ZlUXVhbGlmaWVyQm94KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVdpZGdldEJlbG93UXVhbGlmaWVyQm94KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVRvb2xCYXJJdGVtcyhUb29sQmFyIHRvb2xCYXIpCi0gIHsgICAgCi0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRpb25Qcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uUHJvdmlkZXIoSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMuZGVzY3JpcHRpb25Qcm92aWRlciA9IGRlc2NyaXB0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlciBnZXRTZWFyY2hMaXN0UHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlYXJjaExpc3RQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlYXJjaExpc3RQcm92aWRlcihJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlcikKLSAgewotICAgIHRoaXMuc2VhcmNoTGlzdFByb3ZpZGVyID0gc2VhcmNoTGlzdFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZ2V0RGlhbG9nKCkKLSAgewotICAgIHJldHVybiBkaWFsb2c7Ci0gIH0KLQotICBwdWJsaWMgSU5ld0NvbXBvbmVudEhhbmRsZXIgZ2V0TmV3Q29tcG9uZW50SGFuZGxlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3Q29tcG9uZW50SGFuZGxlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5ld0NvbXBvbmVudEhhbmRsZXIoSU5ld0NvbXBvbmVudEhhbmRsZXIgbmV3Q29tcG9uZW50SGFuZGxlcikKLSAgewotICAgIHRoaXMubmV3Q29tcG9uZW50SGFuZGxlciA9IG5ld0NvbXBvbmVudEhhbmRsZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTGFiZWxUZXh0KCkKLSAgewotICAgIHJldHVybiBmaWx0ZXJMYWJlbFRleHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGlzdExhYmVsVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gbGlzdExhYmVsVGV4dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpbHRlckxhYmVsVGV4dChTdHJpbmcgZmlsdGVyTGFiZWxUZXh0KQotICB7Ci0gICAgdGhpcy5maWx0ZXJMYWJlbFRleHQgPSBmaWx0ZXJMYWJlbFRleHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMaXN0TGFiZWxUZXh0KFN0cmluZyBsaXN0TGFiZWxUZXh0KQotICB7Ci0gICAgdGhpcy5saXN0TGFiZWxUZXh0ID0gbGlzdExhYmVsVGV4dDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U3BlY2lmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2NhYmQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U3BlY2lmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLS8vIFRPRE8uLiB1c2UgUXVhbGlmaWVkTmFtZSBjb25zaXN0ZW50bHkgZm9yIG5hbWUgYW5kIG1ldGFOYW1lCi0vLwotcHVibGljIGNsYXNzIENvbXBvbmVudFNwZWNpZmljYXRpb24KLXsKLSAgU3RyaW5nIHF1YWxpZmllcjsKLSAgU3RyaW5nIG5hbWU7Ci0gIElGaWxlIGZpbGU7Ci0gIE9iamVjdCBvYmplY3Q7Ci0gIGJvb2xlYW4gaXNOZXc7Ci0gIFF1YWxpZmllZE5hbWUgbWV0YU5hbWU7Ci0gIAotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpCi0gIHsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lLCBJRmlsZSBmaWxlKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLnF1YWxpZmllciA9IHF1YWxpZmllcjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoSUZpbGUgZmlsZSkKLSAgewotICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkKLSAgewotICAgIHJldHVybiBxdWFsaWZpZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoU3RyaW5nIHF1YWxpZmllcikKLSAgewotICAgIHRoaXMucXVhbGlmaWVyID0gcXVhbGlmaWVyOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc05ldygpCi0gIHsKLSAgICByZXR1cm4gaXNOZXc7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBpc05ldykKLSAgewotICAgIHRoaXMuaXNOZXcgPSBpc05ldzsKLSAgfQotCi0gIHB1YmxpYyBRdWFsaWZpZWROYW1lIGdldE1ldGFOYW1lKCkKLSAgewotICAgIHJldHVybiBtZXRhTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1ldGFOYW1lKFF1YWxpZmllZE5hbWUgbWV0YU5hbWUpCi0gIHsKLSAgICB0aGlzLm1ldGFOYW1lID0gbWV0YU5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4OWZmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcgotewotICBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3QgY29tcG9uZW50KTsKLSAgCi0gIFN0cmluZyBnZXRRdWFsaWZpZXIoT2JqZWN0IGNvbXBvbmVudCk7Ci0KLSAgU3RyaW5nIGdldE5hbWUoT2JqZWN0IGNvbXBvbmVudCk7Ci0KLSAgSUZpbGUgZ2V0RmlsZShPYmplY3QgY29tcG9uZW50KTsKLSAgCi0gIEltYWdlIGdldEZpbGVJY29uKE9iamVjdCBjb21wb25lbnQpOwotCi0gIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudExpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhMjQ4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudExpc3QgewotICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKTsKLSAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhNzlhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyCi17Ci0gIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0KElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSU5ld0NvbXBvbmVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSU5ld0NvbXBvbmVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1MDkzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lOZXdDb21wb25lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5ld0NvbXBvbmVudEhhbmRsZXIKLXsKLSAgdm9pZCBvcGVuTmV3Q29tcG9uZW50RGlhbG9nKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Njb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY3ZDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlByb2plY3RTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuV29ya2luZ1NldFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuV29ya3NwYWNlU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFNjb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZXh0ZW5kcyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTkFNRV9GSUVMRF9USVRMRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DT01QT05FTlRfTkFNRTsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9MSVNUX1RJVExFID0gTWVzc2FnZXMuX1VJX0xBQkVMX01BVENISU5HX0NPTVBPTkVOVFM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX1NQRUNJRklFRF9GSUxFID0gTWVzc2FnZXMuX1VJX0xBQkVMX1NQRUNJRklFRF9GSUxFOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9FTkNMT1NJTkdfUFJPSkVDVCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9FTkNMT1NJTkdfUFJPSkVDVDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfV09SS1NQQUNFID0gTWVzc2FnZXMuX1VJX0xBQkVMX1dPUktTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfQ1VSUkVOVF9SRVNPVVJDRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DVVJSRU5UX1JFU09VUkNFOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9XT1JLSU5HX1NFVFMgPSBNZXNzYWdlcy5fVUlfTEFCRUxfV09SS0lOR19TRVRTOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFNlYXJjaFNjb3BlID0gU0NPUEVfQ1VSUkVOVF9SRVNPVVJDRTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBjaG9vc2VCdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b25bXSByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b25bNF07Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsdGVyTGFiZWw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbGlzdFRpdGxlOwotICBwcm90ZWN0ZWQgSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZTsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBzZWxlY3RXb3JraW5nU2V0c0dyb3VwOwotICBwcm90ZWN0ZWQgVGV4dCB3b3JraW5nU2V0c1RleHQ7Ci0gIAotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dDsKLSAgCi0gIC8vIHdvcmtpbmcgc2V0cyBjdXJyZW50bHkgY2hvc2VuIGJ5IHRoZSB1c2VyCi0gIHByaXZhdGUgc3RhdGljIElXb3JraW5nU2V0W10gd29ya2luZ1NldHM7Ci0KLSAgcHVibGljIFNjb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLSAgewotICAgIHN1cGVyKHNoZWxsLCBkaWFsb2dUaXRsZSwgY29uZmlndXJhdGlvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEZpbHRlckxhYmVsKFN0cmluZyBmaWx0ZXJMYWJlbCkKLSAgewotICAgIHRoaXMuZmlsdGVyTGFiZWwgPSBmaWx0ZXJMYWJlbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TGlzdFRpdGxlKFN0cmluZyBsaXN0VGl0bGUpCi0gIHsKLSAgICB0aGlzLmxpc3RUaXRsZSA9IGxpc3RUaXRsZTsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy9zdXBlci5zZXRGaWx0ZXJMYWJlbChmaWx0ZXJMYWJlbCAhPSBudWxsID8gZmlsdGVyTGFiZWwgOiBERUZBVUxUX05BTUVfRklFTERfVElUTEUpOwotICAgIC8vc2V0TGlzdExhYmVsVGV4dChsaXN0VGl0bGUgIT0gbnVsbCA/IGxpc3RUaXRsZSA6IERFRkFVTFRfTElTVF9USVRMRSk7Ci0gICAgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIC8vIFdlIHVzZSB0aGUgQ29tcG9zaXRlIHRvcENvbXBvc2l0ZSB0byBjcmVhdGUgYWRkaXRpb25hbCB3aWRnZXRzCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgYm90dG9tQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGJvdHRvbUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAvLyBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAvLyBncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAyOwotICAgIGdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBncm91cC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9TRUFSQ0hfU0NPUEUpOwotICAgIFNjb3BlQ2hhbmdlTGlzdGVuZXIgc2NvcGVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBTY29wZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgcmFkaW9CdXR0b25bMF0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgIHJhZGlvQnV0dG9uWzBdLnNldFRleHQoU0NPUEVfV09SS1NQQUNFKTsKLSAgICByYWRpb0J1dHRvblsxXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgcmFkaW9CdXR0b25bMV0uc2V0VGV4dChTQ09QRV9FTkNMT1NJTkdfUFJPSkVDVCk7Ci0gICAgcmFkaW9CdXR0b25bMl0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgIHJhZGlvQnV0dG9uWzJdLnNldFRleHQoU0NPUEVfQ1VSUkVOVF9SRVNPVVJDRSk7Ci0gICAgcmFkaW9CdXR0b25bM10gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgIHJhZGlvQnV0dG9uWzNdLnNldFRleHQoU0NPUEVfV09SS0lOR19TRVRTKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvQnV0dG9uLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChyYWRpb0J1dHRvbltpXS5nZXRUZXh0KCkuZXF1YWxzKGN1cnJlbnRTZWFyY2hTY29wZSkpCi0gICAgICB7Ci0gICAgICAgIHJhZGlvQnV0dG9uW2ldLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgIH0KLSAgICAgIHJhZGlvQnV0dG9uW2ldLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNjb3BlQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLSAgICAKLSAgICBzZWxlY3RXb3JraW5nU2V0c0dyb3VwID0gbmV3IENvbXBvc2l0ZShncm91cCwgU1dULk5PTkUpOwotCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIHNlbGVjdFdvcmtpbmdTZXRzR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgR3JpZExheW91dCB3b3JraW5nU2V0R3JvdXBMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgd29ya2luZ1NldEdyb3VwTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICB3b3JraW5nU2V0R3JvdXBMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBzZWxlY3RXb3JraW5nU2V0c0dyb3VwLnNldExheW91dCh3b3JraW5nU2V0R3JvdXBMYXlvdXQpOwotICAgIAotICAgIHdvcmtpbmdTZXRzVGV4dCA9IG5ldyBUZXh0KHNlbGVjdFdvcmtpbmdTZXRzR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICB3b3JraW5nU2V0c1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgaWYgKHZhbHVlRm9yV29ya2luZ1NldHNUZXh0ICE9IG51bGwgKQotICAgIAl3b3JraW5nU2V0c1RleHQuc2V0VGV4dCh2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dCk7Ci0gICAgCi0gICAgY2hvb3NlQnV0dG9uID0gbmV3IEJ1dHRvbihzZWxlY3RXb3JraW5nU2V0c0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgY2hvb3NlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0NIT09TRSk7Ci0gICAgY2hvb3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCQlJV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkuY3JlYXRlV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgdHJ1ZSk7Ci0JCQlpZiAoIGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKXsKLQkJCQl3b3JraW5nU2V0cyA9IGRpYWxvZy5nZXRTZWxlY3Rpb24oKTsKLQkJCQl2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dCA9ICIiOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd29ya2luZ1NldHMubGVuZ3RoOyBpKyspewotCQkJCQl2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dCArPSB3b3JraW5nU2V0c1tpXS5nZXRMYWJlbCgpOwotCQkJCQkvLyBpZiBub3QgdGhlIGxhc3QgaXRlbSwgd2UgYWRkIGEgY29tbWEKLQkJCQkJaWYgKCBpICE9IHdvcmtpbmdTZXRzLmxlbmd0aCAtIDEpIAotCQkJCQkJdmFsdWVGb3JXb3JraW5nU2V0c1RleHQgKz0gIiwgIjsKLQkJCQl9Ci0JCQkJd29ya2luZ1NldHNUZXh0LnNldFRleHQodmFsdWVGb3JXb3JraW5nU2V0c1RleHQpOwotCQkJfQotCQkJLy8gU2V0IHdvcmtpbmcgc2V0cyByYWRpbyBidXR0b24gZW5hYmxlZCwgZGlzYWJsZSBvdGhlciBidXR0b25zCi0JCQlyYWRpb0J1dHRvblsyXS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJcmFkaW9CdXR0b25bMV0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXJhZGlvQnV0dG9uWzBdLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlyYWRpb0J1dHRvblszXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLQkJCXNjb3BlQ2hhbmdlSGFuZGxlcihyYWRpb0J1dHRvblszXSk7Ci0JCX0KLSAgICB9KTsKLQotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0gLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBzZWFyY2ggc2NvcGUuCi0gICAgICovCi0KLSAgcHVibGljIFN0cmluZyBnZXRTZWFyY2hTY29wZSgpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudFNlYXJjaFNjb3BlOwotICB9Ci0KLXByaXZhdGUgdm9pZCBzY29wZUNoYW5nZUhhbmRsZXIoQnV0dG9uIGIpIHsJICAKLQkgIGlmICgoYi5nZXRTdHlsZSgpICYgU1dULlJBRElPKSAhPSAwKQotCSAgewotCQkgIGN1cnJlbnRTZWFyY2hTY29wZSA9IGIuZ2V0VGV4dCgpOwotCQkgIAotCQkgIC8vIFRPRE8gKGNzKSBuZWVkIHRvIGRvIHNvbWUgd29yayB0byBtYWtlIHRoZSBkZWZhdWx0IHNlYXJjaCBzY29wZQotCQkgIC8vIG1vcmUgd2VsbCBkZWZpbmVkLCBjdXJyZW50bHkgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIHBhc3MgYSBudWxsCi0JCSAgLy8gYXJndW1lbnQgaW4gdG8gcG9wdWxhdGVNYXN0ZXJDb21wb25lbnRMaXN0IGJ1dCB3ZSBzaG91bGQgcHJvdmlkZQotCQkgIC8vIGdldHRlcnMvc2V0dGVycyB0byBhbGxvdyB0aGUgZGVmYXVsdCB0byBiZSBjb250cm9sbGVkICAgICAgICAgIAotCQkgIFNlYXJjaFNjb3BlIHNjb3BlID0gbnVsbDsKLQkJICBpZiAoY3VycmVudFNlYXJjaFNjb3BlID09IFNDT1BFX0VOQ0xPU0lOR19QUk9KRUNUICYmCi0JCQkJICBjdXJyZW50UmVzb3VyY2UgIT0gbnVsbCkgeyAKLQkJCSAgc2NvcGUgPSBuZXcgUHJvamVjdFNlYXJjaFNjb3BlKGN1cnJlbnRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJICB9IAotCQkgIGVsc2UgaWYgKGN1cnJlbnRTZWFyY2hTY29wZSA9PSBTQ09QRV9XT1JLU1BBQ0UpewotCQkJICBzY29wZSA9IG5ldyBXb3Jrc3BhY2VTZWFyY2hTY29wZSgpOwotCQkgIH0KLQkJICBlbHNlIGlmIChjdXJyZW50U2VhcmNoU2NvcGUgPT0gU0NPUEVfV09SS0lOR19TRVRTKXsKLQkJCSAgCi0JCQkgIC8vIENvbnN0cnVjdHMgdGhlIHdvcmtpbmcgc2V0cyBzY29wZSBmcm9tIHRoZSB3b3JraW5nIHNldHMgdGhlIHVzZXIKLQkJCSAgLy8gc2VsZWN0ZWQKLQkJCSAgV29ya2luZ1NldFNlYXJjaFNjb3BlIHdvcmtpbmdTZXRzU2NvcGUgPSBuZXcgV29ya2luZ1NldFNlYXJjaFNjb3BlKCk7Ci0JCQkgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ya2luZ1NldHMubGVuZ3RoOyBpKyspewotCQkJCSAgd29ya2luZ1NldHNTY29wZS5hZGRBV29ya2luZ1NldFRvU2NvcGUod29ya2luZ1NldHNbaV0uZ2V0RWxlbWVudHMoKSk7Ci0JCQkgIH0JCQkgIAotCQkJICBzY29wZSA9IHdvcmtpbmdTZXRzU2NvcGU7Ci0JCSAgfQotCQkgIAotCQkgIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdChzY29wZSk7Ci0JCSAgcmVmcmVzaFRhYmxlVmlld2VyKGdldFByb2Nlc3NlZEZpbHRlclN0cmluZygpKTsKLQkJICAvLyBTZWxlY3QgdGhlIGZpcnN0IG1hdGNoaW5nIGNvbXBvbmVudC4gVGhvdWdoIHdlIHNob3VsZCBiZQotCQkgIC8vIHNtYXJ0ZXIgaGVyZQotCQkgIC8vIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgd2FzIGEgc2VsZWN0aW9uIGJlZm9yZSB0aGUgc2NvcGUKLQkJICAvLyBzd2l0Y2ggKGFuZCBpZgotCQkgIC8vIHRoZSBjb21wb25lbnQgaXMgc3RpbGwgYXZhaWxhYmxlLgotCQkgIFRhYmxlIHRhYmxlID0gY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJICBUYWJsZUl0ZW0gaXRlbXNbXSA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCSAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApCi0JCSAgewotCQkJICBUYWJsZUl0ZW0gc2VsZWN0W10gPSBuZXcgVGFibGVJdGVtWzFdOwotCQkJICBzZWxlY3RbMF0gPSBpdGVtc1swXTsKLQkJCSAgdGFibGUuc2V0U2VsZWN0aW9uKHNlbGVjdCk7Ci0JCSAgfQotCQkgIHVwZGF0ZUNhbkZpbmlzaCgpOwotCSAgfQotICB9Ci0KLXByaXZhdGUgY2xhc3MgU2NvcGVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgQnV0dG9uKSAgICAgICAKLSAgICAgIHsgICAgICAgIAotICAgICAgICBCdXR0b24gYiA9IChCdXR0b24pIGUud2lkZ2V0OwotICAgICAgICBpZiAoYi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgc2NvcGVDaGFuZ2VIYW5kbGVyKGIpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSVJlc291cmNlIGdldEN1cnJlbnRSZXNvdXJjZSgpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudFJlc291cmNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q3VycmVudFJlc291cmNlKElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UpCi0gIHsKLSAgICB0aGlzLmN1cnJlbnRSZXNvdXJjZSA9IGN1cnJlbnRSZXNvdXJjZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvVGVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ODgzYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi1wdWJsaWMgY2xhc3MgVGVzdCBleHRlbmRzIEFjdGlvbkRlbGVnYXRlCi17Ci0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0TGlzdExhYmVsVGV4dCgiTGlzdDoiKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmlsdGVyTGFiZWxUZXh0KCJGaWx0ZXI6Iik7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldFNlYXJjaExpc3RQcm92aWRlcihzZWFyY2hMaXN0UHJvdmlkZXIpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXREZXNjcmlwdGlvblByb3ZpZGVyKG5ldyBCYXNlQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigiZm9vIikpOwotICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2cgPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyhzaGVsbCwgInRlc3QiLCBjb25maWd1cmF0aW9uKTsKLSAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotICBjbGFzcyBCYXNlQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcgotICB7Ci0gICAgU3RyaW5nIHByZWZpeDsKLQotICAgIEJhc2VDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKFN0cmluZyBwcmVmaXgpCi0gICAgewotICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIElGaWxlIGdldEZpbGUoT2JqZWN0IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIGNvbXBvbmVudDsKLSAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSArIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVyKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuIGdldE5hbWUoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBjb21wb25lbnQpLnN0YXJ0c1dpdGgocHJlZml4KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0RmlsZUljb24oT2JqZWN0IGNvbXBvbmVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0gIH0KLSAgCi0gIElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIgc2VhcmNoTGlzdFByb3ZpZGVyID0gbmV3IElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIoKQotICB7Ci0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0KElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKCJmb286IiArICJIZWxsbyEiKTsKLSAgICAgIGxpc3QuYWRkKCJmb286IiArICJIZXkhIik7Ci0gICAgICBsaXN0LmFkZCgiZm9vOiIgKyAiSG93LWFyZS15b3U/Iik7Ci0gICAgICBsaXN0LmFkZCgiZm9vOiIgKyAiV2hhdC1pcy10aGF0LXNtZWxsPyIpOwotICAgIH0KLSAgfTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTNiYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0vLwkgU2VsZWN0U2luZ2xlRmlsZVBhZ2UgYW5kIFNlbGVjdE11bHRpRmlsZVBhZ2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU09VUkNFX0ZJTEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QT1BVUF9FWFBBTkRfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QT1BVUF9DT0xMQVBTRV9BTEw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lNUE9SVF9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lNUE9SVF9CVVRUT05fVE9PTF9USVA7Ci0JCi0vLwkgU2VsZWN0TXVsdGlGaWxlUGFnZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BRERfQlVUVE9OX1RPT0xfVElQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRU1PVkVfQlVUVE9OX1RPT0xfVElQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRU1PVkVfQUxMX0JVVFRPTl9UT09MX1RJUDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BRERfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRU1PVkVfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRU1PVkVfQUxMX0JVVFRPTjsKLQotLy8JIFNlbGVjdEphdmFQcm9qZWN0VmlldwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DSE9PU0VfRk9MREVSOwotCi0vLwkgU2VsZWN0SmF2YVByb2plY3REaWFsb2cKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRk9MREVSX1NFTEVDVElPTjsKLQotLy8JIFRleHRWaWV3ZXJPcGVyYXRpb25BY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9DT1BZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0NVVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUEFTVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1JFRE87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfU0VMRUNUX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9TSElGVF9MRUZUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1NISUZUX1JJR0hUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1NUUklQX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9VTkRPOwotCi0vLwkgU291cmNlVmlld2VyR290b0xpbmVBY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9HT1RPX0xJTkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dPVE9fTElORV9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dPVE9fTElORV9ESUFMT0dfVEVYVDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFX0NIQU5HRURfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVfREVMRVRFRF9TQVZFX0NIQU5HRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVfREVMRVRFRF9FRElUT1JfQ0xPU0VEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFX0NIQU5HRURfTE9BRF9DSEFOR0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TQVZFX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0xPU0VfQlVUVE9OOwotCi0KLS8vCSBYU0wgUHJlZmVyZXJlbmNlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTFRfU0VMRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xUX1NUWUxFU0hFRVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTFRfVFJBTlNGT1JNOwotCi0vLwkgWFNMIERlYnVnIFByZWZlcmVyZW5jZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfREVCVUdfU0VMRUNUX0xBVU5DSEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfREVCVUdfTE9DQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9ERUJVR19SRU1PVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9USUxFX0VESVRPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX0RFQlVHX0FORF9UUkFOU0ZPUk07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9DT05URVhUX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX0NPTlRFWFQ7Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PVkVSUklERV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9KQVZBX0VYSVNUX0ZJTEUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9KQVZBX0VYSVNUX0ZJTEUyOwotCSAgICAgIAotLy8JIHNvbWUgb3B0aW9ucyBzdHJpbmdzIGNvbW1vbiB0byBzZXZlcmFsIHBsdWdpbnMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9TSE9SVF9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9DUkVBVElOR19GSUxFX0xPTkdfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUEFSRU5UX0ZPTERFUl9JU19SRUFEX09OTFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1VOS05PV05fRVJST1JfV0lUSF9ISU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9VTktOT1dOX0VSUk9SOwotCi0vLwkgdXNhZ2UgLSB0aGlzIGxhYmVsIGlzIGZvbGxvd2VkIGJ5IHR3byByYWRpbyBidXR0b24gb3B0aW9ucyBmb3IgdGhlIGZpbGUgbG9jYXRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfSU5DTFVERV9VUkxfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fVVJMOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTVBPTkVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1FVQUxJRklFUjsKLQotLy8JLSBjb21wb25lbnQgc2VsZWN0aW9uIGRpYWxvZ3MgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTVBPTkVOVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NQVRDSElOR19DT01QT05FTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TUEVDSUZJRURfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5DTE9TSU5HX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1dPUktTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VBUkNIX1NDT1BFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQVJST1dfU0VBUkNIX1NDT1BFX1JFU09VUkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVkFJTEFCTEVfVFlQRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1dPUktJTkdfU0VUUzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OZXc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RFQ0xBUkFUSU9OX0xPQ0FUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DSE9PU0U7Ci0KLQotCi0KLQotCi0JLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCSEKLQkhIEhlcmUgaXMgdGhlIGxpc3Qgb2YgRXJyb3Igc3RyaW5nIHRoYXQgaGF2ZSBtZXNzYWdlIElEcyAtIG1ha2Ugc3VyZSB0aGV5IGFyZSB1bmlxdWUKLQkhICBSYW5nZSBmb3IgYjJiZ3VpIG1lc3NhZ2VJRHM6IElXQVgxMjAxIC0gSVdBWDE0MDAKLQkhCi0JIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfVEhFX0NPTlRBSU5FUl9OQU1FOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0xPQ0FMX0xPQ0FUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9OT1RfSkFWQV9QUk9KRUNUOwotCi0vLwkgTk9URSBUTyBUUkFOU0xBVE9SOiB0aGlzIGVycm9yIG1lc3NhZ2UgdGV4dCBpcyBmb2xsb3dlZCBieSBhIG1lc3NhZ2UgZnJvbSBhbm90aGVyIHBsdWdpbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0pBVkFfUEFDS0FHRTsKLQotLy8JIE5PVEUgVE8gVFJBTlNMQVRPUjogKF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OICsgc3RyaW5nICsgX1VJX0xBQkVMX09SICsgc3RyaW5nKSBvciAoX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04pCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfQ09OVEFJTkVSX05PVF9KQVZBX0JVSUxEUEFUSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfVVNFX1BST0pFQ1RfSkFWQV9TT1VSQ0VfRk9MREVSOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1JPT1RfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfU0FWSU5HX0ZJTEU7Ci0KLS8vCSBGaWxlIFZhbGlkYXRvcgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9WQUxJREFURV9GQUlMX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9WQUxJREFURV9GQUlMX01FU1NBR0U7Ci0KLS8vCSBQcm9wZXJ0eURpcnR5Q2hhbmdlTGlzdGVuZXIgYW5kIFByb3BlcnR5UmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9WQUxJREFURV9FRElUX0ZBSUxfT05FX0ZJTEU7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQudGl0bGU7Ci0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm9wX2Vycm9yLnRpdGxlOwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci5tZXNzYWdlOwotLy8KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQub3ZlcndyaXRlcXVlcnkudGl0bGU7Ci0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm92ZXJ3cml0ZXF1ZXJ5Lm1lc3NhZ2U7Ci0vLwotLy8KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24ub3BfZGVzYzsKLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24ub3BfZGVzY19wcm9qOwotLy8KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmVycm9yLmFscmVhZHlleGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX3NhdmVfYWxsX3Jlc291cmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL1VJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmYzI3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGFSZXNvdXJjZUJ1bmRsZSA9IGdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChhUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPyBhUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgcmV0dXJuIGdldFJlc291cmNlU3RyaW5nKGtleSk7ICAgICAKLSAgICB9Ci0JLyoqCi0JICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKQotCXsKLQkgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgdHdvIHN1YnN0aXR1dGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSwgT2JqZWN0IHMyKQotCXsKLQkgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBuZXcgT2JqZWN0IFtdIHsgczEsIHMyIH0pOwotCX0gICAgIAotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUocGx1Z2luLmdldEJ1bmRsZSgpKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWxvZyh4KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJVVJMIHVybD0gbmV3IFVSTChnZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpLCBuYW1lKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQl9Ci0JCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uTmFtZSkKLSAgICB7Ci0gICAgICBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0gICAgICAKLSAgICAgIGlmIChpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShnZXRDbGFzcygpLCBpY29uTmFtZSkpOwotICAgICAgICByZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9CQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIElTdGF0dXMuRVJST1IsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXREZWZhdWx0KCkuaW50ZXJuYWxHZXRBY3RpdmVQYWdlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgaW50ZXJuYWxHZXRBY3RpdmVQYWdlKCkgewotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdz0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZGlhbG9ncy9TYXZlRGlydHlGaWxlc0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2F2ZURpcnR5RmlsZXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxODBmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZGlhbG9ncy9TYXZlRGlydHlGaWxlc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kaWFsb2dzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBBIGdlbmVyaWMgc2F2ZSBmaWxlcyBkaWFsb2cuIFRoZSBidWxrIG9mIHRoZSBjb2RlIGZvciB0aGlzIGRpYWxvZyB3YXMgdGFrZW4KLSAqIGZyb20gdGhlIEpEVCByZWZhY3RvcmluZyBzdXBwb3J0IGluCi0gKiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTYXZlSGVscGVyLiBUaGlzIGNsYXNzIGlzCi0gKiBhIGdvb2QgY2FuZGlkYXRlIGZvciByZXVzZSBhbW91bmcgY29tcG9uZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFNhdmVEaXJ0eUZpbGVzRGlhbG9nIGV4dGVuZHMgTGlzdERpYWxvZwotewotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZURpcnR5RmlsZXMoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIC8vIFRPRE8gKGNzKSBhZGQgc3VwcG9ydCBmb3Igc2F2ZSBhdXRvbWF0aWNhbGx5Ci0gICAgU2hlbGwgc2hlbGwgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gICAgSUVkaXRvclBhcnRbXSBkaXJ0eUVkaXRvcnMgPSBnZXREaXJ0eUVkaXRvcnMoKTsKLSAgICBpZiAoZGlydHlFZGl0b3JzLmxlbmd0aCA+IDApCi0gICAgeyAgCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIFNhdmVEaXJ0eUZpbGVzRGlhbG9nIHNhdmVEaXJ0eUZpbGVzRGlhbG9nID0gbmV3IFNhdmVEaXJ0eUZpbGVzRGlhbG9nKHNoZWxsKTsKLSAgICAgIHNhdmVEaXJ0eUZpbGVzRGlhbG9nLnNldElucHV0KEFycmF5cy5hc0xpc3QoZGlydHlFZGl0b3JzKSk7Ci0gICAgICAvLyBTYXZlIGFsbCBvcGVuIGVkaXRvcnMuCi0gICAgICBpZiAoc2F2ZURpcnR5RmlsZXNEaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsgICAgICAgIAotICAgICAgICBpbnQgbnVtRGlydHlFZGl0b3JzID0gZGlydHlFZGl0b3JzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1EaXJ0eUVkaXRvcnM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGRpcnR5RWRpdG9yc1tpXS5kb1NhdmUobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OyAgICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIElFZGl0b3JQYXJ0W10gZ2V0RGlydHlFZGl0b3JzKCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgwKTsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gd2luZG93c1tpXS5nZXRQYWdlcygpOwotICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBwYWdlcy5sZW5ndGg7IHgrKykKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnRbXSBlZGl0b3JzID0gcGFnZXNbeF0uZ2V0RGlydHlFZGl0b3JzKCk7Ci0gICAgICAgIGZvciAoaW50IHogPSAwOyB6IDwgZWRpdG9ycy5sZW5ndGg7IHorKykKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVwID0gZWRpdG9yc1t6XTsKLSAgICAgICAgICByZXN1bHQuYWRkKGVwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKElFZGl0b3JQYXJ0W10pIHJlc3VsdC50b0FycmF5KG5ldyBJRWRpdG9yUGFydFtyZXN1bHQuc2l6ZSgpXSk7Ci0gIH0KLQotICBwdWJsaWMgU2F2ZURpcnR5RmlsZXNEaWFsb2coU2hlbGwgcGFyZW50KQotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLSAgICBzZXRUaXRsZShNZXNzYWdlcy5TYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzKTsKLSAgICBzZXRBZGRDYW5jZWxCdXR0b24odHJ1ZSk7Ci0gICAgc2V0TGFiZWxQcm92aWRlcihjcmVhdGVEaWFsb2dMYWJlbFByb3ZpZGVyKCkpOwotICAgIHNldE1lc3NhZ2UoTWVzc2FnZXMuU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZSk7Ci0gICAgc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgY29udGFpbmVyKQotICB7Ci0gICAgQ29tcG9zaXRlIHJlc3VsdCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoY29udGFpbmVyKTsKLSAgICAvLyBUT0RPLi4uIHByb3ZpZGUgcHJlZmVyZW5jZSB0aGF0IHN1cHBvcnRzICdhbHdheXMgc2F2ZScKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgCi0gIHByaXZhdGUgSUxhYmVsUHJvdmlkZXIgY3JlYXRlRGlhbG9nTGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlSW1hZ2UoKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gKChJRWRpdG9yUGFydCkgZWxlbWVudCkuZ2V0VGl0bGUoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0gIAotICAvKiogCi0gICAqIEEgc3BlY2lhbGl6ZWQgY29udGVudCBwcm92aWRlciB0byBzaG93IGEgbGlzdCBvZiBlZGl0b3IgcGFydHMuCi0gICAqIFRoaXMgY2xhc3MgaGFzIGJlZW4gY29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0Lkxpc3RDb250ZW50UHJvdmlkZXIKLSAgICogVGhpcyBjbGFzcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIGEgZ2VuZXJpYyBzb2x1dGlvbiBpcyBtYWRlIGF2YWlsYWJsZS4KLSAgICovICAgCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIExpc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgTGlzdCBmQ29udGVudHM7Ci0KLSAgICBwdWJsaWMgTGlzdENvbnRlbnRQcm92aWRlcigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpCi0gICAgewotICAgICAgaWYgKGZDb250ZW50cyAhPSBudWxsICYmIGZDb250ZW50cyA9PSBpbnB1dCkKLSAgICAgICAgcmV0dXJuIGZDb250ZW50cy50b0FycmF5KCk7Ci0gICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgICAgaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgZkNvbnRlbnRzID0gKExpc3QpIG5ld0lucHV0OwotICAgICAgZWxzZQotICAgICAgICBmQ29udGVudHMgPSBudWxsOwotICAgICAgLy8gd2UgdXNlIGEgZml4ZWQgc2V0LgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG8pCi0gICAgewotICAgICAgcmV0dXJuIGZDb250ZW50cyAhPSBudWxsICYmICFmQ29udGVudHMuY29udGFpbnMobyk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RTaW5nbGVGaWxlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RTaW5nbGVGaWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTAzZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0U2luZ2xlRmlsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkRldmljZVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyB7Ci0JcHJvdGVjdGVkIFNlbGVjdFNpbmdsZUZpbGVWaWV3IHNlbGVjdFNpbmdsZUZpbGVWaWV3OwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIEltYWdlIGltYWdlOwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcjsKLQotCXB1YmxpYyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQl9Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3ID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVWaWV3KHNlbGVjdGlvbiwgaXNGaWxlTWFuZGF0b3J5KSB7Ci0JCQlwdWJsaWMgdm9pZCBjcmVhdGVGaWx0ZXJDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCQlTZWxlY3RTaW5nbGVGaWxlRGlhbG9nLnRoaXMuY3JlYXRlRmlsdGVyQ29udHJvbChjb21wb3NpdGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkvLyBUT0RPLi4gZW5hYmxlIGNvbnRleHQgaGVscAotCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nQXJlYSwKLQkJLy8gQjJCR1VJQ29udGV4dElkcy5CVEJHX1NFTEVDVF9TSU5HTEVfRklMRV9ESUFMT0cpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzUwOwotCQlnZC5oZWlnaHRIaW50ID0gMzUwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXRDb250cm9sQ29tcGxldGUoYm9vbGVhbiBpc0NvbXBsZXRlKSB7Ci0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZChpc0NvbXBsZXRlKTsKLQkJCX0KLQkJfTsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5jcmVhdGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0VmlzaWJsZUhlbHBlcih0cnVlKTsKLQkJaW1hZ2UgPSBnZXRTYXZlQXNJbWFnZSgpOwotCQlzZXRUaXRsZUltYWdlKGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGltYWdlIHdhcyBjb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS51aS5pZGUvaWNvbnMvZnVsbC93aXpiYW4vIHdoZXJlCi0JICogaXQgaXMgYSBub24tQVBJIGltYWdlLCBkZW5vdGVkIGJ5Ci0JICogSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0RMR0JBTl9TQVZFQVNfRExHLgotCSAqLwotCXByaXZhdGUgSW1hZ2UgZ2V0U2F2ZUFzSW1hZ2UoKSB7Ci0JCUltYWdlIGxvY2FsaW1hZ2UgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvc2F2ZWFzX3dpei5wbmciKTsKLQkJCX0KLQkJCWxvY2FsaW1hZ2UgPSAoSW1hZ2UpIGltYWdlRGVzY3JpcHRvci5jcmVhdGVSZXNvdXJjZShnZXRDb250ZW50cygpLmdldERpc3BsYXkoKSk7Ci0JCX0KLQkJY2F0Y2ggKERldmljZVJlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGltYWdlIG5vdCBmb3VuZAotCQkJbG9jYWxpbWFnZSA9IChJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKS5jcmVhdGVJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBsb2NhbGltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbWJvKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIHNlbGVjdFNpbmdsZUZpbGVWaWV3LmdldEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpIHsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMsIElGaWxlW10gZXhjbHVkZWRGaWxlcykgewotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMsIGV4Y2x1ZGVkRmlsZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiBpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2VEZXNjcmlwdG9yLmRlc3Ryb3lSZXNvdXJjZShpbWFnZSk7Ci0JCQlpbWFnZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYzMWU2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotCi0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIGltcGxlbWVudHMgRHJhZ0FuZERyb3BDb21tYW5kCi17Ci0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvd25lciB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIGRyYWcgYW5kIGRyb3AuCi0gICAqLwotICBwcm90ZWN0ZWQgT2JqZWN0IHRhcmdldDsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIGRyYWcgYW5kIGRyb3AuCi0gICAqLwotICBwcm90ZWN0ZWQgZmxvYXQgbG9jYXRpb247Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGxvd2VyIHJhbmdlIG9mIGxvY2F0aW9ucyBpbiB3aGljaCB0aGUgZWZmZWN0IG9mIHRoaXMgY29tbWFuZCByZW1haW5zIHVuY2hhbmdlZC4KLSAgICovCi0gIHByb3RlY3RlZCBmbG9hdCBsb3dlckxvY2F0aW9uQm91bmQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHVwcGVyIHJhbmdlIG9mIGxvY2F0aW9ucyBpbiB3aGljaCB0aGUgZWZmZWN0IG9mIHRoaXMgY29tbWFuZCByZW1haW5zIHVuY2hhbmdlZC4KLSAgICovCi0gIHByb3RlY3RlZCBmbG9hdCB1cHBlckxvY2F0aW9uQm91bmQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHBlcm1pdHRlZCBvcGVyYXRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBvcGVyYXRpb25zOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG9wZXJhdGlvbiB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRPcGVyYXRpb259LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBvcGVyYXRpb247Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGZlZWRiYWNrIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldEZlZWRiYWNrfS4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgZmVlZGJhY2s7Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGNvbGxlY3Rpb24gb2YgZHJhZ2dlZCBzb3VyY2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gc291cmNlczsKLQotICBwdWJsaWMgRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcykKLSAgewotICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB0aGlzLm9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOwotICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgIHRoaXMuc291cmNlcyA9IG5ldyBBcnJheUxpc3Qoc291cmNlcyk7Ci0gICAgaWYgKCFjYW5FeGVjdXRlKCkpIAotICAgIHsKLSAgICAgIHRoaXMub3BlcmF0aW9uID0gRE5ELkRST1BfTk9ORTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgaW50IGdldEZlZWRiYWNrKCkKLSAgewotICAgIGlmIChpc0FmdGVyKCkpCi0gICAgewotICAgICAgcmV0dXJuIERORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgcmV0dXJuIERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotICAgIH0KLSAgfSAgICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvbiA+IDAuNTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWluaXRpYWxpemUoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMpCi0gIHsKLSAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICB0aGlzLnNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KHNvdXJjZXMpOwotICAgIGlmICghY2FuRXhlY3V0ZSgpKSAKLSAgICB7Ci0gICAgICB0aGlzLm9wZXJhdGlvbiA9IERORC5EUk9QX05PTkU7Ci0gICAgfQotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZWI0MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBEcmFnQW5kRHJvcENvbW1hbmQKLXsKLSAgLy8gIHB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMpOwotCi0gIHB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKTsKLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCk7Ci0KLSAgcHVibGljIGludCBnZXRGZWVkYmFjaygpOwotICAKLSAgcHVibGljIGludCBnZXRPcGVyYXRpb24oKTsKLQotICBwdWJsaWMgdm9pZCByZWluaXRpYWxpemUoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EcmFnQW5kRHJvcE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxM2E1YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EcmFnQW5kRHJvcE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBEcmFnQW5kRHJvcE1hbmFnZXIKLXsKLSAgcHVibGljIERyYWdBbmREcm9wQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9PYmplY3RUcmFuc2Zlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9PYmplY3RUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODRlYWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvT2JqZWN0VHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkJ5dGVBcnJheVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotCi0KLS8qKgotICogVGhpcyBkZXJpdmVkIGltcGxlbWVudGF0aW9uIG9mIGEgYnl0ZSBhcnJheSB0cmFuc2ZlciBzaG9ydCBjaXJjdWl0cyB0aGUgdHJhbnNmZXIgcHJvY2VzcwotICogc28gdGhhdCBhIGxvY2FsIHRyYW5zZmVyIGRvZXMgbm90IHNlcmlhbGl6ZSB0aGUgb2JqZWN0Ci0gKiBhbmQgaGVuY2UgY2FuIGFuZCB3aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgb2JqZWN0LCBub3QganVzdCBhIGNsb25lLgotICogWW91IG9ubHkgcmVhbGx5IG5lZWQgZXZlciBrbm93IGFib3V0IHtAbGluayAjZ2V0SW5zdGFuY2UgT2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0sCi0gKiBzbyB0aGF0IHlvdSBjYW4gaW5jbHVkZSBpdCBpbiB3aGVuIGFkZGluZyBkcmFnIHN1cHBvcnQgdG8gYSB2aWV3ZXIuCi0gKiBTZWUge0BsaW5rIEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcn0gYW5kIHtAbGluayBWaWV3ZXJEcmFnQWRhcHRlcn0gZm9yIG1vcmUgZGV0YWlscy4KLSAqIDxwPgotICogQXMgYW4gYWRkZGVkIGd1YXJkLCB0aGUgdGltZSBpcyByZWNvcmRlZCBhbmQgc2VyaWFsaXplZCBpbiBqYXZhVG9OYXRpdmUKLSAqIHRvIHRoYXQgbmF2aXZlIHRvIGphdmEgY2FuIGVuc3VyZSB0aGF0IGl0J3MgcmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhbGx5IHRvIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZC4KLSAqLwotcHVibGljIGNsYXNzIE9iamVjdFRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIKLXsKLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIHJlZ2lzdGVyIHRyYW5zZmVyIHR5cGUgbmFtZS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTkFNRSA9ICJsb2NhbC10cmFuc2Zlci1mb3JtYXQiOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBJRCB0aGF0IGlzIHJlZ2lzdGVyZWQgdG8gdGhlIG5hbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUWVBFX0lEID0gcmVnaXN0ZXJUeXBlKFRZUEVfTkFNRSk7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgaW5pdGlhbGl6ZWQgYW5kIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0SW5zdGFuY2V9LgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3RUcmFuc2ZlciBpbnN0YW5jZTsKLQotICAvKioKLSAgICogVGhpcyByZXR1cm5zIHRoZSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyB0cmFuc2ZlciBhZ2VudC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgT2JqZWN0VHJhbnNmZXIgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgT2JqZWN0VHJhbnNmZXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyByZWNvcmRzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSB0cmFuc2ZlciBkYXRhIHdhcyByZWNvcmRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBsb25nIHN0YXJ0VGltZTsKLQotICAvKioKLSAgICogVGhpcyByZWNvcmRzIHRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkLgotICAgKi8KLSAgcHJvdGVjdGVkIE9iamVjdCBvYmplY3Q7Ci0KLSAgLyoqCi0gICAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZTsgdHlwaWNhbGx5IHlvdSBnZXQgb25lIGZyb20ge0BsaW5rICNnZXRJbnN0YW5jZX0uCi0gICAqLwotICBwcm90ZWN0ZWQgT2JqZWN0VHJhbnNmZXIoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyByZXR1cm5zIHRoZSB0cmFuc2ZlciBpZHMgdGhhdCB0aGlzIGFnZW50IHN1cHBvcnRzLgotICAgKi8KLSAgcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSAKLSAgewotICAgIHJldHVybiBuZXcgaW50W10geyBUWVBFX0lEIH07Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyByZXR1cm5zIHRoZSB0cmFuc2ZlciBuYW1lcyB0aGF0IHRoaXMgYWdlbnQgc3VwcG9ydHMuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgVFlQRV9OQU1FIH07Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyByZWNvcmRzIHRoZSBvYmplY3QgYW5kIGN1cnJlbnQgdGltZSBhbmQgZW5jb2RlcyBvbmx5IHRoZSBjdXJyZW50IHRpbWUgaW50byB0aGUgdHJhbnNmZXIgZGF0YS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZShPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSAKLSAgewotICAgIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIGlmICh0cmFuc2ZlckRhdGEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdXBlci5qYXZhVG9OYXRpdmUoU3RyaW5nLnZhbHVlT2Yoc3RhcnRUaW1lKS5nZXRCeXRlcygpLCB0cmFuc2ZlckRhdGEpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGRlY29kZXMgdGhlIHRpbWUgb2YgdGhlIHRyYW5zZmVyIGFuZCByZXR1cm5zIHRoZSByZWNvcmRlZCB0aGUgb2JqZWN0IGlmIHRoZSByZWNvcmRlZCB0aW1lIGFuZCB0aGUgZGVjb2RlZCB0aW1lIG1hdGNoLgotICAgKi8KLSAgcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgCi0gIHsKLSAgICBsb25nIHN0YXJ0VGltZSAgPSBMb25nLnZhbHVlT2YobmV3IFN0cmluZygoYnl0ZVtdKXN1cGVyLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlckRhdGEpKSkubG9uZ1ZhbHVlKCk7Ci0gICAgcmV0dXJuCi0gICAgICB0aGlzLnN0YXJ0VGltZSA9PSBzdGFydFRpbWUgPwotICAgICAgICBvYmplY3QgOgotICAgICAgICBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL1ZpZXdlckRyYWdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL1ZpZXdlckRyYWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYWEzNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcmFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUxpc3RlbmVyOwotCi0KLS8qKgotICogVGhpcyBpcyBhbiBpbXBsZW1lbnRpb24gb2Yge0BsaW5rIERyYWdTb3VyY2VMaXN0ZW5lcn0uCi0gKiBJdCBhbGxvd3MgdGhlIHNlbGVjdGlvbiBpbiBlZmZlY3QgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkcmFnIGFuZCBkcm9wIGludGVyYWN0aW9uIHRvIGJlIHJlY29yZGVkLAotICogd2hpY2ggaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIGEgZHJhZyBhbmQgZHJvcCBpbnRlcmFjdGlvbiB3aXRoaW4gYSBzaW5nbGUgdmlldy4KLSAqIFRoaXMgaXMgaG93IG9uZSBvZiB0aGVzZSBhZGFwdGVycyBpcyB0eXBpY2FsbHkgaG9va2VkIHVwOgotICogPHByZT4KLSAqICAgdmlld2VyLmFkZERyYWdTdXBwb3J0Ci0gKiAgICAgKERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSywgCi0gKiAgICAgIG5ldyBUcmFuc2ZlciBbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9LAotICogICAgICBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLSAqIDwvcHJlPgotICogRG9pbmcgc28gc2ltcGx5IGFsbG93cyBhIGRyYWcgb3BlcmF0aW9uIHRvIGJlIGluaXRpYXRlZCBmcm9tIHRoZSB2aWV3ZXIKLSAqIHN1Y2ggdGhhdCB0aGUgdmlld2VyJ3Mgc2VsZWN0aW9uIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBkcm9wIHRhcmdldC4KLSAqIFNlZSB7QGxpbmsgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyfSBhbmQge0BsaW5rIExvY2FsVHJhbnNmZXJ9IGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3ZXJEcmFnQWRhcHRlciBpbXBsZW1lbnRzIERyYWdTb3VyY2VMaXN0ZW5lcgotewotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgdmlld2VyIHRvIHdoaWNoIHdlIGFyZSBsaXN0ZW5pbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgVmlld2VyIHZpZXdlcjsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgc2VsZWN0aW9uIHRoYXQgaXMgaW4gZWZmZWN0IGF0IHRoZSBzdGFydCBvZiB0aGUgZHJhZyBvcGVyYXRpb24KLSAgICovCi0gIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAvKioKLSAgICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gdmlld2VyLgotICAgKi8KLSAgcHVibGljIFZpZXdlckRyYWdBZGFwdGVyKFZpZXdlciB2aWV3ZXIpCi0gIHsKLSAgICBzdXBlcigpOwotCi0gICAgLy8gUmVtZW1iZXIgdGhlIHZpZXdlciBhbmQgbGlzdGVuIHRvIFNXVC5EcmFnRGV0ZWN0IHRvIGFsZXJ0IHRoZSBzdGFydCBvZiB0aGUgZHJhZyBvcGVyYXRpb24uCi0gICAgLy8KLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRyYWdnaW5nIGlzIGluaXRpYXRlZDsgaXQgcmVjb3JkcyB0aGUge0BsaW5rICNzZWxlY3Rpb259IG9mIHtAbGluayAjdmlld2VyfS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBkcmFnZ2luZyBpcyBjb21wbGV0ZWQ7IGl0IGZvcmdldHMgdGhlIHtAbGluayAjc2VsZWN0aW9ufS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzZWxlY3Rpb24gPSBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgdG8gdHJhbnNmZXIgdGhlIGRhdGEuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoT2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKQotICAgIHsKLSAgICAgIGV2ZW50LmRhdGEgPSBzZWxlY3Rpb247Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL1ZpZXdlckRyb3BBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL1ZpZXdlckRyb3BBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZDAzZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcm9wQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBhIGRyb3AgdGFyZ2V0IGxpc3RlbmVyIAotICogaXMgZGVzaWduZWQgdG8gdHVybiBhIGRyYWcgYW5kIGRyb3Agb3BlcmF0aW9uIGludG8gYSB7QGxpbmsgQ29tbWFuZH0gYmFzZWQgb24gdGhlIG1vZGVsIG9iamVjdHMgb2YgYW4ge0BsaW5rIEVkaXRpbmdEb21haW59Ci0gKiBhbmQgY3JlYXRlZCBieSB7QGxpbmsgRHJhZ0FuZERyb3BNYW5hZ2VyI2NyZWF0ZX0uCi0gKiBJdCBpcyBkZXNpZ25lZCB0byBkbyBlYXJseSBkYXRhIHRyYW5zZmVyIHNvIHRoZSB0aGUgZW5hYmxlbWVudCBhbmQgZmVlZGJhY2sgb2YgdGhlIGRyYWcgYW5kIGRyb3AgaW50ZXJhY3Rpb24KLSAqIGNhbiBpbnRpbWF0ZWx5IGRlcGVuZCBvbiB0aGUgc3RhdGUgb2YgdGhlIG1vZGVsIG9iamVjdHMgaW52b2xlZC4KLSAqIDxwPgotICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuCi0gKiBBbnkgY2hhbmdlIGluIGJlaGF2aW91ciBpcyB0eXBpY2FsbHkgYWNjb21wbGlzaGVkIGJ5IG92ZXJyaWRpbmcgCi0gKiB7QGxpbmsgSXRlbVByb3ZpZGVyQWRhcHRlcn0uY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kCi0gKiB0byByZXR1cm4gYSBkZXJpdmVkIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBEcmFnQW5kRHJvcENvbW1hbmR9LgotICogVGhpcyBpcyBob3cgb25lIHRoZXNlIGFkYXB0ZXJzIGlzIHR5cGljYWxseSBob29rZWQgdXA6Ci0gKiA8cHJlPgotICogICB2aWV3ZXIuYWRkRHJvcFN1cHBvcnQKLSAqICAgICAoRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LLAotICogICAgICBuZXcgVHJhbnNmZXIgW10geyBPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0sCi0gKiAgICAgIEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcih2aWV3ZXIpKTsKLSAqIDwvcHJlPgotICogPHA+Ci0gKiBUaGlzIGltcGxlbWVudGF0aW9uIHByZWZlcnMgdG8gdXNlIGEge0BsaW5rIE9iamVjdFRyYW5zZmVyfSwgCi0gKiB3aGljaCBzaG9ydC1jaXJjdWl0cyB0aGUgdHJhbnNmZXIgcHJvY2VzcyBmb3Igc2ltcGxlIHRyYW5zZmVycyB3aXRoaW4gdGhlIHdvcmtiZW5jaCwKLSAqIHRoZSBtZXRob2Qge0BsaW5rICNnZXREcmFnU291cmNlfSBjYW4gYmUgb3ZlcnJpZGVuIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyLgotICogVGhlIGltcGxlbWVudGF0aW9uIGFsc28gb25seSBoYW5kbGVzIGFuIHtAbGluayBJU3RydWN0dXJlZFNlbGVjdGlvbn0sCi0gKiBidXQgdGhlIG1ldGhvZCB7QGxpbmsgI2V4dHJhY3REcmFnU291cmNlfSBjYW4gYmUgb3ZlcnJpZGVuIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyLgotICogPHA+Ci0gKiBZb3UgY2FuIGNhbGwge0BsaW5rICNzZXRIb3ZlclRocmVzaG9sZH0gdG8gc2V0IHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCAKLSAqIHRvIGhvdmVyIG92ZXIgYW4gaXRlbSBiZWZvcmUge0BsaW5rICNob3Zlcn0gaXMgY2FsbGVkOwotICogdGhlIGRlZmF1bHQgaXMgMTUwMCBtaWxsaXNlY29uZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3ZXJEcm9wQWRhcHRlciBleHRlbmRzIERyb3BUYXJnZXRBZGFwdGVyCi17Ci0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgZm9yIHdoaWNoIHRoaXMgaXMgYSBkcm9wIHRhcmdldCBsaXN0ZW5lci4KLSAgICovCi0gIHByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIG9mIHNvdXJjZSBvYmplY3RzIGJlaW5nIGRyYWdnZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzb3VyY2U7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIGNvbW1hbmQgY3JlYXRlZCBkdXJpbmcgZHJhZ2dpbmcgd2hpY2ggcHJvdmlkZXMgdGhlIGZlZWRiYWNrIGFuZCB3aWxsIGNhcnJ5IG91dCB0aGUgYWN0aW9uIHVwb24gY29tcGxldGlvbi4KLSAgICovCi0gIC8vICBwcm90ZWN0ZWQgQ29tbWFuZCBjb21tYW5kOwotICBwcm90ZWN0ZWQgRHJhZ0FuZERyb3BDb21tYW5kIGNvbW1hbmQ7Ci0gCi0gIC8qKgotICAgKiBUaGlzIHJlY29yZHMgdGhlIG9iamVjdCBmb3Igd2hpY2ggdGhlIHtAbGluayAjY29tbWFuZH0gd2FzIGNyZWF0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgT2JqZWN0IGNvbW1hbmRUYXJnZXQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBhbW91bnQgb2YgdGltZSB0byBob3ZlciBvdmVyIGEgdHJlZSBpdGVtIGJlZm9yZSBleHBhbmRpbmcgaXQKLSAgICovCi0gIHByb3RlY3RlZCBpbnQgaG92ZXJUaHJlc2hvbGQgPSAxNTAwOwotCi0gIC8qKgotICAgKiBUaGUgaXMgdGhlIHRpbWUgdGhlIG1vdXNlIGZpcnN0IHN0YXJ0ZWQgaG92ZXJpbmcgb3ZlciB0aGUgY3VycmVudCBpdGVtLgotICAgKi8KLSAgcHJvdGVjdGVkIGxvbmcgaG92ZXJTdGFydCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG1vc3QgcmVjZW50IGl0ZW0gZm9yIHRoZSB7QGxpbmsgI2hvdmVyU3RhcnR9LgotICAgKi8KLSAgcHJvdGVjdGVkIFdpZGdldCBwcmV2aW91c0l0ZW07Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9yaWdpbmFsIG9wZXJhdGlvbiB0aGF0IHdhcyBpbiBlZmZlY3QgYmVmb3JlIHdlIHNldCB0aGUgZXZlbnQuZGV0YWlsIGluIGhlcmUuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IG9yaWdpbmFsT3BlcmF0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBpbmZvcm1hdGlvbiB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VycmVudCBjb21tYW5kLgotICAgKi8KLSAgcHJvdGVjdGVkIERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uIGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uOwotCi0gIHByb3RlY3RlZCBEcmFnQW5kRHJvcE1hbmFnZXIgZHJhZ0FuZERyb3BNYW5hZ2VyOwotCi0gIC8qKgotICAgKiBUaGlzIGNyZWF0ZXMgYW5kIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBkb21haW4gYW5kIHZpZXdlci4KLSAgICovCi0gIHB1YmxpYyBWaWV3ZXJEcm9wQWRhcHRlcihWaWV3ZXIgdmlld2VyLCBEcmFnQW5kRHJvcE1hbmFnZXIgZHJhZ0FuZERyb3BNYW5hZ2VyKQotICB7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgdGhpcy5kcmFnQW5kRHJvcE1hbmFnZXIgPSBkcmFnQW5kRHJvcE1hbmFnZXI7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbW91c2UgZmlyc3QgZW50ZXJzIG9yIHN0YXJ0cyBkcmFnZ2luZyBpbiB0aGUgdmlld2VyLgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgewotICAgIG9yaWdpbmFsT3BlcmF0aW9uID0gZXZlbnQuZGV0YWlsOwotICAgIGhlbHBlcihldmVudCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbW91c2UgbGVhdmVzIG9yIHN0b3BzIGRyYWdnaW5nIGluIHRoZSB2aWV3ZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBDbGVhbiB1cCB0aGUgY29tbWFuZCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgLy8KLSAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgIHsKLS8vICAgICAgICBjb21tYW5kLmRpc3Bvc2UoKTsKLSAgICAgIGNvbW1hbmQgPSBudWxsOwotICAgICAgY29tbWFuZFRhcmdldCA9IG51bGw7Ci0gICAgfQotCi0gICAgLy8gUmVzZXQgdGhlIG90aGVyIHZhbHVlcy4KLSAgICAvLwotICAgIHByZXZpb3VzSXRlbSA9IG51bGw7Ci0gICAgaG92ZXJTdGFydCA9IDA7Ci0gICAgc291cmNlID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBvcGVyYXRpb24gaGFzIGNoYW5nZWQgaW4gc29tZSB3YXksIHR5cGljYWxseSBiZWNhdXNlIHRoZSB1c2VyIGNoYW5nZXMga2V5Ym9hcmQgbW9kaWZpZXJzLgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgb3JpZ2luYWxPcGVyYXRpb24gPSBldmVudC5kZXRhaWw7Ci0gICAgaGVscGVyKGV2ZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCByZXBlYXRlZCB3aGVuIHRoZSBtb3VzZSBvdmVyIHRoZSB2aWV3ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIAotICB7Ci0gICAgaGVscGVyKGV2ZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCBqdXN0IGFzIHRoZSBtb3VzZSBpcyByZWxlYXNlZCBvdmVyIHRoZSB2aWV3ZXIgdG8gaW5pdGlhdGUgYSBkcm9wLgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIAotICB7Ci0gICAgLy8gVGhlcmUgc2VlbXMgdG8gYmUgYSBidWcgaW4gU1dUIHRoYXQgdGhlIHZpZXcgbWF5IGhhdmUgc2Nyb2xsZWQuCi0gICAgLy8gaGVscGVyKGV2ZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB0byBpbmRhdGUgdGhhdCB0aGUgZHJvcCBhY3Rpb24gc2hvdWxkIGJlIGludm9rZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgewotICAgIC8vIFRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIFNXVCB0aGF0IHRoZSB2aWV3IG1heSBoYXZlIHNjcm9sbGVkLgotICAgIC8vIGhlbHBlcihldmVudCk7Ci0gICAgaWYgKGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgY29tbWFuZCA9IGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uLmNyZWF0ZUNvbW1hbmQoKTsKLQotICAgICAgLy8gRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0KLSAgICAgIC8vIENsZWFuIHVwIHRoZSBzdGF0ZS4KLSAgICAgIC8vCi0gICAgICBjb21tYW5kID0gbnVsbDsKLSAgICAgIGNvbW1hbmRUYXJnZXQgPSBudWxsOwotICAgICAgcHJldmlvdXNJdGVtID0gbnVsbDsKLSAgICAgIGhvdmVyU3RhcnQgPSAwOwotICAgICAgc291cmNlID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRoZSBzYW1lIHdheSBmb3IgZWFjaCBvZiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyfSBtZXRob2RzLCBleGNlcHQgZHVyaW5nIGxlYXZlLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaGVscGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgewotICAgIC8vIFRyeSB0byBnZXQgdGhlIHNvdXJjZSBpZiB0aGVyZSBpc24ndCBvbmUuCi0gICAgLy8KLSAgICBpZiAoc291cmNlID09IG51bGwpCi0gICAgewotICAgICAgc291cmNlID0gZ2V0RHJhZ1NvdXJjZShldmVudCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlIGlmIChldmVudC5jdXJyZW50RGF0YVR5cGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXRDdXJyZW50RGF0YVR5cGUoZXZlbnQpOwotICAgIH0KLQotICAgIC8vIElmIHRoZXJlJ3Mgc3RpbGwgbm8gc291cmNlLCB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgdG8gdHJ5IGFnYWluLgotICAgIC8vCi0gICAgaWYgKHNvdXJjZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0gICAgICBldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0gICAgfQotICAgIC8vIE90aGVyd2lzZSwgaWYgd2UgbmVlZCB0byBzY3JvbGwuLi4KLSAgICAvLwotICAgIGVsc2UgaWYgKHNjcm9sbElmTmVlZGVkKGV2ZW50KSkKLSAgICB7Ci0gICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHdlIHNjcm9sbCwgd2UganVzdCBkbyBhbGwgdGhlIHdvcmsgb24gdGhlIG5leHQgZXZlbnQgYW5kIG9ubHkganVzdCBzY3JvbGwgbm93LgotICAgICAgLy8KLSAgICAgIGV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBpdGVtLCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICAvLwotICAgICAgT2JqZWN0IHRhcmdldCA9IGV2ZW50Lml0ZW0gPT0gbnVsbCA/IG51bGwgOiBldmVudC5pdGVtLmdldERhdGEoKTsKLSAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUYWJsZVRyZWVJdGVtKQotICAgICAgewotICAgICAgICB0YXJnZXQgPSAoKFRhYmxlVHJlZUl0ZW0pdGFyZ2V0KS5nZXREYXRhKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIERvIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgdGhlIGhvdmVyIGluZm9ybWF0aW9uLgotICAgICAgLy8gSWYgd2UncmUgb3ZlciBhIG5ldyBpdGVtIGZyb20gYmVmb3JlLgotICAgICAgLy8KLSAgICAgIGlmIChldmVudC5pdGVtICE9IHByZXZpb3VzSXRlbSkKLSAgICAgIHsKLSAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGl0ZW0gYW5kIHRoZSB0aW1lLgotICAgICAgICAvLwotICAgICAgICBwcmV2aW91c0l0ZW0gPSBldmVudC5pdGVtOwotICAgICAgICBob3ZlclN0YXJ0ID0gZXZlbnQudGltZTsKLSAgICAgIH0gCi0gICAgICBlbHNlIGlmICh0YXJnZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGV2ZW50LnRpbWUgLSBob3ZlclN0YXJ0ID4gaG92ZXJUaHJlc2hvbGQpCi0gICAgICAgIHsKLSAgICAgICAgICBob3Zlcih0YXJnZXQpOwotCi0gICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBob3ZlciBvdmVyIHRoaXMgZ3V5IGFnYWluLgotICAgICAgICAgIC8vCi0gICAgICAgICAgaG92ZXJTdGFydCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIERldGVybWluZSBpZiB3ZSBjYW4gY3JlYXRlIGEgdmFsaWQgY29tbWFuZCBhdCB0aGUgY3VycmVudCBtb3VzZSBsb2NhdGlvbi4KLSAgICAgIC8vCi0gICAgICBib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLSAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBwcmV2aW91cyBjYWNoZWQgY29tbWFuZC4uLgotICAgICAgLy8KLSAgICAgIGlmIChjb21tYW5kID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgY29tbWFuZCBhbmQgdGVzdCBpZiBpdCBpcyBleGVjdXRhYmxlLgotICAgICAgICAvLwotICAgICAgICBjb21tYW5kVGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICBjb21tYW5kID0gZHJhZ0FuZERyb3BNYW5hZ2VyLmNyZWF0ZUNvbW1hbmQodGFyZ2V0LCBnZXRMb2NhdGlvbihldmVudCksIGV2ZW50Lm9wZXJhdGlvbnMsIGV2ZW50LmRldGFpbCwgc291cmNlKTsKLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAJdmFsaWQgPSBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbnQgb3BlcmF0aW9uID0gb3JpZ2luYWxPcGVyYXRpb24gIT0gZXZlbnQuZGV0YWlsID8gb3JpZ2luYWxPcGVyYXRpb24gOiBldmVudC5kZXRhaWw7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNhY2hlZCBjb21tYW5kIGlzIGFibGUgdG8gcHJvdmlkZSBkcmFnIGFuZCBkcm9wIGZlZWRiYWNrLgotICAgICAgICAvLwotICAgICAgICBpZiAodGFyZ2V0ID09IGNvbW1hbmRUYXJnZXQpLy8gJiYgY29tbWFuZCBpbnN0YW5jZW9mIERyYWdBbmREcm9wRmVlZGJhY2spCi0gICAgICAgIHsKLSAgICAgICAgICBmbG9hdCBsb2NhdGlvbiA9IGdldExvY2F0aW9uKGV2ZW50KTsKLQotICAgICAgICAgIGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uID0gCi0gICAgICAgICAgICBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24odGFyZ2V0LCBsb2NhdGlvbiwgZXZlbnQub3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotCi0gICAgICAgICAgLy8gSWYgc28sIHJldmFsaWRhdGUgdGhlIGNvbW1hbmQuCi0gICAgICAgICAgLy8KLSAgICAgICAgICBjb21tYW5kLnJlaW5pdGlhbGl6ZSh0YXJnZXQsIGxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0gICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgdmFsaWQgPSBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgbm90LCBkaXNwb3NlIHRoZSBjdXJyZW50IGNvbW1hbmQgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuCi0gICAgICAgICAgLy8KLSAgICAgICAgICAvLyAgICAgICAgICBjb21tYW5kLmRpc3Bvc2UoKTsKLSAgICAgICAgICBjb21tYW5kVGFyZ2V0ID0gdGFyZ2V0OwotCi0gICAgICAgICAgZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSAKLSAgICAgICAgICAgIG5ldyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbih0YXJnZXQsIGdldExvY2F0aW9uKGV2ZW50KSwgZXZlbnQub3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotCi0gICAgICAgICAgLy8gRHJhZ0FuZERyb3BNYW5hZ2VyLmNyZWF0ZShkb21haW4sIHRhcmdldCwgZ2V0TG9jYXRpb24oZXZlbnQpLCBldmVudC5vcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0gICAgICAgICAgLy8KLSAgICAgICAgICBjb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24uY3JlYXRlQ29tbWFuZCgpOwotCi0gICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgCXZhbGlkID0gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoaXMgY29tbWFuZCBjYW4gcHJvdmlkZSBkZXRhaWxlZCBkcmFnIGFuZCBkcm9wIGZlZWRiYWNrLi4uCi0gICAgICAvLwotICAgICAgLy9pZiAoY29tbWFuZCBpbnN0YW5jZW9mIERyYWdBbmREcm9wQ29tbWFuZCkKLSAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZmVlZGJhY2sgZm9yIHRoZSBvcGVyYXRpb24gYW5kIG1vdXNlIHBvaW50IGZyb20gdGhlIGNvbW1hbmQuCi0gICAgICAgIC8vCi0gICAgICAgIGV2ZW50LmRldGFpbCA9IGNvbW1hbmQuZ2V0T3BlcmF0aW9uKCk7Ci0gICAgICAgIGV2ZW50LmZlZWRiYWNrID0gY29tbWFuZC5nZXRGZWVkYmFjaygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodmFsaWQpCi0gICAgICB7Ci0gICAgICAgIC8vIEFsbCB3ZSBjYW4ga25vdyBpcyB0byBwcm92aWRlIHNlbGVjdGlvbiBmZWVkYmFjay4KLSAgICAgICAgLy8KLSAgICAgICAgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBUaGVyZSBpcyBubyBleGVjdXRhYmxlIGNvbW1hbmQsIHNvIHdlJ2QgYmV0dGVyIG5peCB0aGUgd2hvbGUgZGVhbC4KLSAgICAgICAgLy8KLSAgICAgICAgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLSAgICAgICAgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUOwotICAgICAgfQotICAgIH0KLSAgfQotICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHNldEN1cnJlbnREYXRhVHlwZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9iamVjdFRyYW5zZmVyIG9iamVjdFRyYW5zZmVyID0gT2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICBUcmFuc2ZlckRhdGEgW10gZGF0YVR5cGVzID0gZXZlbnQuZGF0YVR5cGVzOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YVR5cGVzLmxlbmd0aDsgKytpKQotICAgIHsKLSAgICAgIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEgPSBkYXRhVHlwZXNbaV07Ci0gICAgICAvLyBJZiB0aGUgbG9jYWwgdGFuc2ZlciBzdXBwb3J0cyB0aGlzIGRhdGF0eXBlLCBzd2l0Y2ggdG8gdGhhdCBkYXRhIHR5cGUKLSAgICAgIC8vCi0gICAgICBpZiAob2JqZWN0VHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpCi0gICAgICB7Ci0gICAgICAgIGV2ZW50LmN1cnJlbnREYXRhVHlwZSA9IHRyYW5zZmVyRGF0YTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiogCi0gICAqIFRoaXMgIGF0dGVtcHRzIHRvIGV4dHJhY3QgdGhlIGRyYWcgc291cmNlIGZyb20gdGhlIGV2ZW50IGVhcmx5LCBpLmUuLCBiZWZvcmUgdGhlIGRyb3AgbWV0aG9kLgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHRyaWVzIHRvIHVzZSBhIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5PYmplY3RUcmFuc2Zlcn0uCi0gICAqLwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXREcmFnU291cmNlKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgewotICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgZGF0YSB0eXBlIGNhbiBiZSB0cmFuc2ZlcmVkIGxvY2FsbHkuCi0gICAgLy8KLSAgICBPYmplY3RUcmFuc2ZlciBvYmplY3RUcmFuc2ZlciA9IE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0gICAgaWYgKCFvYmplY3RUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkKLSAgICB7Ci0gICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGRhdGEgdHlwZXMgdG8gc2VlIGlmIHRoZXJlIGlzIGEgZGF0YXR5cGUgdGhhdCBzdXBwb3J0cyBhIGxvY2FsIHRyYW5zZmVyLgotICAgICAgLy8KLSAgICAgIHNldEN1cnJlbnREYXRhVHlwZShldmVudCk7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFRyYW5zZmVyIHRoZSBkYXRhIGFuZCBleHRyYWN0IGl0LgotICAgICAgLy8KLSAgICAgIE9iamVjdCBvYmplY3QgPSBvYmplY3RUcmFuc2Zlci5uYXRpdmVUb0phdmEoZXZlbnQuY3VycmVudERhdGFUeXBlKTsKLSAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gZXh0cmFjdERyYWdTb3VyY2Uob2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBleHRyYWN0cyBhIGNvbGxlY3Rpb24gb2YgZHJhZ2dlZCBzb3VyY2Ugb2JqZWN0cyBmcm9tIHRoZSBnaXZlbiBvYmplY3QgcmV0cmlldmVkIGZyb20gdGhlIHRyYW5zZmVyIGFnZW50LgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY29udmVydHMgYSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBpbnRvIGEgY29sbGVjdGlvbiBvZiBlbGVtZW50cy4KLSAgICovCi0gIHByb3RlY3RlZCBDb2xsZWN0aW9uIGV4dHJhY3REcmFnU291cmNlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAvLyBUcmFuc2ZlciB0aGUgZGF0YSBhbmQgY29udmVydCB0aGUgc3RydWN0dXJlZCBzZWxlY3Rpb24gdG8gYSBjb2xsZWN0aW9uIG9mIG9iamVjdHMuCi0gICAgLy8KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilvYmplY3QpLml0ZXJhdG9yKCk7IGVsZW1lbnRzLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICByZXN1bHQuYWRkKGVsZW1lbnRzLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgZ2V0cyB0aGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gaG92ZXIgb3ZlciBhbiBpdGVtIGJlZm9yZSB7QGxpbmsgI2hvdmVyfSBpcyBjYWxsZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEhvdmVyVGhyZXNob2xkKCkKLSAgewotICAgIHJldHVybiBob3ZlclRocmVzaG9sZDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHNldCB0aGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gaG92ZXIgb3ZlciBhbiBpdGVtIGJlZm9yZSB7QGxpbmsgI2hvdmVyfSBpcyBjYWxsZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIb3ZlclRocmVzaG9sZChpbnQgaG92ZXJUaHJlc2hvbGQpCi0gIHsKLSAgICB0aGlzLmhvdmVyVGhyZXNob2xkID0gaG92ZXJUaHJlc2hvbGQ7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY3Vyc29yIGhhcyBob3ZlcmVkIG92ZXIgdGhlIGdpdmVuIHRhcmdldCBmb3IgbG9uZ2VyIHRoYW4ge0BsaW5rICNob3ZlclRocmVzaG9sZH0uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBob3ZlcihPYmplY3QgdGFyZ2V0KQotICB7Ci0gICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikKLSAgICB7Ci0gICAgICAoKEFic3RyYWN0VHJlZVZpZXdlcil2aWV3ZXIpLmV4cGFuZFRvTGV2ZWwodGFyZ2V0LCAxKTsKLSAgICB9Ci0gIH0KLQotICAvKiogCi0gICAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIGEgc2Nyb2xsIHdhcyBwZXJmb3JtZWQgYmFzZWQgb24gdGhlIGdpdmVuIGRyYWcgY29vcmRpbmF0ZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzY3JvbGxJZk5lZWRlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBCeSBkZWZhdWx0IHdlJ2xsIG5vdCBzY3JvbGwKLSAgICAvLwotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICAvLyBXZSBvbmx5IGhhbmRsZSBhIHRyZWUgaXRlbSByaWdodCBub3cuCi0gICAgLy8KLSAgICBpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtKQotICAgIHsKLSAgICAgIC8vIFRyZWUgaXRlbXMgaGF2ZSBzcGVjaWFsIGRhdGEgdGhhdCB3aWxsIGhlbHAuCi0gICAgICAvLwotICAgICAgVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQotICAgICAgLy8gV2UgbmVlZCBuZWVkIHRoZSBwb2ludCBpbiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNvbnRyb2wgYW5kIHRoZSBjb250cm9sJ3MgYm91bmRzLgotICAgICAgLy8KLSAgICAgIFRyZWUgdHJlZSA9IHRyZWVJdGVtLmdldFBhcmVudCgpOwotICAgICAgUG9pbnQgcG9pbnQgPSB0cmVlLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IHRyZWUuZ2V0Q2xpZW50QXJlYSgpOwotCi0gICAgICAvLyBUaGlzIGlzIHRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgZnJvbSB0aGUgdG9wIG9yIGJvdHRvbSB0aGF0IHdpbGwgY2F1c2Ugc2Nyb2xsaW5nLgotICAgICAgLy8KLSAgICAgIGludCBzY3JvbGxFcHNpbG9uID0gTWF0aC5taW4odHJlZUl0ZW0uZ2V0Qm91bmRzKCkuaGVpZ2h0LCBib3VuZHMuaGVpZ2h0IC8gMyk7Ci0KLSAgICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgaXRlbSB0aGF0IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3LgotICAgICAgLy8KLSAgICAgIFRyZWVJdGVtIHNjcm9sbFRyZWVJdGVtID0gbnVsbDsKLQotICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNjcm9sbCB1cC4KLSAgICAgIC8vCi0gICAgICBpZiAocG9pbnQueSA8IHNjcm9sbEVwc2lsb24pCi0gICAgICB7Ci0gICAgICAgIC8vIERldGVybWluZSB0aGUgcGFyZW50IHRvIGZpbmQgdGhlIHNpYmxpbmcuCi0gICAgICAgIC8vCi0gICAgICAgIFRyZWVJdGVtIHBhcmVudCA9IHRyZWVJdGVtLmdldFBhcmVudEl0ZW0oKTsKLSAgICAgICAgLy8gV2FsayB0aHJvdWdoIHRoZSBzaWJsaW5ncy4KLSAgICAgICAgLy8KLSAgICAgICAgVHJlZUl0ZW0gW10gY2hpbGRyZW4gPSBwYXJlbnQgPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbXMoKSA6IHBhcmVudC5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSXMgdGhpcyBhIG1hdGNoLgotICAgICAgICAgIC8vCi0gICAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IHRyZWVJdGVtKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcHJldmlvdXMgc2libGluZy4uLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2Nyb2xsVHJlZUl0ZW0gPSBjaGlsZHJlbltpIC0gMV07Ci0KLSAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGRlZXBlc3QgZGVzY2VuZGVudCBvZiB0aGlzIHByZXZpb3VzIHNpYmxpbmcuCi0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHNjcm9sbFRyZWVJdGVtLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoICE9IDAgJiYgc2Nyb2xsVHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzY3JvbGxUcmVlSXRlbSA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFRoZSBwYXJlbnQgbXVzdCBiZSB0aGUgcHJldmlvdXMuCi0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIHNjcm9sbFRyZWVJdGVtID0gcGFyZW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSdyZSBkb25lIGFmdGVyIHRoZSBtYXRjaC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIElmIHdlIHNob3VsZCBzY3JvbGwgZG93bi4uLgotICAgICAgLy8KLSAgICAgIGVsc2UgaWYgKGJvdW5kcy5oZWlnaHQgLSBwb2ludC55IDwgc2Nyb2xsRXBzaWxvbikKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhpcyB0aGluZyBoYXMgdmlzaWJsZSBjaGlsZHJlbiwgdGhlbiB0aGUgZmlyc3QgY2hpbGQgbXVzdCBiZSBuZXh0LgotICAgICAgICAvLwotICAgICAgICBUcmVlSXRlbSBbXSBjaGlsZHJlbiA9IHRyZWVJdGVtLmdldEl0ZW1zKCk7Ci0gICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCAhPSAwICYmIHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzY3JvbGxUcmVlSXRlbSA9IGNoaWxkcmVuWzBdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIFdlIG5lZWQgdGhlIHBhcmVudCB0byBkZXRlcm1pbmUgc2libGluZ3MgYW5kIHdpbGwgd2FsayB1cCB0aGUgdHJlZSBpZiB3ZSBhcmUgdGhlIGxhc3Qgc2libGluZy4KLSAgICAgICAgICAvLwotICAgICAgICAgIHdoaWxlIChzY3JvbGxUcmVlSXRlbSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSdyZSBkb25lLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIFRyZWVJdGVtIHBhcmVudCA9IHRyZWVJdGVtLmdldFBhcmVudEl0ZW0oKTsKLSAgICAgICAgICAgIC8vIFdhbGsgdGhlIGNoaWxkcmVuLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGNoaWxkcmVuID0gcGFyZW50ID09IG51bGwgPyB0cmVlLmdldEl0ZW1zKCkgOiBwYXJlbnQuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFdoZW4gd2UgZmluZCB0aGUgY2hpbGQuCi0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSA9PSB0cmVlSXRlbSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IGluZGV4IGlzIGEgdmFsaWQgaW5kZXguLi4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIGlmICgrK2kgPCBjaGlsZHJlbi5sZW5ndGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gV2UndmUgZm91bmQgdGhlIGl0ZW0uCi0gICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgc2Nyb2xsVHJlZUl0ZW0gPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwYXJlbnQuCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXYWxrIHVwLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHRyZWVJdGVtID0gcGFyZW50OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB3ZSBzaG91bGQgc2Nyb2xsLgotICAgICAgLy8KLSAgICAgIGlmIChzY3JvbGxUcmVlSXRlbSAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBPbmx5IHNjcm9sbCBpZiB3ZSdyZSBvbiBhbiBpdGVtIGZvciBhIHdoaWxlLgotICAgICAgICAvLwotICAgICAgICBpZiAocHJldmlvdXNJdGVtICE9IG51bGwgJiYgZXZlbnQudGltZSAtIGhvdmVyU3RhcnQgPiAyMDApCi0gICAgICAgIHsKLSAgICAgICAgICBTY3JvbGxCYXIgdmVydGljYWxTY3JvbGxCYXIgPSB0cmVlLmdldFZlcnRpY2FsQmFyKCk7Ci0gICAgICAgICAgaWYgKHZlcnRpY2FsU2Nyb2xsQmFyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGJlZm9yZSA9IHZlcnRpY2FsU2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGl0ZW0gaXMgc2Nyb2xsZWQgaW4gcGxhY2UuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgdHJlZS5zaG93SXRlbShzY3JvbGxUcmVlSXRlbSk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBzY3JvbGwgYWdhaW4gcXVpY2tseS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBwcmV2aW91c0l0ZW0gPSBudWxsOwotCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHdlJ3ZlIGRvbmUgYSBzY3JvbGwgYW5kIG5vdGhpbmcgZWxzZSBzaG91bGQgYmUgZG9uZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICByZXN1bHQgPSBiZWZvcmUgIT0gdmVydGljYWxTY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIElmIHRoZSBpdGVtIGNoYW5nZXMsIHJlc2V0IHRoZSB0aW1lciBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAvLwotICAgICAgICAgIGlmIChldmVudC5pdGVtICE9IHByZXZpb3VzSXRlbSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2aW91c0l0ZW0gPSBldmVudC5pdGVtOwotICAgICAgICAgICAgaG92ZXJTdGFydCA9IGV2ZW50LnRpbWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pCi0gICAgewotICAgICAgLy8gVGFibGUgaXRlbXMgaGF2ZSBzcGVjaWFsIGRhdGEgdGhhdCB3aWxsIGhlbHAuCi0gICAgICAvLwotICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQotICAgICAgLy8gV2UgbmVlZCBuZWVkIHRoZSBwb2ludCBpbiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNvbnRyb2wgYW5kIHRoZSBjb250cm9sJ3MgYm91bmRzLgotICAgICAgLy8KLSAgICAgIFRhYmxlIHRhYmxlID0gdGFibGVJdGVtLmdldFBhcmVudCgpOwotICAgICAgUG9pbnQgcG9pbnQgPSB0YWJsZS50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSB0YWJsZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICBpZiAodGFibGUuZ2V0SGVhZGVyVmlzaWJsZSgpKQotICAgICAgewotICAgICAgICBpbnQgb2Zmc2V0ID0gdGFibGUuZ2V0SXRlbUhlaWdodCgpOwotICAgICAgICBib3VuZHMueSArPSBvZmZzZXQ7Ci0gICAgICAgIGJvdW5kcy5oZWlnaHQgLT0gb2Zmc2V0OwotICAgICAgICBwb2ludC55IC09IG9mZnNldDsKLSAgICAgIH0KLQotICAgICAgLy8gVGhlIHBvc2l0aW9uIG9mIHRoaXMgaXRlbS4KLSAgICAgIC8vCi0gICAgICBpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKHRhYmxlSXRlbSk7Ci0KLSAgICAgIC8vIFRoaXMgaXMgdGhlIGRpc3RhbmNlIGluIHBpeGVscyBmcm9tIHRoZSB0b3Agb3IgYm90dG9tIHRoYXQgd2lsbCBjYXVzZSBzY3JvbGxpbmcuCi0gICAgICAvLwotICAgICAgaW50IHNjcm9sbEVwc2lsb24gPSBNYXRoLm1pbih0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApLmhlaWdodCwgYm91bmRzLmhlaWdodCAvIDMpOwotCi0gICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGl0ZW0gdGhhdCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB0aGUgdmlldy4KLSAgICAgIC8vCi0gICAgICBUYWJsZUl0ZW0gc2Nyb2xsVGFibGVJdGVtID0gbnVsbDsKLQotICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNjcm9sbCB1cC4KLSAgICAgIC8vCi0gICAgICBpZiAocG9pbnQueSA8IHNjcm9sbEVwc2lsb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChpbmRleCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBzY3JvbGxUYWJsZUl0ZW0gPSB0YWJsZS5nZXRJdGVtcygpW2luZGV4IC0gMV07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIElmIHdlIHNob3VsZCBzY3JvbGwgZG93bi4uLgotICAgICAgLy8KLSAgICAgIGVsc2UgaWYgKGJvdW5kcy5oZWlnaHQgLSBwb2ludC55IDwgc2Nyb2xsRXBzaWxvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKGluZGV4ICsgMSA8IHRhYmxlLmdldEl0ZW1zKCkubGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgc2Nyb2xsVGFibGVJdGVtID0gIHRhYmxlLmdldEl0ZW1zKClbaW5kZXggKyAxXTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB3ZSBzaG91bGQgc2Nyb2xsLgotICAgICAgLy8KLSAgICAgIGlmIChzY3JvbGxUYWJsZUl0ZW0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gT25seSBzY3JvbGwgaWYgd2UncmUgb24gYW4gaXRlbSBmb3IgYSB3aGlsZS4KLSAgICAgICAgLy8KLSAgICAgICAgaWYgKHByZXZpb3VzSXRlbSAhPSBudWxsICYmIGV2ZW50LnRpbWUgLSBob3ZlclN0YXJ0ID4gMjAwKQotICAgICAgICB7Ci0gICAgICAgICAgU2Nyb2xsQmFyIHZlcnRpY2FsU2Nyb2xsQmFyID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLSAgICAgICAgICBpZiAodmVydGljYWxTY3JvbGxCYXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYmVmb3JlID0gdmVydGljYWxTY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaXRlbSBpcyBzY3JvbGxlZCBpbiBwbGFjZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICB0YWJsZS5zaG93SXRlbShzY3JvbGxUYWJsZUl0ZW0pOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2Nyb2xsIGFnYWluIHF1aWNrbHkuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgcHJldmlvdXNJdGVtID0gbnVsbDsKLQotICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB3ZSd2ZSBkb25lIGEgc2Nyb2xsIGFuZCBub3RoaW5nIGVsc2Ugc2hvdWxkIGJlIGRvbmUuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgcmVzdWx0ID0gYmVmb3JlICE9IHZlcnRpY2FsU2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJZiB0aGUgaXRlbSBjaGFuZ2VzLCByZXNldCB0aGUgdGltZXIgaW5mb3JtYXRpb24uCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAoZXZlbnQuaXRlbSAhPSBwcmV2aW91c0l0ZW0pCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJldmlvdXNJdGVtID0gZXZlbnQuaXRlbTsKLSAgICAgICAgICAgIGhvdmVyU3RhcnQgPSBldmVudC50aW1lOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGZsb2F0IGdldExvY2F0aW9uKERyb3BUYXJnZXRFdmVudCBldmVudCkgCi0gIHsKLSAgICBpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtKQotICAgIHsKLSAgICAgIFRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0gICAgICBDb250cm9sIGNvbnRyb2wgPSB0cmVlSXRlbS5nZXRQYXJlbnQoKTsKLSAgICAgIFBvaW50IHBvaW50ID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLSAgICAgIHJldHVybiAoZmxvYXQpKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpYm91bmRzLmhlaWdodDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotICAgICAgQ29udHJvbCBjb250cm9sID0gdGFibGVJdGVtLmdldFBhcmVudCgpOwotICAgICAgUG9pbnQgcG9pbnQgPSBjb250cm9sLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0gICAgICByZXR1cm4gKGZsb2F0KShwb2ludC55IC0gYm91bmRzLnkpIC8gKGZsb2F0KWJvdW5kcy5oZWlnaHQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gMC4wRjsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24KLSAgewotICAgIC8vICAgIHByb3RlY3RlZCBFZGl0aW5nRG9tYWluIGRvbWFpbjsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHRhcmdldDsKLSAgICBwcm90ZWN0ZWQgZmxvYXQgbG9jYXRpb247Ci0gICAgcHJvdGVjdGVkIGludCBvcGVyYXRpb25zOwotICAgIHByb3RlY3RlZCBpbnQgb3BlcmF0aW9uOwotICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIHNvdXJjZTsKLSAgICBwdWJsaWMgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24KLSAgICAgIChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlKQotICAgIHsKLSAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgICAgdGhpcy5zb3VyY2UgPSBuZXcgQXJyYXlMaXN0KHNvdXJjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERyYWdBbmREcm9wQ29tbWFuZCBjcmVhdGVDb21tYW5kKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZHJhZ0FuZERyb3BNYW5hZ2VyLmNyZWF0ZUNvbW1hbmQodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvTmF2aWdhYmxlVGFibGVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL05hdmlnYWJsZVRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDNkM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvTmF2aWdhYmxlVGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBOYXZpZ2FibGVUYWJsZVZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyCi17Ci0gICBUYWJsZU5hdmlnYXRvciBuYXZpZ2F0b3I7Ci0KLSAgIHB1YmxpYyBOYXZpZ2FibGVUYWJsZVZpZXdlcihUYWJsZSBwYXJlbnQpCi0gICB7Ci0gICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgbmF2aWdhdG9yID0gbmV3IFRhYmxlTmF2aWdhdG9yKGdldFRhYmxlKCksIHRoaXMpOwotICAgfQotCi0gICAvL292ZXJyaWRlIHNldENlbGxFZGl0b3JzIHRvIHB1dCBpbiBjYWxsIHRvIG1vdmVBYm92ZUNlbGxFZGl0b3JzIGZvciBUYWJsZU5hdmlnYXRvcgotICAgcHVibGljIHZvaWQgc2V0Q2VsbEVkaXRvcnMoQ2VsbEVkaXRvcltdIGVkaXRvcnMpCi0gICB7Ci0gICAgIHN1cGVyLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOwotICAgICBuYXZpZ2F0b3IubW92ZUNlbGxFZGl0b3JzQWJvdmUoZWRpdG9ycyk7Ci0KLSAgIH0KLQotICAgLy9vdmVycmlkZSByZWZyZXNoIHNvIHRoYXQgVGFibGVOYXZpZ2F0b3IgaXMgcmVmcmVzaGVkIGZvciBhbGwgbW9kZWwgY2hhbmdlcwotICAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gICB7Ci0gICAJaWYoICF0aGlzLmdldFRhYmxlKCkuaXNEaXNwb3NlZCgpICkKLSAgIAl7Ci0gICAgICAJc3VwZXIucmVmcmVzaCgpOwotICAgICAgCW5hdmlnYXRvci5yZWZyZXNoKCk7Ci0gICAJfQotICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9SZXNvdXJjZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvUmVzb3VyY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhM2Y1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9SZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLQotcHVibGljIGNsYXNzIFJlc291cmNlRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIAotewotICBwcm90ZWN0ZWQgU3RyaW5nW10gZkV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBJRmlsZVtdIGZFeGNsdWRlZEZpbGVzOwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBmRXhjbHVkZXM7Ci0JCi0gIHB1YmxpYyBSZXNvdXJjZUZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zLCBDb2xsZWN0aW9uIGV4Y2x1ZGUpIAotICB7Ci0gICAgZkV4dGVuc2lvbnM9IGV4dGVuc2lvbnM7Ci0gICAgZkV4Y2x1ZGVzPSBleGNsdWRlOwotICAgIGZFeGNsdWRlZEZpbGVzID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBSZXNvdXJjZUZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zLCBJRmlsZVtdIGV4Y2x1ZGVkRmlsZXMsIENvbGxlY3Rpb24gZXhjbHVkZSkgCi0gIHsKLSAgICBmRXh0ZW5zaW9ucz0gZXh0ZW5zaW9uczsKLSAgICBmRXhjbHVkZXM9IGV4Y2x1ZGU7Ci0gICAgZkV4Y2x1ZGVkRmlsZXMgPSBleGNsdWRlZEZpbGVzOwotICB9Ci0JCi0gIHB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQkKLSAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSAKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIAotICAgIHsKLSAgICAgIGlmIChmRXhjbHVkZXMgIT0gbnVsbCAmJiBmRXhjbHVkZXMuY29udGFpbnMoZWxlbWVudCkpIAotICAgICAgewotCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBuYW1lPSAoKElGaWxlKWVsZW1lbnQpLmdldE5hbWUoKTsKLSAgICAgIGlmIChmRXhjbHVkZWRGaWxlcyAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaj0gMDsgaiA8IGZFeGNsdWRlZEZpbGVzLmxlbmd0aDsgaisrKSAKLSAgICAgICAgewotICAgICAgICAgIGlmICggKChJRmlsZSllbGVtZW50KS5nZXRMb2NhdGlvbigpLgotICAgICAgICAgICAgICAgdG9PU1N0cmluZygpLmNvbXBhcmVUbygoZkV4Y2x1ZGVkRmlsZXNbal0pLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKSA9PSAwICkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKGZFeHRlbnNpb25zLmxlbmd0aCA9PSAwKSAKLSAgICAgIHsKLSAgICAgICAgLy8gYXNzdW1lIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBmaWx0ZXIgYW55IGZpbGVzIGJhc2VkIG9uIAotICAgICAgICAvLyBleHRlbnNpb24KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIAotICAgICAgewotICAgICAgICBpZiAobmFtZS5lbmRzV2l0aChmRXh0ZW5zaW9uc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IAotICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSAKLSAgICB7IC8vIElQcm9qZWN0LCBJRm9sZGVyCi0gICAgICB0cnkgCi0gICAgICB7Ci0gICAgICAJSVJlc291cmNlW10gcmVzb3VyY2VzPSAoKElDb250YWluZXIpZWxlbWVudCkubWVtYmVycygpOwotCWZvciAoaW50IGk9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIAotICAgICAgICB7Ci0JICAvLyByZWN1cnNpdmUhCi0JICBpZiAoc2VsZWN0KHZpZXdlciwgcGFyZW50LCByZXNvdXJjZXNbaV0pKSAKLSAgICAgICAgICB7Ci0JICAgIHJldHVybiB0cnVlOwotCSAgfQotCX0KLSAgICAgIH0gCi0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSAKLSAgICAgIHsKLSAgICAgIH0JCQkJCi0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0TXVsdGlGaWxlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0TXVsdGlGaWxlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGE5MDgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdE11bHRpRmlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLQotLy8gUGFnZSB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgZmlsZXMKLXB1YmxpYyBjbGFzcyBTZWxlY3RNdWx0aUZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0gIElXb3JrYmVuY2ggd29ya2JlbmNoOwotICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0gIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5OwotICBUcmVlVmlld2VyIHNvdXJjZUZpbGVWaWV3ZXI7Ci0gIEJ1dHRvbiBhZGRCdXR0b247Ci0gIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0gIEJ1dHRvbiByZW1vdmVBbGxCdXR0b247Ci0gIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Qgc2VsZWN0ZWRMaXN0Qm94OwotICBCdXR0b24gaW1wb3J0QnV0dG9uOwotICBwcml2YXRlIFZlY3RvciBmRmlsdGVyczsKLSAgcHJvdGVjdGVkIElGaWxlW10gZmlsZU5hbWVzOwotICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290OwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfTElTVFNfSEVJR0hUID0gMjAwOwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0laSU5HX0xJU1RTX1dJRFRIID0gMTUwOwotCi0gIC8vIHBhcmFtZXRlciBpc0ZpbGVNYW5kYXRvcnkgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYXQgbGVhc3Qgb25lIGZpbGUgbXVzdCBiZSBzZWxlY3RlZCAgCi0gIC8vIGJlZm9yZSBiZWluZyBhYmxlIHRvIHByb2NlZWQgdG8gdGhlIG5leHQgcGFnZQotICBwdWJsaWMgU2VsZWN0TXVsdGlGaWxlUGFnZSgKLSAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoLAotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpIHsKLSAgICBzdXBlcigiU2VsZWN0TXVsdGlGaWxlUGFnZSIpOwotICAgIHRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIHRoaXMuaXNGaWxlTWFuZGF0b3J5ID0gaXNGaWxlTWFuZGF0b3J5OwotICAgIHRoaXMud29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgdGhpcy5maWxlTmFtZXMgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgCi0gICAgQ29tcG9zaXRlIHBhZ2VDb250ZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIHBhZ2VDb250ZW50LnNldExheW91dChsYXlvdXQpOwotICAgIHBhZ2VDb250ZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgLy8gdmFyaWFibGUgbmV2ZXIgdXNlZCAuLi4gaXMgcGFnZUNvbnRlbnQuZ2V0TGF5b3V0RGF0YSgpIG5lZWRlZD8KLSAgICAvL0dyaWREYXRhIG91dGVyRnJhbWVHcmlkRGF0YSA9IChHcmlkRGF0YSkgCi0gICAgcGFnZUNvbnRlbnQuZ2V0TGF5b3V0RGF0YSgpOwotICAgIAotICAgIC8vCQlvdXRlckZyYW1lR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsKLSAgICAvLwkJb3V0ZXJGcmFtZUdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTDsKLQotICAgIC8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLSAgICAvLyAgICAgICAgcGFnZUNvbnRlbnQsCi0gICAgLy8gICAgICAgIEIyQkdVSUNvbnRleHRJZHMuQlRCR19TRUxFQ1RfTVVMVElfRklMRV9QQUdFKTsKLQotICAgIGNyZWF0ZUxhYmVscyhwYWdlQ29udGVudCk7Ci0gICAgY3JlYXRlU291cmNlVmlld2VyKHBhZ2VDb250ZW50KTsKLSAgICBjcmVhdGVCdXR0b25QYW5lbChwYWdlQ29udGVudCk7Ci0gICAgY3JlYXRlU2VsZWN0ZWRMaXN0Qm94KHBhZ2VDb250ZW50KTsKLSAgICBjcmVhdGVJbXBvcnRCdXR0b24ocGFnZUNvbnRlbnQpOwotCi0gICAgc2V0Q29udHJvbChwYWdlQ29udGVudCk7Ci0gICAgaWYgKGlzRmlsZU1hbmRhdG9yeSkKLSAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0KLSAgfQotCi0gIHB1YmxpYyBJRmlsZVtdIGdldEZpbGVzKCkgewotICAgIHJldHVybiBmaWxlTmFtZXM7Ci0gIH0KLQotICAvLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYWxsb3dzIGZpbHRlcmluZyBvZiB0aGUgZ2l2ZW4gZmlsZQotICAvLyBleGVuc2lvbnMuIEl0IGludGVybmFsbHkgY3JlYXRlcyBhIFJlc291cmNlRmlsdGVyIHNvIHRoYXQgdXNlcnMgb2YgdGhpcwotICAvLyBjbGFzcyBkb24ndCBoYXZlIHRvIGNvbnN0cnVjdCBvbmUuCi0gIC8vIElmIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGRvbid0IGhhdmUgJy4nLCBvbmUgd2lsbCBiZSBhZGRlZC4KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKSB7Ci0gICAgLy8gRmlyc3QgYWRkIHRoZSAnLicgdG8gdGhlIGZpbHRlckV4dGVuc2lvbnMgaWYgdGhleSBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0gICAgU3RyaW5nW10gY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucyA9Ci0gICAgICBuZXcgU3RyaW5nW2ZpbHRlckV4dGVuc2lvbnMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgIC8vIElmIHRoZSBleHRlbnNpb24gZG9lc24ndCBzdGFydCB3aXRoIGEgJy4nLCB0aGVuIGFkZCBvbmUuCi0gICAgICBpZiAoZmlsdGVyRXh0ZW5zaW9uc1tpXS5zdGFydHNXaXRoKCIuIikpCi0gICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgICAgZWxzZQotICAgICAgICBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gIi4iICsgZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLSAgICB9Ci0KLSAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyID0KLSAgICAgIG5ldyBSZXNvdXJjZUZpbHRlcihjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zLCBudWxsKTsKLSAgICBhZGRGaWx0ZXIoZmlsdGVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRTb3VyY2VGaWxlVmlld2VyU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgIGlmICh2aXNpYmxlID09IHRydWUpIHsKLSAgICAgIGlmIChmRmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIucmVzZXRGaWx0ZXJzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGZGaWx0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICBzb3VyY2VGaWxlVmlld2VyLmFkZEZpbHRlcigoVmlld2VyRmlsdGVyKSBpLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICBzb3VyY2VGaWxlVmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgIH0KLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RmlsZXMoU3RyaW5nW10gZmlsZU5hbWVzKSB7Ci0gICAgaW50IHNpemUgPSBBcnJheXMuYXNMaXN0KGZpbGVOYW1lcykuc2l6ZSgpOwotICAgIFZlY3RvciBpRmlsZU5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoZmlsZU5hbWVzW2ldKTsKLSAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgICBpRmlsZU5hbWVzLmFkZEVsZW1lbnQocmVzb3VyY2UpOwotICAgIH0KLSAgICBJRmlsZVtdIGR1bW15QXJyYXkgPSBuZXcgSUZpbGVbaUZpbGVOYW1lcy5zaXplKCldOwotICAgIHRoaXMuZmlsZU5hbWVzID0gKElGaWxlW10pIChpRmlsZU5hbWVzLnRvQXJyYXkoZHVtbXlBcnJheSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzZXRGaWx0ZXJzKCkgewotICAgIGZGaWx0ZXJzID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlcihWaWV3ZXJGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgaWYgKGZGaWx0ZXJzID09IG51bGwpCi0gICAgICBmRmlsdGVycyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmRmlsdGVycy5hZGQoZmlsdGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFkZEJ1dHRvbkVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKLSAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVtb3ZlQnV0dG9uRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlTGFiZWxzKENvbXBvc2l0ZSBwYWdlQ29udGVudCkgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhZ2VDb250ZW50LCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU09VUkNFX0ZJTEVTKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChwYWdlQ29udGVudCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1NFTEVDVEVEX0ZJTEVTKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNoZWNrSWZGaWxlSW5UYXJnZXQoSUZpbGUgZmlsZVRvQ2hlY2spIHsKLSAgICBTdHJpbmdbXSBzdHJpbmdzID0gc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1zKCk7Ci0gICAgaW50IHNpemUgPSBzZWxlY3RlZExpc3RCb3guZ2V0SXRlbUNvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIGlmIChzdHJpbmdzW2ldLmNvbXBhcmVUbyhmaWxlVG9DaGVjay5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpCi0gICAgICAgICAgPT0gMCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIHNvdXJjZUZpbGVWaWV3ZXIgPQotICAgICAgbmV3IFRyZWVWaWV3ZXIoCi0gICAgICAgICAgbmV3IFRyZWUoCi0gICAgICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICAgICAgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUikpOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIKLSAgICAuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgamF2YS51dGlsLkxpc3QgbGlzdDsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgYm9vbGVhbiBuZXdGaWxlc1NlbGVjdGVkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgbGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9MaXN0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgaWYgKGNoZWNrSWZGaWxlSW5UYXJnZXQoKElGaWxlKSByZXNvdXJjZSkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgbmV3RmlsZXNTZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHNldEFkZEJ1dHRvbkVuYWJsZWQobmV3RmlsZXNTZWxlY3RlZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotICAgICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBhZGRTZWxlY3RlZEZpbGVzVG9UYXJnZXRMaXN0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBDb250cm9sIHRyZWVXaWRnZXQgPSBzb3VyY2VGaWxlVmlld2VyLmdldFRyZWUoKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLndpZHRoSGludCA9IFNJWklOR19MSVNUU19XSURUSDsKLSAgICBnZC5oZWlnaHRIaW50ID0gU0laSU5HX0xJU1RTX0hFSUdIVDsKLSAgICB0cmVlV2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvblBhbmVsKENvbXBvc2l0ZSBwYWdlQ29udGVudCkgewotICAgIENvbXBvc2l0ZSBidXR0b25QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFnZUNvbnRlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGJ1dHRvblBhbmVsLnNldExheW91dChsYXlvdXQpOwotICAgIAotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGJ1dHRvblBhbmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYW5lbCwgU1dULlBVU0gpOwotICAgIGFkZEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9BRERfQlVUVE9OKTsKLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IEJ1dHRvblNlbGVjdExpc3RlbmVyKCkpOwotICAgIGFkZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfQUREX0JVVFRPTl9UT09MX1RJUCk7Ci0gICAgYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYW5lbCwgU1dULlBVU0gpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9SRU1PVkVfQlVUVE9OKTsKLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IEJ1dHRvblNlbGVjdExpc3RlbmVyKCkpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfUkVNT1ZFX0JVVFRPTl9UT09MX1RJUCk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgcmVtb3ZlQWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYW5lbCwgU1dULlBVU0gpOwotICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9SRU1PVkVfQUxMX0JVVFRPTik7Ci0gICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICByZW1vdmVBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgcmVtb3ZlQWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBCdXR0b25TZWxlY3RMaXN0ZW5lcigpKTsKLSAgICByZW1vdmVBbGxCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX1JFTU9WRV9BTExfQlVUVE9OX1RPT0xfVElQKTsKLSAgICByZW1vdmVBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlU2VsZWN0ZWRMaXN0Qm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICBzZWxlY3RlZExpc3RCb3ggPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotICAgIHNlbGVjdGVkTGlzdEJveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgCi0gICAgICAgIGlmIChzZWxlY3RlZExpc3RCb3guZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApCi0gICAgICAgICAgc2V0UmVtb3ZlQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHNldFJlbW92ZUJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLndpZHRoSGludCA9IFNJWklOR19MSVNUU19XSURUSDsKLSAgICBnZC5oZWlnaHRIaW50ID0gU0laSU5HX0xJU1RTX0hFSUdIVDsKLSAgICBzZWxlY3RlZExpc3RCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gIH0KLQotICB2b2lkIGNyZWF0ZUltcG9ydEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgaW1wb3J0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICBpbXBvcnRCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfSU1QT1JUX0JVVFRPTik7Ci0gICAgCi0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGltcG9ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBpbXBvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICBGaWxlU3lzdGVtSW1wb3J0V2l6YXJkIGltcG9ydFdpemFyZCA9Ci0gICAgICAgICAgbmV3IEZpbGVTeXN0ZW1JbXBvcnRXaXphcmQoKTsKLSAgICAgICAgaW1wb3J0V2l6YXJkLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24pOwotICAgICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPQotICAgICAgICAgIG5ldyBXaXphcmREaWFsb2coc2hlbGwsIGltcG9ydFdpemFyZCk7Ci0gICAgICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgaW1wb3J0QnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGVkRmlsZXNUb1RhcmdldExpc3QoKSB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzb3VyY2VGaWxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0gICAgaWYgKGlzVmFsaWRTb3VyY2VGaWxlVmlld2VyU2VsZWN0aW9uKHNlbGVjdGlvbikpIHsKLSAgICAgIGphdmEudXRpbC5MaXN0IGxpc3QgPSBudWxsOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgIGxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotCi0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdHMgaW4gdGhlIGxpc3QuIERvbid0IGFkZCBpdCBpZiBpdCBpcy4KLSAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSA9Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRMaXN0Qm94LmluZGV4T2YocmVzb3VyY2VOYW1lKSA9PSAtMSkKLSAgICAgICAgICAgICAgICBzZWxlY3RlZExpc3RCb3guYWRkKHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHNldEZpbGVzKHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldEFkZEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIGlmIChzZWxlY3RlZExpc3RCb3guZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgcmVtb3ZlQWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgaWYgKGlzRmlsZU1hbmRhdG9yeSkKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICBpZiAoc2VsZWN0ZWRMaXN0Qm94LmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKQotICAgICAgICAgICAgc2V0UmVtb3ZlQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZXRSZW1vdmVCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGNsYXNzIEJ1dHRvblNlbGVjdExpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbikgewotICAgICAgICBhZGRTZWxlY3RlZEZpbGVzVG9UYXJnZXRMaXN0KCk7Ci0gICAgICB9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHJlbW92ZUJ1dHRvbikgewotICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gc2VsZWN0ZWRMaXN0Qm94LmdldFNlbGVjdGlvbigpOwotICAgICAgICBpbnQgc2l6ZSA9IHNlbGVjdGVkTGlzdEJveC5nZXRTZWxlY3Rpb25Db3VudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgIHNlbGVjdGVkTGlzdEJveC5yZW1vdmUoc3RyaW5nc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBpZiAoc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1Db3VudCgpID09IDApIHsKLSAgICAgICAgICByZW1vdmVBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgaWYgKGlzRmlsZU1hbmRhdG9yeSkKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0RmlsZXMoc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1zKCkpOwotICAgICAgfSBlbHNlIGlmIChlLndpZGdldCA9PSByZW1vdmVBbGxCdXR0b24pIHsKLSAgICAgICAgc2VsZWN0ZWRMaXN0Qm94LnJlbW92ZUFsbCgpOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgaWYgKGlzRmlsZU1hbmRhdG9yeSkKLSAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICBzZXRGaWxlcyhzZWxlY3RlZExpc3RCb3guZ2V0SXRlbXMoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0U2luZ2xlRmlsZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZjI5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0U2luZ2xlRmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0gIHByb3RlY3RlZCBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLSAgcHJvdGVjdGVkIFNlbGVjdFNpbmdsZUZpbGVWaWV3IHNlbGVjdFNpbmdsZUZpbGVWaWV3OwotICAKLSAgLy8gcGFyYW1ldGVyIGlzRmlsZU1hbmRhdG9yeSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGZpbGUgbXVzdCBiZSBzZWxlY3RlZCAgCi0gIC8vIGJlZm9yZSBiZWluZyBhYmxlIHRvIHByb2NlZWQgdG8gdGhlIG5leHQgcGFnZQotICBwdWJsaWMgU2VsZWN0U2luZ2xlRmlsZVBhZ2UoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpCi0gIHsKLSAgICBzdXBlcigiU2VsZWN0U2luZ2xlRmlsZVBhZ2UiKTsKLSAgICB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsgICAgICAgICAgIAotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3ID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVWaWV3KHNlbGVjdGlvbiwgaXNGaWxlTWFuZGF0b3J5KTsgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkKLSAgewotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldFZpc2libGVIZWxwZXIodmlzaWJsZSk7Ci0gICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xDb21wbGV0ZShib29sZWFuIGlzQ29tcGxldGUpCi0gICAgICB7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShpc0NvbXBsZXRlKTsKLSAgICAgIH0KLSAgICB9OwotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICBDb250cm9sIGNvbnRyb2wgPSBzZWxlY3RTaW5nbGVGaWxlVmlldy5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0vLyAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29udHJvbCwgQjJCR1VJQ29udGV4dElkcy5CVEJHX1NFTEVDVF9TSU5HTEVfRklMRV9QQUdFKTsKLSAgICBzZXRDb250cm9sKGNvbnRyb2wpOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoVmlld2VyRmlsdGVyIGZpbHRlcikgCi0gIHsgCi0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyKGZpbHRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpCi0gIHsgCi0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLSAgfSAgICAgCi0KLSAgcHVibGljIHZvaWQgcmVzZXRGaWx0ZXJzKCkKLSAgeyAgICAKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5yZXNldEZpbHRlcnMoKTsKLSAgfQotICAKLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7ICAKLSAgICByZXR1cm4gc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNlbGVjdFNpbmdsZUZpbGVWaWV3LgotICAgKiBAcmV0dXJuIFNlbGVjdFNpbmdsZUZpbGVWaWV3Ci0gICAqLwotICBwdWJsaWMgVHJlZVZpZXdlciBnZXRTb3VyY2VGaWxlVmlld2VyKCkgewotICAgIHJldHVybiBzZWxlY3RTaW5nbGVGaWxlVmlldy5zb3VyY2VGaWxlVmlld2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNlbGVjdFNpbmdsZUZpbGVWaWV3LgotICAgKiBAcmV0dXJuIFNlbGVjdFNpbmdsZUZpbGVWaWV3Ci0gICAqLwotICBwdWJsaWMgU2VsZWN0U2luZ2xlRmlsZVZpZXcgZ2V0U2VsZWN0U2luZ2xlRmlsZVZpZXcoKSB7Ci0gICAgcmV0dXJuIHNlbGVjdFNpbmdsZUZpbGVWaWV3OwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlVmlldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0U2luZ2xlRmlsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MzNjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuRmlsZVN5c3RlbUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuVUlQbHVnaW47Ci0KLSAgICAKLQotcHVibGljIGNsYXNzIFNlbGVjdFNpbmdsZUZpbGVWaWV3Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSAgICAgICAgICAgIGNvbXBvc2l0ZTsKLSAgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gICAgICAgICAgICAgIGlzRmlsZU1hbmRhdG9yeTsKLSAgcHJvdGVjdGVkIFRyZWVWaWV3ZXIgICAgICAgICAgIHNvdXJjZUZpbGVWaWV3ZXI7Ci0gIHByb3RlY3RlZCBCdXR0b24gICAgICAgICAgICAgICBpbXBvcnRCdXR0b247Ci0gIHByb3RlY3RlZCBWZWN0b3IgICAgICAgICAgICAgICBmRmlsdGVyczsKLSAgcHJvdGVjdGVkIElGaWxlICAgICAgICAgICAgICAgIHNlbGVjdGVkRmlsZTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gICAgICAgICAgIGRlZmF1bHRTZWxlY3Rpb247ICAKLSAgcHJvdGVjdGVkIExpc3RlbmVyICAgICAgICAgICAgIGxpc3RlbmVyOwotICAKLSAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xDb21wbGV0ZShib29sZWFuIGlzQ29tcGxldGUpOyAKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3RTaW5nbGVGaWxlVmlldyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5KQotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIHRoaXMuaXNGaWxlTWFuZGF0b3J5ID0gaXNGaWxlTWFuZGF0b3J5OwotICAgIHRoaXMuc2VsZWN0ZWRGaWxlPSBudWxsOwotICAgIHRoaXMuZGVmYXVsdFNlbGVjdGlvbiA9IG51bGw7ICAgICAgCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAgICAgICAgICAgICAgCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICBDb21wb3NpdGUgc21hbGxDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHNtYWxsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIHNtYWxsQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzbWFsbENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1NPVVJDRV9GSUxFUyk7CQotCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HLCBHcmlkRGF0YS5FTkQsIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgLy9Db2xsYXBzZSBhbmQgRXhwYW5kIGFsbCBidXR0b25zCi0gICAgVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoc21hbGxDb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICB0b29sQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuRU5ELCB0cnVlLCBmYWxzZSkpOwotICAgIAotICAgIFRvb2xJdGVtIHRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5OT05FKTsKLSAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXhwYW5kQWxsLmdpZiIpOwotICAgIEltYWdlIGltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgdG9vbEl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotICAgIHRvb2xJdGVtLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9QT1BVUF9FWFBBTkRfQUxMKTsKLSAgICB0b29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLSAgICAJCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCXNvdXJjZUZpbGVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQotCX19KTsKLSAgICAKLSAgICAKLSAgICB0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuTk9ORSk7Ci0gICAgaW1hZ2VEZXNjcmlwdG9yID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvY29sbGFwc2VBbGwuZ2lmIik7Ci0gICAgaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICB0b29sSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0gICAgdG9vbEl0ZW0uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX1BPUFVQX0NPTExBUFNFX0FMTCk7Ci0gICAgdG9vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJc291cmNlRmlsZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCQkKLQl9fSk7Ci0KLSAgICBjcmVhdGVTb3VyY2VWaWV3ZXIoY29tcG9zaXRlKTsKLSAgICBjcmVhdGVGaWx0ZXJDb250cm9sKGNvbXBvc2l0ZSk7ICAgCi0gICAgY3JlYXRlSW1wb3J0QnV0dG9uKGNvbXBvc2l0ZSk7ICAKLSAgICBzb3VyY2VGaWxlVmlld2VyLmdldFRyZWUoKS5zZXRGb2N1cygpOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgCi0gIHsJCi0gIH0gCi0KLXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHNvdXJjZUZpbGVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihuZXcgVHJlZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSAKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgCi0gICAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaXNDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgIGphdmEudXRpbC5MaXN0IGxpc3Q7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZWxlY3RlZEZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotICAgICAgICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KSAKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaXNDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZWxlY3RlZEZpbGUgPSBudWxsOwotICAgICAgICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KSAKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlzQ29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgICBsaXN0ZW5lci5zZXRDb250cm9sQ29tcGxldGUoaXNDb21wbGV0ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9CQotICAgIH0pOwotICAgIENvbnRyb2wgdHJlZVdpZGdldCA9IHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgdHJlZVdpZGdldC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgfQotICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlSW1wb3J0QnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAKLSAgICBpbXBvcnRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGltcG9ydEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9JTVBPUlRfQlVUVE9OKTsKLSAgICAKLSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOyAgICAKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGltcG9ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBpbXBvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBUaGlzIGxpc3RlbmVyIGlzIGlmIHRoZSBJbXBvcnQgV2l6YXJkIGFkZHMgYSBuZXcgZmV3LCB3ZSB3YW50Ci0gICAgICAgIC8vIGl0IHRvIGJlIHNlbGVjdGVkIHdoZW4gd2UgY29tZSBiYWNrIGZyb20gaXQKLSAgICAgICAgSW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lciBpbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyPSBuZXcgSW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lcigpOwotICAgICAgICAKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoaW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lcik7Ci0gICAgICAgICAgCi0gICAgICAgIEZpbGVTeXN0ZW1JbXBvcnRXaXphcmQgaW1wb3J0V2l6YXJkID0gbmV3IEZpbGVTeXN0ZW1JbXBvcnRXaXphcmQoKTsKLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc291cmNlRmlsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaW1wb3J0V2l6YXJkLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24gIT0gbnVsbCA/IHNlbGVjdGlvbiA6IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotICAgICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCBpbXBvcnRXaXphcmQpOwotICAgICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIHdpemFyZERpYWxvZy5vcGVuKCk7Ci0gICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihpbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKTsKLSAgICAgICAgSUZpbGUgaW1wb3J0ZWRGaWxlID0gaW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lci5nZXRJbXBvcnRlZEZpbGUoKTsKLSAgICAgICAgaWYgKGltcG9ydGVkRmlsZSAhPSBudWxsKSAKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbXBvcnRlZEZpbGUpOwotICAgICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7ICAgICAgICAgICAgICAgICAgCi0gICAgaW1wb3J0QnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQKTsKLSAgfSAKLQotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWRGaWxlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHRoaXMuZGVmYXVsdFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCByZXNldEZpbHRlcnMoKQotICB7Ci0gICAgZkZpbHRlcnM9bnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlcihWaWV3ZXJGaWx0ZXIgZmlsdGVyKSAKLSAgewotICAgIGlmIChmRmlsdGVycyA9PSBudWxsKQotICAgIHsKLSAgICAgIGZGaWx0ZXJzPSBuZXcgVmVjdG9yKCk7Ci0gICAgfQotICAgIGZGaWx0ZXJzLmFkZChmaWx0ZXIpOwotICB9Ci0KLSAgLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGFsbG93cyBmaWx0ZXJpbmcgb2YgdGhlIGdpdmVuIGZpbGUKLSAgLy8gZXhlbnNpb25zLiBJdCBpbnRlcm5hbGx5IGNyZWF0ZXMgYSBSZXNvdXJjZUZpbHRlciBzbyB0aGF0IHVzZXJzIG9mIHRoaXMKLSAgLy8gY2xhc3MgZG9uJ3QgaGF2ZSB0byBjb25zdHJ1Y3Qgb25lLgotICAvLyBJZiB0aGUgZXh0ZW5zaW9ucyBwcm92aWRlZCBkb24ndCBoYXZlICcuJywgb25lIHdpbGwgYmUgYWRkZWQuCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykKLSAgewotICAgIC8vIEZpcnN0IGFkZCB0aGUgJy4nIHRvIHRoZSBmaWx0ZXJFeHRlbnNpb25zIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZQotICAgIFN0cmluZ1tdIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW2ZpbHRlckV4dGVuc2lvbnMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpPTA7IGkgPCBmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSAKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgZXh0ZW5zaW9uIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhICcuJywgdGhlbiBhZGQgb25lLgotICAgICAgaWYgKGZpbHRlckV4dGVuc2lvbnNbaV0uc3RhcnRzV2l0aCgiLiIpKQotICAgICAgewotICAgICAgICBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9ICIuIiArIGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zLCBudWxsKTsKLSAgICBhZGRGaWx0ZXIoZmlsdGVyKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotCi0vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYWxsb3dzIGZpbHRlcmluZyBvZiB0aGUgZ2l2ZW4gZmlsZQotLy8gZXhlbnNpb25zLiBJdCBpbnRlcm5hbGx5IGNyZWF0ZXMgYSBSZXNvdXJjZUZpbHRlciBzbyB0aGF0IHVzZXJzIG9mIHRoaXMKLS8vIGNsYXNzIGRvbid0IGhhdmUgdG8gY29uc3RydWN0IG9uZS4KLS8vIElmIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGRvbid0IGhhdmUgJy4nLCBvbmUgd2lsbCBiZSBhZGRlZC4KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zLCBJRmlsZSBbXSBleGNsdWRlZEZpbGVzKQotICB7Ci0gICAgLy8gRmlyc3QgYWRkIHRoZSAnLicgdG8gdGhlIGZpbHRlckV4dGVuc2lvbnMgaWYgdGhleSBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0gICAgU3RyaW5nW10gY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmdbZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGk9MDsgaSA8IGZpbHRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgLy8gSWYgdGhlIGV4dGVuc2lvbiBkb2Vzbid0IHN0YXJ0IHdpdGggYSAnLicsIHRoZW4gYWRkIG9uZS4KLSAgICAgIGlmIChmaWx0ZXJFeHRlbnNpb25zW2ldLnN0YXJ0c1dpdGgoIi4iKSkKLSAgICAgIHsKLSAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9IGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSAiLiIgKyBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgICAgfQotICAgIH0KLSAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyOwotICAgIGlmIChleGNsdWRlZEZpbGVzICE9IG51bGwpCi0gICAgewotICAgICAgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIGV4Y2x1ZGVkRmlsZXMsIG51bGwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIG51bGwpOwotICAgIH0KLSAgICBhZGRGaWx0ZXIoZmlsdGVyKTsKLSAgfQotICAKLSAgLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGFsbG93cyBmaWx0ZXJpbmcgb2YgdGhlIGdpdmVuIGZpbGUKLSAgLy8gZXhlbnNpb25zLiBJdCBpbnRlcm5hbGx5IGNyZWF0ZXMgYSBSZXNvdXJjZUZpbHRlciBzbyB0aGF0IHVzZXJzIG9mIHRoaXMKLSAgLy8gY2xhc3MgZG9uJ3QgaGF2ZSB0byBjb25zdHJ1Y3Qgb25lLgotICAvLyBJZiB0aGUgZXh0ZW5zaW9ucyBwcm92aWRlZCBkb24ndCBoYXZlICcuJywgb25lIHdpbGwgYmUgYWRkZWQuCi0gIHB1YmxpYyB2b2lkIHNldEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykKLSAgewotCS8vIEZpcnN0IGFkZCB0aGUgJy4nIHRvIHRoZSBmaWx0ZXJFeHRlbnNpb25zIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZQotCVN0cmluZ1tdIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW2ZpbHRlckV4dGVuc2lvbnMubGVuZ3RoXTsKLQlmb3IgKGludCBpPTA7IGkgPCBmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSAKLQl7CQkKLQkgIC8vIElmIHRoZSBleHRlbnNpb24gZG9lc24ndCBzdGFydCB3aXRoIGEgJy4nLCB0aGVuIGFkZCBvbmUuCi0JICBpZiAoZmlsdGVyRXh0ZW5zaW9uc1tpXS5zdGFydHNXaXRoKCIuIikpCi0JICB7Ci0JCWNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSBmaWx0ZXJFeHRlbnNpb25zW2ldOwotCSAgfQotCSAgZWxzZQotCSAgewotCQljb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gIi4iICsgZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLQkgIH0KLQl9Ci0JVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zLCBudWxsKTsKLSAgICBmRmlsdGVycz0gbmV3IFZlY3RvcigpOwotCWZGaWx0ZXJzLmFkZChmaWx0ZXIpOwotCWlmIChzb3VyY2VGaWxlVmlld2VyICE9IG51bGwpCi0JewkKLQkgIHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpLnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICBzb3VyY2VGaWxlVmlld2VyLnJlc2V0RmlsdGVycygpOwotICAgICAgZm9yIChJdGVyYXRvciBpPWZGaWx0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsgICAgIAotCSAgICBzb3VyY2VGaWxlVmlld2VyLmFkZEZpbHRlcigoVmlld2VyRmlsdGVyKWkubmV4dCgpKTsKLSAJICB9Ci0JICBzb3VyY2VGaWxlVmlld2VyLmdldFRyZWUoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JICBzb3VyY2VGaWxlVmlld2VyLmdldFRyZWUoKS5yZWRyYXcoKTsKLQl9CQotICB9ICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGEgV2l6YXJkIHBhZ2Ugb3IgRGlhbG9nIHdoZW4gaXQgYmVjb21lcyB2aXNpYmxlCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiB2aXNpYmxlKQotICB7ICAgIAotICAgIGlmICh2aXNpYmxlID09IHRydWUpIAotICAgIHsKLSAgICAgIGlmIChmRmlsdGVycyAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5yZXNldEZpbHRlcnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpPWZGaWx0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgCi0gICAgICAgCSAgc291cmNlRmlsZVZpZXdlci5hZGRGaWx0ZXIoKFZpZXdlckZpbHRlcilpLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICBzb3VyY2VGaWxlVmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgc291cmNlRmlsZVZpZXdlci5leHBhbmRUb0xldmVsKDEpOwotCi0gICAgICBpZiAoZGVmYXVsdFNlbGVjdGlvbiAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5zZXRTZWxlY3Rpb24oZGVmYXVsdFNlbGVjdGlvbiwgdHJ1ZSk7ICAgICAgICAKLSAgICAgIH0gICAKLSAgICAgIGVsc2UgaWYgKCFzb3VyY2VGaWxlVmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLSAgICAgIHsgICAgIAotICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnNldFNlbGVjdGlvbihzb3VyY2VGaWxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5ICYmIGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgIGxpc3RlbmVyLnNldENvbnRyb2xDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotICAKLSAgY2xhc3MgSW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IKLSAgewotCVZlY3RvciBpbXBvcnRlZEZpbGVzOwotCi0JSW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lcigpCi0JewotCSAgaW1wb3J0ZWRGaWxlcyA9IG5ldyBWZWN0b3IoKTsgCi0JfQotICAKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpCi0JewotCSAgSVJlc291cmNlRGVsdGEgcmVzb3VyY2VEZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0gICAgCi0JICB0cnkKLQkgIHsKLQkJaWYgKHJlc291cmNlRGVsdGEgIT0gbnVsbCkgCi0JCXsKLQkJICByZXNvdXJjZURlbHRhLmFjY2VwdCh0aGlzKTsKLQkJfQotCSAgfQotCSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCSAgewotCQkvL1RPRE8uLi4gbG9nIGV4Y2VwdGlvbgotCQkvL1VJUGx1Z2luLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJFeGNlcHRpb24gY2F1Z2h0IGR1cmluZyByZXNvdXJjZSBjaGFuZ2UiICsgZSk7Ci0JCS8vVUlQbHVnaW4uZ2V0TXNnTG9nZ2VyKCkud3JpdGVDdXJyZW50VGhyZWFkKCk7IAotCSAgfSAgICAgIAotCX0KLQotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKQotCXsKLQkgIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQpCi0JICB7Ci0JCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSUZpbGUpIAotCQkgIGltcG9ydGVkRmlsZXMuYWRkKGRlbHRhLmdldFJlc291cmNlKCkpOwotCSAgfQotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0SW1wb3J0ZWRGaWxlcygpCi0JewotCSAgcmV0dXJuIGltcG9ydGVkRmlsZXM7Ci0JfQotICAgIAotCS8vIFRoaXMgcmV0dXJucyB0aGUgZmlyc3QgaW1wb3J0ZWQgZmlsZSBpbiB0aGUgbGlzdCBvZiBpbXBvcnRlZCBmaWxlcwotCXB1YmxpYyBJRmlsZSBnZXRJbXBvcnRlZEZpbGUoKQotCXsKLQkgIGlmIChpbXBvcnRlZEZpbGVzLmlzRW1wdHkoKSA9PSBmYWxzZSkgCi0JCXJldHVybiAoSUZpbGUpaW1wb3J0ZWRGaWxlcy5maXJzdEVsZW1lbnQoKTsKLSAgCi0JICByZXR1cm4gbnVsbDsKLQl9Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZFRyZWVMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHRyZWVMaXN0ZW5lcikgewotICAJc291cmNlRmlsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodHJlZUxpc3RlbmVyKTsKLSAgfQotfSAgICAgICAgICAgICAgCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1RhYmxlTmF2aWdhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9UYWJsZU5hdmlnYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDAzN2EwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1RhYmxlTmF2aWdhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVDdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLQotCi0gIC8qKgotICAgKiBBZGRzIGEgVGFibGVDdXJzb3IgdG8gYSBTdHJ1Y3R1cmVkVmlld2VyIC0gZm9yIGtleWJvYXJkIG5hdmlnYXRpb24gb2YgdGhlIHRhYmxlCi0gICAqIFRoZSBpbnRlbnQgb2YgdGhpcyBjbGFzcyBpcyB0byBwcm92aWRlIHRoZSBzdGFuZGFyZCBsaXN0ZW5lcnMgZm9yIHVzaW5nIEYyIHRvCi0gICAqIGFjdGl2YXRlIGNlbGwgZWRpdG9ycy4KLSAgICoKLSAgICogRHVlIHRvIGEgY3VycmVudCBidWcgaW4gdGhlIFRhYmxlQ3Vyc29yLCBUYWJsZVZpZXdlcnMgdXNpbmcgdGhpcyBjbGFzcyBtdXN0IG1ha2UKLSAgICogYSBjYWxsIHNpbWlsYXIgdG8gdGhlIFRhYmxlTmF2aWdhdG9yIG1ldGhvZCBtb3ZlQ2VsbEVkaXRvcnNBYm92ZShjZWxsRWRpdG9ycykKLSAgICogd2hlbmV2ZXIgYSBzZXRDZWxsRWRpdG9ycyBjYWxsIGlzIG1hZGUgaW4gdGhlIFN0cnVjdHVyZWRWaWV3ZXIuICBUaGlzIGlzIHNvIHRoYXQgdGhlCi0gICAqIGNlbGwgZWRpdG9yIGNvbnRyb2wgc2hvd3MgdXAgYWJvdmUgdGhlIHRhYmxlIGN1cnNvciBjb250cm9sLgotICAgKi8KLQotcHVibGljIGNsYXNzIFRhYmxlTmF2aWdhdG9yIGV4dGVuZHMgVGFibGVDdXJzb3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFVFJFRUlURU1fSUQgPSAiVGFibGVUcmVlSXRlbUlEIjsKLQotICAgZmluYWwgVGFibGUgdGFibGU7Ci0KLSAgIHB1YmxpYyBUYWJsZU5hdmlnYXRvcihUYWJsZSB0YWJsZSwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICB7Ci0gICAgICBzdXBlcih0YWJsZSwgU1dULk5PTkUpOwotICAgICAgdGhpcy50YWJsZSA9IHRhYmxlOwotICAgICAgZmluYWwgVGFibGUgY3VycmVudFRhYmxlID0gdGFibGU7Ci0gICAgICBmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHNWaWV3ZXIgPSB2aWV3ZXI7Ci0KLSAgICAgIC8vIExpbnV4IGluZGV4IG91dCBvZiBib3VuZHMgZml4LiAgU2VlIGRlZmVjdCAyNTM0MjksIDI1MzQzMywgYW5kIG1vcmUKLSAgICAgIHNldFZpc2libGUoZmFsc2UpOwotCi0gICAgICBhZGRQYWludExpc3RlbmVyKHZpZXdlcik7Ci0gICAgICBhZGRLZXlMaXN0ZW5lcnModmlld2VyKTsKLSAgICAgIGFkZE1vdXNlTGlzdGVuZXJzKHZpZXdlcik7Ci0gICAgICBhZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkgICAgIGlmIChzVmlld2VyIGluc3RhbmNlb2YgVGFibGVUcmVlVmlld2VyKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pZ2V0Um93KCkuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsKLSAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICBzVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotICAgICAgICAgICAgICAgICB9Ci0JCX0KLQotCi0gICAgICB9KTsKLSAgICAgIGFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpewotICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKQotICAgICAgICAgewotICAgICAgICAgCS8vIGlmIGUuc291cmNlIGlzIG5vdCBhIGNoaWxkIG9mIHRoZSB0YWJsZSB0aGVuIHNldCBzZWxlY3Rpb24gLSB0aGlzIGlzIGZvciB0YWIgaW50byB2aWV3ZXIKLSAgICAgICAgIAlPYmplY3QgZXZlbnRTb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotICAgICAgICAgCWlmIChldmVudFNvdXJjZSBpbnN0YW5jZW9mIENvbnRyb2wpCi0gICAgICAgICAJewotICAgICAgICAgCWlmICghaXNDaGlsZChjdXJyZW50VGFibGUsIChDb250cm9sKWV2ZW50U291cmNlKSkKLSAgICAgICAgIAl7Ci0gICAgICAgICAJICBpZiAoY3VycmVudFRhYmxlLmdldEl0ZW1Db3VudCgpID4gMCAmJiBjdXJyZW50VGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSA8PSAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIGlmIChzVmlld2VyIGluc3RhbmNlb2YgVGFibGVUcmVlVmlld2VyKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pZ2V0Um93KCkuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsKLSAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICBzVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgCSAgIGN1cnJlbnRUYWJsZS5zZXRTZWxlY3Rpb24oMCk7IAotICAgICAgICAgICAgICAgCSAgIHNldFNlbGVjdGlvbigwLDApOwotICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICAgCSAgICB9Ci0gICAgICAgCSAgICBlbHNlIAotICAgICAgIAkgICAgewotICAgICAgIAkgICAgICBpZiAoY3VycmVudFRhYmxlLmdldEl0ZW1zKCkubGVuZ3RoID4gMCkKLSAgICAgICAJICAgICAgewotICAgICAgIAkgICAgICAJIC8vIGN1cnNvciBjYW4gZW5kIHVwIG9uIGEgbm9uLWV4aXN0ZW50IHRhYmxlIHJvdyAKLSAgICAgICAJICAgICAgICAgLy8gICBjdXJyZW50bHkgbm8gd2F5IHRvIGdldCB0aGUgY3VycmVudCB0YWJsZSBjdXJzb3Igcm93IAotICAgICAgIAkgICAgICAJIC8vICAgc28gZm9yIG5vdyBqdXN0IGNhdGNoIHRoZSBleGNlcHRpb24gc2luY2UgaXQgZG9lc24ndAotICAgICAgIAkgICAgICAJIC8vICAgY2F1c2UgYW55IHNpZGUgZWZmZWN0cy4KLSAgICAgICAJICAgICAgCSB0cnkKLSAgICAgICAJICAgICAgCSB7Ci0gICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAJICAgICAgCSB9Ci0gICAgICAgCSAgICAgIAkgY2F0Y2ggKEV4Y2VwdGlvbiBlZSkKLSAgICAgICAJICAgICAgCSB7ICAgICAJICAgICAgICAgICAgCSAgICAgIAkKLSAgICAgICAJICAgICAgCQljdXJyZW50VGFibGUuc2V0U2VsZWN0aW9uKDApOyAgICAgICAJICAgICAgCQkgICAgICAgICAKLSAgICAgICAJICAgICAgCQlzZXRTZWxlY3Rpb24oMCwwKTsKLSAgICAgICAJICAgICAgCSB9Ci0gICAgICAgCSAgICAgICB9ICAgICAgIAkgICAgCi0gICAgICAgCSAgICAgICBlbHNlICAvLyBkbyBub3Qgc2hvdyB0YWJsZSBjdXJzb3IgaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIGluIHRoZSB0YWJsZSAtIGF2b2lkIHJlcGFpbnQKLSAgICAgICAJICAgICAgIHsKLSAgICAgICAJICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgCSAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgIAl9ICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NoaWxkKENvbnRyb2wgcGFyZW50LCBDb250cm9sIGNoaWxkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbnRyb2wgdGVtcENoaWxkID0gY2hpbGQ7Ci0gICAgICAgICAgICB3aGlsZSAodGVtcENoaWxkICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICh0ZW1wQ2hpbGQgPT0gcGFyZW50KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgdGVtcENoaWxkID0gdGVtcENoaWxkLmdldFBhcmVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyI2ZvY3VzTG9zdChGb2N1c0V2ZW50KQotICAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gU2V0IHRoZSB0YWJsZSBuYXZpZ2F0b3IgdG8gYmUgbm90IHZpc2libGUgaWYgdGhlIHRoZSB0YWJsZQotICAgICAgICAgICAgLy8gaXMgbm90IGluIGZvY3VzIGFuZCBhIGNoaWxkIG9mIHRoZSB0YWJsZSBpcyBub3QgaW4gZm9jdXMKLSAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBkbyB0aGlzIGFzeW5jaHJvbm91c2x5IHNvIHdlIGRvbid0IG1lc3MgdXAgdGhlCi0gICAgICAgICAgICAvLyBjdXJyZW50IGZvY3VzIGhhbmRsaW5nLgotICAgICAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICB7IAotICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRhYmxlICE9IG51bGwgJiYgIWN1cnJlbnRUYWJsZS5pc0Rpc3Bvc2VkKCkgJiYgIWN1cnJlbnRUYWJsZS5pc0ZvY3VzQ29udHJvbCgpICYmCi0gICAgICAgICAgICAgICAgICAgICFpc0NoaWxkKGN1cnJlbnRUYWJsZSwgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0Rm9jdXNDb250cm9sKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgfQotCi0gICAgICB9KTsgCi0gICAgICAKLSAgICAgCi0gICAgICAKLQotICAgICAgdGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyI2ZvY3VzR2FpbmVkKEZvY3VzRXZlbnQpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgbmF2aWdhdG9yIGlmIHRoZXJlIGFyZSBpdGVtcyBpbiB0aGUgdGFibGUgCi0gICAgICAgICAgLy8gYW5kIGlmIHRoZSBmb2N1cyB3YXNuJ3QgZ2FpbmVkIGZyb20gb3VyIG93biB0YWJsZSBuYXZpZ2F0b3IKLSAgICAgICAgICAvLyAoaWUgZm9jdXMgY2FtZSBmcm9tIG91dHNpZGUpCi0gICAgICAgICAgaWYgKGN1cnJlbnRUYWJsZS5nZXRJdGVtQ291bnQoKSA+IDAgJiYKLSAgICAgICAgICAgICAgKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEZvY3VzQ29udHJvbCgpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICFEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRGb2N1c0NvbnRyb2woKS5lcXVhbHMoVGFibGVOYXZpZ2F0b3IudGhpcykpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGRvIHRoaXMgYXN5bmNocm9ub3VzbHkgc28gd2UgZG9uJ3QgbWVzcyB1cCB0aGUKLSAgICAgICAgICAgIC8vIGN1cnJlbnQgZm9jdXMgaGFuZGxpbmcuCi0gICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgICAgICAgICAgICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1Zpc2libGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXMoKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25zIGhlcmUgLSBpbmRleCBvdXQgb2YgYm91bmRzIG9uIHRhYmxldmlld2VyCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUYWJsZS5nZXRJdGVtQ291bnQoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWJsZS5zZXRTZWxlY3Rpb24oMCk7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKDAsMCk7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlICAvLyBkbyBub3Qgc2hvdyB0YWJsZSBjdXJzb3IgaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIGluIHRoZSB0YWJsZSAtIGF2b2lkIHJlcGFpbnQKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOyAgICAgICAgICAgCi0gICB9Ci0KLSAgIHB1YmxpYyBUYWJsZSBnZXRUYWJsZSgpCi0gICB7Ci0gICAgIHJldHVybiB0YWJsZTsKLSAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhaW50TGlzdGVuZXIoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAKLSAgICAgIGFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSAKLSAgICAgIHsKLSAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpCi0gICAgICAgICB7Ci0gICAgICAgICAJVGFibGVJdGVtW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBmaW5hbCBUYWJsZUl0ZW0gcm93ID0gKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgPyB0YWJsZS5nZXRJdGVtKHRhYmxlLmdldFRvcEluZGV4KCkpIDogc2VsZWN0aW9uWzBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNlbGxUZXh0ID0gcm93LmdldFRleHQoZ2V0Q29sdW1uKCkpOwotICAgICAgICAgICAgZmluYWwgSW1hZ2UgY2VsbEltYWdlID0gcm93LmdldEltYWdlKGdldENvbHVtbigpKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2wgPSBnZXRDb2x1bW4oKTsKLQotICAgICAgICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCFyb3cuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByb3cuZ2V0VGV4dChnZXRDb2x1bW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1RleHQuZXF1YWxzKGNlbGxUZXh0KSB8fCAhKHJvdy5nZXRJbWFnZShjb2wpID09IGNlbGxJbWFnZSkpIAotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgIH0KLSAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTZWxlY3Rpb25LZXlBZGFwdGVyIGdldEtleUFkYXB0ZXIoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAgICBpZiAoa2V5QWRhcHRlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uS2V5QWRhcHRlcih2aWV3ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgcmV0dXJuIGtleUFkYXB0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5QWRhcHRlcihTZWxlY3Rpb25LZXlBZGFwdGVyIGtBZGFwdGVyKQotICAgIHsKLSAgICAgICBrZXlBZGFwdGVyID0ga0FkYXB0ZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNlbGVjdGlvbktleUFkYXB0ZXIga2V5QWRhcHRlciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uS2V5QWRhcHRlciBleHRlbmRzIEtleUFkYXB0ZXIKLSAgICB7Ci0gICAgICAgU3RydWN0dXJlZFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyOwotCi0gICAgICAgcHVibGljIFNlbGVjdGlvbktleUFkYXB0ZXIoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICAgICAgewotICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVkVmlld2VyID0gdmlld2VyOwotICAgICAgIH0KLQotICAgICAgIGludCBsYXN0S2V5UHJlc3NlZCA9IC0xOyAgLy8gdXNlZCB0byBjYWNoZSB0aGUgbGFzdCBrZXkgZm9yIGtleSBjb21ib3MKLQotICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgCi0gICAgICAgeyAgICAgICAJCi0gICAgICAgICAgICAgICBUYWJsZUl0ZW0gcm93ID0gZ2V0Um93KCk7Ci0gICAgICAgICAgICAgICBpbnQgY29sdW1uID0gZ2V0Q29sdW1uKCk7ICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAvLyBoYWNrIHRvIGVtdWxhdGUgU0hJRlQrRjEwIHBvcHVwIG1lbnUgLSBvdGhlcndpc2UgdGFibGUgY3Vyc29yCi0gICAgICAgICAgICAgICAvLyAgIG9ic2N1cmVzIHRoZSB0YWJsZSBwb3B1cCBtZWNoYW5pc20gYW5kIGl0IGRvZXNuJ3Qgd29yay4KLSAgICAgICAgICAgICAgIGlmIChsYXN0S2V5UHJlc3NlZCA9PSBTV1QuU0hJRlQgJiYgZS5rZXlDb2RlID09IFNXVC5GMTApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBNZW51IHBvcHVwID0gZ2V0VGFibGUoKS5nZXRNZW51KCk7Ci0gICAgICAgICAgICAgICAgICBwb3B1cC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgbGFzdEtleVByZXNzZWQgPSBlLmtleUNvZGU7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIC8vanZoIC0gbG9vayBmb3IgKyBvciAtIGtleQotICAgICAgICAgICAgICAgLy8gY29sdW1uID09IDAKLSAgICAgICAgICAgICAgIGlmIChyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKSBpbnN0YW5jZW9mIFRhYmxlVHJlZUl0ZW0pCi0gICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA9PSAwICYmIGUuY2hhcmFjdGVyID09ICcrJykgCi0JICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgCSAgCSAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pcm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCk7CSAgICAgICAgICAgICAgIAkKLQkgICAgICAgICAgICAgICAJICAoKFRhYmxlVHJlZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5zZXRFeHBhbmRlZFN0YXRlKHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpLCB0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAgICAgICAgICAgIAkgIHJlZnJlc2goKTsKLQkgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uID09IDAgJiYgZS5jaGFyYWN0ZXIgPT0gJy0nKSAKLQkgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgCSAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pcm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCk7CSAgICAgICAgICAgICAgIAkKLQkgICAgICAgICAgICAgICAJICAoKFRhYmxlVHJlZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5zZXRFeHBhbmRlZFN0YXRlKHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpLCBmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoKCk7Ci0JICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgLy8gdXNlIEYyIHRvIGludm9rZSBlZGl0aW5nIGZvciBhIGNlbGwKLSAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gU1dULkYyKSAgICAgCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAJICBpZiAoc3RydWN0dXJlZFZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVmlld2VyKQotICAgICAgICAgICAgICAgCSAgewotICAgICAgICAgICAgICAgICAgICAoKFRhYmxlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLmVkaXRFbGVtZW50KHJvdy5nZXREYXRhKCksIGNvbHVtbik7ICAgCi0gICAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAJICBlbHNlIGlmIChzdHJ1Y3R1cmVkVmlld2VyIGluc3RhbmNlb2YgVGFibGVUcmVlVmlld2VyKQotICAgICAgICAgICAgICAgCSAgeyAgCi0gICAgICAgICAgICAgICAJICAJICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsKLSAgICAgICAgICAgICAgIAkgIAkgKChUYWJsZVRyZWVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuZWRpdEVsZW1lbnQodGFibGVUcmVlSXRlbS5nZXREYXRhKCksIGNvbHVtbik7ICAgCi0gICAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcnMoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAgZmluYWwgU3RydWN0dXJlZFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyID0gdmlld2VyOwotICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBhZGRLZXlMaXN0ZW5lcihnZXRLZXlBZGFwdGVyKHN0cnVjdHVyZWRWaWV3ZXIpKTsKLSAgICB9ICAgICAgCi0gICAgCi0gICBwdWJsaWMgdm9pZCBhZGRNb3VzZUxpc3RlbmVycyhTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgIHsKLSAgICAgIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgc3RydWN0dXJlZFZpZXdlciA9IHZpZXdlcjsKLQotICAgICAgYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkKLSAgICAgIHsKLQotICAgICAgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIAotICAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgICAgICBUYWJsZUl0ZW0gcm93ID0gZ2V0Um93KCk7Ci0gICAgICAgICAgICAgICBpbnQgY29sdW1uID0gZ2V0Q29sdW1uKCk7IAotICAgICAgICAgCi0gICAgICAgICAgICAgICAvLyB1c2UgbW91c2UgYnV0dG9uIDEgdG8gaW52b2tlIGVkaXRpbmcgZm9yIGEgY2VsbAotICAgICAgICAgICAgICAgaWYgKGUuYnV0dG9uID09IDEpICAgICAKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkVmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAoKFRhYmxlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLmVkaXRFbGVtZW50KHJvdy5nZXREYXRhKCksIGNvbHVtbik7ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJ1Y3R1cmVkVmlld2VyIGluc3RhbmNlb2YgVGFibGVUcmVlVmlld2VyICYmIGNvbHVtbiA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pcm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVGFibGVUcmVlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLmVkaXRFbGVtZW50KHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpLCBjb2x1bW4pOyAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgaWYgKHN0cnVjdHVyZWRWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIgJiYgcm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCkgaW5zdGFuY2VvZiBUYWJsZVRyZWVJdGVtKQotICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHBhbmRTdGF0ZSA9IHRhYmxlVHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgKChUYWJsZVRyZWVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuc2V0RXhwYW5kZWRTdGF0ZSh0YWJsZVRyZWVJdGVtLmdldERhdGEoKSwgIWV4cGFuZFN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgfQotCi0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IGNlbGwgZWRpdG9yIGNvbnRyb2wgc2hvd3MgdXAgYWJvdmUgdGhlIHRhYmxlIGN1cnNvciBjb250cm9sLgotICAgKiBTaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSB0YWJsZSB2aWV3ZXIgbWFrZXMgYSBuZXcgY2FsbCB0byBzZXRDZWxsRWRpdG9ycwotICAgKiBpLmUuIGluIGNvbnN0cnVjdG9yIGFuZCBpbiByZWZyZXNoQ2VsbEVkaXRvcnMKLSAgICoKLSAgICogQHBhcmFtIC0gYXJyYXkgb2YgY2VsbCBlZGl0b3JzIGZvciB0aGUgU3RydWN0dXJlZFZpZXdlcgotICAgKi8KLQotICBwdWJsaWMgdm9pZCBtb3ZlQ2VsbEVkaXRvcnNBYm92ZShDZWxsRWRpdG9yW10gZWRpdG9yQXJyYXkpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvckFycmF5Lmxlbmd0aCA7IGkrKykKLSAgICB7Ci0gICAgICBDZWxsRWRpdG9yIGNFZCA9IGVkaXRvckFycmF5W2ldOwotICAgICAgaWYgKGNFZCAhPSBudWxsICYmIGNFZC5nZXRDb250cm9sKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY0VkLmdldENvbnRyb2woKS5tb3ZlQWJvdmUobnVsbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgICBpZiAoIWlzRGlzcG9zZWQoKSAmJiBpc1Zpc2libGUoKSkKLSAgICAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgfQotICAgICB9KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL3Byb3Zpc2lvbmFsL2VkaXRvcnMvUG9zdE11bHRpUGFnZUVkaXRvclNpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9wcm92aXNpb25hbC9lZGl0b3JzL1Bvc3RNdWx0aVBhZ2VFZGl0b3JTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjgwY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL3Byb3Zpc2lvbmFsL2VkaXRvcnMvUG9zdE11bHRpUGFnZUVkaXRvclNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm92aXNpb25hbC5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JTaXRlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gTm8gbG9uZ2VyIG5lY2Vzc2FyeSBhcyBvZiAzLjJNMy4KLSAqLwotcHVibGljIGNsYXNzIFBvc3RNdWx0aVBhZ2VFZGl0b3JTaXRlIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yU2l0ZSB7Ci0JLyoqCi0JICogVGhlIHBvc3Qgc2VsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciwgaW5pdGlhbGl6ZWQgbGF6aWx5OwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCB5ZXQgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgcG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG51bGw7Ci0KLQlwdWJsaWMgUG9zdE11bHRpUGFnZUVkaXRvclNpdGUoTXVsdGlQYWdlRWRpdG9yUGFydCBtdWx0aVBhZ2VFZGl0b3IsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlzdXBlcihtdWx0aVBhZ2VFZGl0b3IsIGVkaXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGNoYW5nZWQgbGlzdGVuZXIgd2hpY2ggbGlzdGVucyB0byB0aGUgbmVzdGVkCi0JICogZWRpdG9yJ3MgcG9zdCBzZWxlY3Rpb24gY2hhbmdlcywgYW5kIGNhbGxzCi0JICogPGNvZGU+aGFuZGxlUG9zdFNlbGVjdGlvbkNoYW5nZWQ8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBjaGFuZ2VkIGxpc3RlbmVyCi0JICovCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGdldFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCWlmIChwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKLQkJCXBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlQb3N0TXVsdGlQYWdlRWRpdG9yU2l0ZS50aGlzLmhhbmRsZVBvc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBwb3N0IHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IGZyb20gdGhlIG5lc3RlZCBlZGl0b3IuIFRoZQotCSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZ2V0cyB0aGUgc2VsZWN0aW9uIHByb3ZpZGVyIGZyb20gdGhlIG11bHRpLXBhZ2UKLQkgKiBlZGl0b3IncyBzaXRlLCBhbmQgY2FsbHMgPGNvZGU+ZmlyZVBvc3RTZWxlY3Rpb25DaGFuZ2VkPC9jb2RlPiBvbiBpdAotCSAqIChvbmx5IGlmIGl0IGlzIGFuIGluc3RhbmNlIG9mIDxjb2RlPk11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyPC9jb2RlPiksCi0JICogcGFzc2luZyBhIG5ldyBldmVudCBvYmplY3QuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIG9yIHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBvc3RTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlJU2VsZWN0aW9uUHJvdmlkZXIgcGFyZW50UHJvdmlkZXIgPSBnZXRNdWx0aVBhZ2VFZGl0b3IoKS5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJaWYgKHBhcmVudFByb3ZpZGVyIGluc3RhbmNlb2YgUG9zdE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgbmV3RXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHBhcmVudFByb3ZpZGVyLCBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkoKFBvc3RNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcikgcGFyZW50UHJvdmlkZXIpLmZpcmVQb3N0U2VsZWN0aW9uQ2hhbmdlZChuZXdFdmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+TXVsdGlQYWdlRWRpdG9yU2l0ZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotCSAqIDxjb2RlPklXb3JrYmVuY2hQYXJ0U2l0ZTwvY29kZT4gbWV0aG9kIHJlbWVtYmVycyB0aGUgc2VsZWN0aW9uCi0JICogcHJvdmlkZXIsIGFuZCBhbHNvIGhvb2tzIGEgbGlzdGVuZXIgb24gaXQsIHdoaWNoIGNhbGxzCi0JICogPGNvZGU+aGFuZGxlU2VsZWN0aW9uQ2hhbmdlZDwvY29kZT4gd2hlbiBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50Ci0JICogb2NjdXJzIGFuZCA8Y29kZT5oYW5kbGVQb3N0U2VsZWN0aW9uQ2hhbmdlZDwvY29kZT4gd2hlbiBhIHBvc3QKLQkgKiBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCBvY2N1cnMuCi0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyCi0JICogICAgICAgICAgICBUaGUgc2VsZWN0aW9uIHByb3ZpZGVyLgotCSAqIEBzZWUgUG9zdE11bHRpUGFnZUVkaXRvclNpdGUjaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uUHJvdmlkZXIoSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCUlTZWxlY3Rpb25Qcm92aWRlciBvbGRTZWxlY3Rpb25Qcm92aWRlciA9IGdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCWlmIChvbGRTZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlpZiAob2xkU2VsZWN0aW9uUHJvdmlkZXIgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBvbGRTZWxlY3Rpb25Qcm92aWRlcikucmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihnZXRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuc2V0U2VsZWN0aW9uUHJvdmlkZXIocHJvdmlkZXIpOwotCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBwcm92aWRlcikuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihnZXRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvcHJvdmlzaW9uYWwvZWRpdG9ycy9Qb3N0TXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9wcm92aXNpb25hbC9lZGl0b3JzL1Bvc3RNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRmOTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9wcm92aXNpb25hbC9lZGl0b3JzL1Bvc3RNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvdmlzaW9uYWwuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gTm8gbG9uZ2VyIG5lY2Vzc2FyeSBhcyBvZiAzLjJNMy4KLSAqLwotcHVibGljIGNsYXNzIFBvc3RNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlciBleHRlbmRzIE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSVBvc3RTZWxlY3Rpb25Qcm92aWRlciB7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcG9zdExpc3RlbmVyczsKLQotCXB1YmxpYyBQb3N0TXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIoTXVsdGlQYWdlRWRpdG9yUGFydCBtdWx0aVBhZ2VFZGl0b3IpIHsKLQkJc3VwZXIobXVsdGlQYWdlRWRpdG9yKTsKLQkJcG9zdExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcG9zdExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpcmVQb3N0U2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gcG9zdExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgcGwgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJUGxhdGZvcm0ucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlwbC5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlwb3N0TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL3Byb3Zpc2lvbmFsL2VkaXRvcnMvUG9zdFNlbGVjdGlvbk11bHRpUGFnZUVkaXRvclBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9wcm92aXNpb25hbC9lZGl0b3JzL1Bvc3RTZWxlY3Rpb25NdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDJmMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL3Byb3Zpc2lvbmFsL2VkaXRvcnMvUG9zdFNlbGVjdGlvbk11bHRpUGFnZUVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3Zpc2lvbmFsLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEFkZHMgcG9zdHMgc2VsZWN0aW9uIG5vdGlmaWNhdGlvbnMgZnJvbSBjb250YWluZWQgZWRpdG9yIHBhcnRzIHRvCi0gKiBsaXN0ZW5lcnMuIFRoaXMgcGFydCB3YXMgY3JlYXRlZCBhcyBhIHdvcmthcm91bmQgZm9yCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MzI0IGFuZCB3aWxsIGJlIHJlbW92ZWQKLSAqIG9uY2UgV1RQIGlzIGJ1aWxkaW5nIG9uIGEgcGxhdGZvcm0gbWlsZXN0b25lIHRoYXQgaW5jbHVkZXMgYSBmaXguCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gTm8gbG9uZ2VyIG5lY2Vzc2FyeSBhcyBvZiAzLjJNMy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBvc3RTZWxlY3Rpb25NdWx0aVBhZ2VFZGl0b3JQYXJ0IGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydCB7Ci0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKG5ldyBQb3N0TXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIodGhpcykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotCQlzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0JCUlFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvciA9IGdldEVkaXRvcihuZXdQYWdlSW5kZXgpOwotCQlpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZUVkaXRvci5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCSgoUG9zdE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuZmlyZVBvc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkMzM2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi11cmlyZXNvbHZlci5qYXIKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLW9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXJfMS4wLjAuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOWI2OTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhMGQ2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI01vbiBKYW4gMzAgMTk6NDg6MDcgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YWY5OTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9SRUFETUUudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWY1MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1BUEkgZm9yIGFuIFVSSSByZXNvbHZlci4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWFhOThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc2NjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9Q29tbW9uIFVSSSBSZXNvbHZlciBGcmFtZXdvcmsKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcmVzb2x2ZXJFeHRlbnNpb25zPVVSSSBSZXNvbHZlciBFeHRlbnNpb25zIFBvaW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhOTljNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJyZXNvbHZlckV4dGVuc2lvbnMiIG5hbWU9IiVyZXNvbHZlckV4dGVuc2lvbnMiIHNjaGVtYT0ic2NoZW1hL3Jlc29sdmVyRXh0ZW5zaW9ucy5leHNkIi8+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc2NoZW1hL3Jlc29sdmVyRXh0ZW5zaW9ucy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NjaGVtYS9yZXNvbHZlckV4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyYmIwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc2NoZW1hL3Jlc29sdmVyRXh0ZW5zaW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiIGlkPSJyZXNvbHZlckV4dGVuc2lvbnMiIG5hbWU9IlVSSSBSZXNvbHZlciBFeHRlbnNpb25zIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBVUkkgUmVzb2x2ZXIgRXh0ZW5zaW9ucyBwb2ludCBhbGxvd3MgY2xpZW50cyB0byByZWdpc3RlciBjdXN0b20gVVJJIHJlc29sdmVycyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgcmVzb2x1dGlvbiBvZiByZXNvdXJjZXMgYnkgdG9vbHMgc3VjaCBhcyBlZGl0b3JzLCBnZW5lcmF0b3JzLCB2YWxpZGF0b3JzLCBhbmQgd2l6YXJkcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVzb2x2ZXJFeHRlbnNpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlc29sdmVyRXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvamVjdE5hdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhZ2UiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHN0YWdlIGluIHdoaWNoIHRvIHJ1biB0aGlzIGV4dGVuc2lvbiByZXNvbHZlcjogcHJlbm9ybWFsaXphdGlvbiwgcG9zdG5vcm1hbGl6YXRpb24sIG9yIHBoeXNpY2FsLiBEZWZhdWx0cyB0byBwb3N0bm9ybWFsaXphdGlvbi4mbHQ7YnImZ3Q7Ci1wcmVub3JtYWxpemF0aW9uOiAgcnVuIGJlZm9yZSBub3JtYWxpemF0aW9uIG9mIHRoZSBpbnB1dCZsdDticiZndDsKLXBvc3Rub3JtYWxpemF0aW9uOiBydW4gYWZ0ZXIgbm9ybWFsaXphdGlvbiBvZiB0aGUgaW5wdXQmbHQ7YnImZ3Q7Ci1waHlzaWNhbDogICAgICAgICAgcnVuIGFmdGVyIGFsbCBwcmUgYW5kIHBvc3Rub3JtYWxpemF0aW9uIHJlc29sdmVycwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHByaW9yaXR5IG9mIHRoaXMgcmVzb2x2ZXI6IGhpZ2gsIG1lZGl1bSwgb3IgbG93LiBEZWZhdWx0cyB0byBtZWRpdW0uIFRoZSBwcmlvcml0eSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hlbiB0aGlzIHJlc29sdmVyIHNob3VsZCBydW4gd2l0aCByZXNwZWN0IHRvIG90aGVyIHJlc29sdmVycyBkZWZpbmVkIGZvciB0aGUgc2FtZSBzdGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvamVjdE5hdHVyZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgSWYgYSBwcm9qZWN0IG5hdHVyZSBpcyBzcGVjaWZpZWQgdGhlIFVSSSByZXNvbHZlciB3aWxsIG9ubHkgYmUgdXNlZCBmb3IgcHJvamVjdHMgdGhhdCBjb250YWluIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgbmF0dXJlcy4gSWYgbm8gcHJvamVjdCBuYXR1cmVzIGFyZSBzcGVjaWZpZWQgdGhlIFVSSSByZXNvbHZlciB3aWxsIGJlIHVzZWQgZm9yIGFsbCBwcm9qZWN0cy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBwcm9qZWN0IG5hdHVyZSBJRCBmb3Igd2hpY2ggdGhlIFVSSSByZXNvbHZlciBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBVUkkgcmVzb2x2ZXIgY29udHJpYnV0aW9uOgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIucmVzb2x2ZXJFeHRlbnNpb25zJnF1b3Q7Jmd0OwotICAgICAgJmx0O3Jlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgICBzdGFnZT0mcXVvdDtwaHlzaWNhbCZxdW90OwotICAgICAgICAgICAgcHJpb3JpdHk9JnF1b3Q7bG93JnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLlNhbXBsZVJlc29sdmVyJnF1b3Q7Jmd0OwotICAgICAgJmx0Oy9yZXNvbHZlckV4dGVuc2lvbiZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHN1cHBsaWVkIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7Y29kZSZndDsKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlc29sdmVyCi0mbHQ7L2NvZGUmZ3Q7Ci1wcm92aWRlcyBhbiBVUkkgcmVzb2x2ZXIgdGhhdCByZXNvbHZlcyByZWZlcmVuY2VzIGluIGEgcHJvamVjdCB3aXRoIG11bHRpcGxlIGNvbXBvbmVudHMKLSZsdDtjb2RlJmd0Owotb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24KLSZsdDsvY29kZSZndDsKLXByb3ZpZGVzIGFuIFVSSSByZXNvbHZlciB0aGF0IHJlc29sdmVzIHJlZmVyZW5jZXMgaW4gYSBjYWNoZQotJmx0O2NvZGUmZ3Q7Ci1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24KLSZsdDsvY29kZSZndDsKLXByb3ZpZGVzIGFuIFVSSSByZXNvbHZlciB0aGF0IHJlc29sdmVzIHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgY2F0YWxvZwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvRXh0ZW5zaWJsZVVSSVJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvRXh0ZW5zaWJsZVVSSVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YjJjMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL0V4dGVuc2libGVVUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNzYWx0ZXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZVVSSVJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGxvZ0V4Y2VwdGlvbnMgPSBmYWxzZTsKLQotCS8vcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0KLQkvL1RPRE8uLi4gY29uc2lkZXIgY3RvciB0aGF0IHRha2VzIGEgcHJvamVjdCBhcmcKLQkvL3B1YmxpYyBFeHRlbnNpYmxlVVJJUmVzb2x2ZXIoSVByb2plY3QgcHJvamVjdCkKLQkvL3sKLQkvLwl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCS8vfQotCi0JcHVibGljIEV4dGVuc2libGVVUklSZXNvbHZlcigpCi0JewotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLQl7Ci0JCVN0cmluZyByZXN1bHQgPSBzeXN0ZW1JZDsKLQotCQkvLyBjb21wdXRlIHRoZSBwcm9qZWN0IHRoYXQgaG9sZHMgdGhlIHJlc291cmNlCi0JCS8vCi0gICAgSUZpbGUgZmlsZSA9IGNvbXB1dGVGaWxlKGJhc2VMb2NhdGlvbik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAgZmlsZSAhPSBudWxsID8gZmlsZS5nZXRQcm9qZWN0KCkgOiBudWxsOwotCi0JCVVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgcmVzb2x2ZXJSZWdpc3RyeSA9IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0SW50YW5jZSgpOwotCQlMaXN0IGxpc3QgPSByZXNvbHZlclJlZ2lzdHJ5LmdldEV4dGVuc2lvbkRlc2NyaXB0b3JzKHByb2plY3QpOwotCi0JCS8vIGdldCB0aGUgbGlzdCBvZiBhcHBsaWNhYmxlIHByZS1ub3JtYWxpemVkIHJlc29sdmVycyBmcm9tIHRoZQotCQkvLyBleHRlbnNpb24gcmVnaXN0cnkKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpID0gcmVzb2x2ZXJSZWdpc3RyeS5nZXRNYXRjaGluZ1VSSVJlc29sdmVycyhsaXN0LCBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlNUQUdFX1BSRU5PUk1BTElaQVRJT04pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJVVJJUmVzb2x2ZXJFeHRlbnNpb24gcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXJFeHRlbnNpb24pIGkubmV4dCgpOwotCQkJU3RyaW5nIHRlbXByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlKGZpbGUsIGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHJlc3VsdCk7Ci0JCQlpZih0ZW1wcmVzdWx0ICE9IG51bGwpCi0JCQl7Ci0JCQkgIHJlc3VsdCA9IHRlbXByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQotCQkvLyBub3JtYWxpemUgdGhlIHVyaQotCQkvLwotCQlyZXN1bHQgPSBub3JtYWxpemUoYmFzZUxvY2F0aW9uLCByZXN1bHQpOwotCi0JCS8vIGdldCB0aGUgbGlzdCBvZiBhcHBsaWNhYmxlIHBvc3Qtbm9ybWFsaXplZCByZXNvbHZlcnMgZnJvbSB0aGUKLQkJLy8gZXh0ZW5zaW9uIHJlZ2lzdHJ5Ci0JCS8vCQkKLQkJZm9yIChJdGVyYXRvciBpID0gcmVzb2x2ZXJSZWdpc3RyeS5nZXRNYXRjaGluZ1VSSVJlc29sdmVycyhsaXN0LCBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlNUQUdFX1BPU1ROT1JNQUxJWkFUSU9OKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsgCi0JCQlVUklSZXNvbHZlckV4dGVuc2lvbiByZXNvbHZlciA9IChVUklSZXNvbHZlckV4dGVuc2lvbikgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdGVtcHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUoZmlsZSwgYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgcmVzdWx0KTsKLQkJCWlmKHRlbXByZXN1bHQgIT0gbnVsbCkKLQkJCXsKLQkJCSAgcmVzdWx0ID0gdGVtcHJlc3VsdDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgbG9naWNhbExvY2F0aW9uKQotICAgIHsKLSAgICAgIFN0cmluZyByZXN1bHQgPSBsb2dpY2FsTG9jYXRpb247Ci0gICAgICBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IHJlc29sdmVyUmVnaXN0cnkgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LmdldEludGFuY2UoKTsKLSAgICAgIElGaWxlIGZpbGUgPSBjb21wdXRlRmlsZShiYXNlTG9jYXRpb24pOwotICAgICAgCi0gICAgICAvLyBjb21wdXRlIHRoZSBwcm9qZWN0IHRoYXQgaG9sZHMgdGhlIHJlc291cmNlCi0gICAgICAvLyAgICAgIAotICAgICAgSVByb2plY3QgcHJvamVjdCA9ICBmaWxlICE9IG51bGwgPyBmaWxlLmdldFByb2plY3QoKSA6IG51bGw7ICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSByZXNvbHZlclJlZ2lzdHJ5LmdldEV4dGVuc2lvbkRlc2NyaXB0b3JzKHByb2plY3QpOyAgICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gcmVzb2x2ZXJSZWdpc3RyeS5nZXRNYXRjaGluZ1VSSVJlc29sdmVycyhsaXN0LCBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlNUQUdFX1BIWVNJQ0FMKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBhcHBsaWNhYmxlIHBoeXNpY2FsIHJlc29sdmVycyBmcm9tIHRoZSBleHRlbnNpb24gcmVnaXN0cnkKLSAgICAgICAgLy8KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgVVJJUmVzb2x2ZXJFeHRlbnNpb24gcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXJFeHRlbnNpb24pIGkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyB0ZW1wcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShmaWxlLCBiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCByZXN1bHQpOwotICAgICAgICAgIGlmKHRlbXByZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0ZW1wcmVzdWx0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgICAgICAgCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLQotCXByb3RlY3RlZCBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBzeXN0ZW1JZCkKLQl7Ci0JICAvLyBJZiBubyBzeXN0ZW1JZCBoYXMgYmVlbiBzcGVjaWZpZWQgdGhlcmUgaXMgbm90aGluZyB0byBkbwotCSAgLy8gc28gcmV0dXJuIG51bGw7Ci0JICBpZihzeXN0ZW1JZCA9PSBudWxsKQotCSAgICByZXR1cm4gbnVsbDsKLQkgIFN0cmluZyByZXN1bHQgPSBzeXN0ZW1JZDsKLSAgICAgIAotICAgICAgLy8gY3MgOiBzb21ldGltZXMgbm9ybWFsaXppbmcgdGhlIFVSSSB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBnZXQgdGhyb3duCi0gICAgICAvLyBmb3IgZXhhbXBsZSB0aGUgJ2JhZCcgdmVyc2lvbiBvZiB0aGUgVVJJIGJlbG93IC4uLgotICAgICAgLy8KLSAgICAgIC8vICAgZ29vZCA9ICJqYXI6L3Jlc291cmNlL3Byb2plY3QtbmFtZS9XZWJDb250ZW50L1dFQi1JTkYvbGliL2dlbmVyYXRvci5qYXIhL01FVEEtSU5GL3NjaGVtYS9jb25maWcuZHRkIgotICAgICAgLy8gICBiYWQgID0gImphcjovcmVzb3VyY2UvcHJvamVjdC1uYW1lL1dlYkNvbnRlbnQvV0VCLUlORi9saWIvZ2VuZXJhdG9yLmphci9NRVRBLUlORi9zY2hlbWEvY29uZmlnLmR0ZCIKLSAgICAgIC8vCi0gICAgICAvLyBIZXJlIHdlIGVuY2xvc2UgdGhlIG5vcm1hbGl6YXRpb24gaW4gYSB0cnkvY2F0Y2ggYmxvY2sgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBjYWxsZXIKLSAgICAgIC8vIChpLmUuIHRoZSAncmVzb2x2ZScgbWV0aG9kKSBpc24ndCBpbnRlcmVzdGVkIGluIGhhbmRsaW5nIHRoaXMgZXhjZXB0aW9uLiAgICAgICAgCi0JICB0cnkKLQkgIHsKLQkgICAgLy8gbm9ybWFsaXplIHRoZSBVUkkKLQkgICAgVVJJIHN5c3RlbVVSSSA9IFVSSS5jcmVhdGVVUkkoc3lzdGVtSWQpOwotCSAgICBpZiAoc3lzdGVtVVJJLmlzUmVsYXRpdmUoKSkKLQkgICAgewotCSAgICAgIGJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5yZXBsYWNlKCdcXCcsJy8nKTsKLQkgICAgICBVUkkgYmFzZVVSSSA9IFVSSS5jcmVhdGVVUkkoYmFzZUxvY2F0aW9uKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBUT0RPIChjcykgd2Ugc2hvdWxkIGFkZCBtb3JlIGNvbW1lbnRzIHRvIGV4cGxhaW4gdGhpcyBpbiBhIGJpdCBtb3JlIGRldGFpbAotCSAgICAgIHRyeQotCSAgICAgIHsKLQkgICAgICAgIHJlc3VsdCA9IHN5c3RlbVVSSS5yZXNvbHZlKGJhc2VVUkkpLnRvU3RyaW5nKCk7Ci0JICAgICAgfQotCSAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IFVSSVJlc29sdmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCk7Ci0JICAgICAgICBJU3RhdHVzIHN0YXR1c09iaiA9IG51bGw7Ci0JICAgICAgICBqYXZhLm5ldC5VUkkgYmFzZVVSSTIgPSBudWxsOwotCSAgICAgICAgdHJ5IHsKLQkgICAgICAgICAgYmFzZVVSSTIgPSBqYXZhLm5ldC5VUkkuY3JlYXRlKGJhc2VMb2NhdGlvbik7Ci0JICAgICAgICB9Ci0JICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUyKSB7Ci0JICAgICAgICAgIGlmKGxvZ0V4Y2VwdGlvbnMpIHsKLQkgICAgICAgICAgICBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgIlByb2JsZW0gaW4gY3JlYXRpbmcgamF2YS5uZXQuVVJJIGluIEV4dGVuc2libGVVUklSZXNvbHZlcjoiICsgZTIuZ2V0TWVzc2FnZSgpLCBlMik7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgICAgICBQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgdHJ5IHsKLQkgICAgICAgICAgaWYoYmFzZVVSSTIgIT0gbnVsbCkgewotCSAgICAgICAgICAgIGphdmEubmV0LlVSSSByZXN1bHRVUkkgPSBiYXNlVVJJMi5yZXNvbHZlKHN5c3RlbUlkKTsKLQkgICAgICAgICAgICByZXN1bHQgPSByZXN1bHRVUkkudG9TdHJpbmcoKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlMikgewotCSAgICAgICAgICBpZihsb2dFeGNlcHRpb25zKSB7Ci0JICAgICAgICAgICAgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuRVJST1IsICJQcm9ibGVtIGluIHJlc29sdmluZyB3aXRoIGphdmEubmV0LlVSSSBpbiBFeHRlbnNpYmxlVVJJUmVzb2x2ZXI6IiArIGUyLmdldE1lc3NhZ2UoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgICAgICBQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCSAgeyAgICAgCi0gICAgICAgIC8vIGp1c3QgZWF0IHRoZSBleGNlcHRpb24gYW5kIHJldHVybiBiYWNrIHRoZSBvcmlnaW5hbCBzeXN0ZW1JZAotCSAgfQotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLSAgcHJvdGVjdGVkIElGaWxlIGNvbXB1dGVGaWxlKFN0cmluZyBiYXNlTG9jYXRpb24pCi0gIHsKLSAgICBJRmlsZSBmaWxlID0gbnVsbDsKLSAgICBpZiAoYmFzZUxvY2F0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHBhdHRlcm4gPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgocGF0dGVybikpCi0gICAgICB7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5zdWJzdHJpbmcocGF0dGVybi5sZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLSAgICAgIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGU7ICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGQyMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSwgYXMgc3BlY2lmaWVkIGJ5Ci0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCI+UkZDIDIzOTY8L2E+LCB3aXRoIGNlcnRhaW4KLSAqIGVuaGFuY2VtZW50cy4gIEEgPGNvZGU+VVJJPC9jb2RlPiBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCBieSBzcGVjaWZ5aW5nCi0gKiB2YWx1ZXMgZm9yIGl0cyBjb21wb25lbnRzLCBvciBieSBwcm92aWRpbmcgYSBzaW5nbGUgVVJJIHN0cmluZywgd2hpY2ggaXMKLSAqIHBhcnNlZCBpbnRvIGl0cyBjb21wb25lbnRzLiAgU3RhdGljIGZhY3RvcnkgbWV0aG9kcyB3aG9zZSBuYW1lcyBiZWdpbgotICogd2l0aCAiY3JlYXRlIiBhcmUgdXNlZCBmb3IgYm90aCBmb3JtcyBvZiBvYmplY3QgY3JlYXRpb24uICBObyBwdWJsaWMgb3IKLSAqIHByb3RlY3RlZCBjb25zdHJ1Y3RvcnMgYXJlIHByb3ZpZGVkOyB0aGlzIGNsYXNzIGNhbiBub3QgYmUgc3ViY2xhc3NlZC4KLSAqCi0gKiA8cD5MaWtlIDxjb2RlPlN0cmluZzwvY29kZT4sIDxjb2RlPlVSSTwvY29kZT4gaXMgYW4gaW1tdXRhYmxlIGNsYXNzOwotICogYSA8Y29kZT5VUkk8L2NvZGU+IGluc3RhbmNlIG9mZmVycyBzZXZlcmFsIGJ5LXZhbHVlIG1ldGhvZHMgdGhhdCByZXR1cm4gYQotICogbmV3IDxjb2RlPlVSSTwvY29kZT4gb2JqZWN0IGJhc2VkIG9uIGl0cyBjdXJyZW50IHN0YXRlLiAgTW9zdCB1c2VmdWwsCi0gKiBhIHJlbGF0aXZlIDxjb2RlPlVSSTwvY29kZT4gY2FuIGJlIHtAbGluayAjcmVzb2x2ZShVUkkpIHJlc29sdmV9ZCBhZ2FpbnN0Ci0gKiBhIGJhc2UgYWJzb2x1dGUgPGNvZGU+VVJJPC9jb2RlPiAtLSB0aGUgbGF0dGVyIHR5cGljYWxseSBpZGVudGlmaWVzIHRoZQotICogZG9jdW1lbnQgaW4gd2hpY2ggdGhlIGZvcm1lciBhcHBlYXJzLiAgVGhlIGludmVyc2UgdG8gdGhpcyBpcyB7QGxpbmsKLSAqICNkZXJlc29sdmUoVVJJKSBkZXJlc29sdmV9LCB3aGljaCBhbnN3ZXJzIHRoZSBxdWVzdGlvbiwgIndoYXQgcmVsYXRpdmUKLSAqIFVSSSB3aWxsIHJlc29sdmUsIGFnYWluc3QgdGhlIGdpdmVuIGJhc2UsIHRvIHRoaXMgYWJzb2x1dGUgVVJJPyIKLSAqCi0gKiA8cD5JbiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjM5Ni50eHQiPlJGQzwvYT4sIG11Y2gKLSAqIGF0dGVudGlvbiBpcyBmb2N1c2VkIG9uIGEgaGllcmFyY2hpY2FsIG5hbWluZyBzeXN0ZW0gdXNlZCB3aWRlbHkgdG8KLSAqIGxvY2F0ZSByZXNvdXJjZXMgdmlhIGNvbW1vbiBwcm90b2NvbHMgc3VjaCBhcyBIVFRQLCBGVFAsIGFuZCBHb3BoZXIsIGFuZAotICogdG8gaWRlbnRpZnkgZmlsZXMgb24gYSBsb2NhbCBmaWxlIHN5c3RlbS4gIEFjb3JkaW5nbHksIG1vc3Qgb2YgdGhpcwotICogY2xhc3MncyBmdW5jdGlvbmFsaXR5IGlzIGZvciBoYW5kbGluZyBzdWNoIFVSSXMsIHdoaWNoIGNhbiBiZSBpZGVudGlmaWVkCi0gKiB2aWEge0BsaW5rICNpc0hpZXJhcmNoaWNhbCBpc0hpZXJhcmNoaWNhbH0uCi0gKgotICogPHA+PGEgbmFtZT0iZGV2aWNlX2V4cGxhbmF0aW9uIj4KLSAqIFRoZSBwcmltYXJ5IGVuaGFuY2VtZW50IGJleW9uZCB0aGUgUkZDIGRlc2NyaXB0aW9uIGlzIGFuIG9wdGlvbmFsCi0gKiBkZXZpY2UgY29tcG9uZW50LiAgSW5zdGVhZCBvZiB0cmVhdGluZyB0aGUgZGV2aWNlIGFzIGp1c3QgYW5vdGhlciBzZWdtZW50Ci0gKiBpbiB0aGUgcGF0aCwgaXQgY2FuIGJlIHN0b3JlZCBhcyBhIHNlcGFyYXRlIGNvbXBvbmVudCAoYWxtb3N0IGEKLSAqIHN1Yi1hdXRob3JpdHkpLCB3aXRoIHRoZSByb290IGJlbG93IGl0LiAgRm9yIGV4YW1wbGUsIHJlc29sdmluZwotICogPGNvZGU+L2JhcjwvY29kZT4gYWdhaW5zdCA8Y29kZT5maWxlOi8vL2M6L2ZvbzwvY29kZT4gd291bGQgcmVzdWx0IGluCi0gKiA8Y29kZT5maWxlOi8vL2M6L2JhcjwvY29kZT4gYmVpbmcgcmV0dXJuZWQuICBBbHNvLCB5b3UgY2Fubm90IHRha2UKLSAqIHRoZSBwYXJlbnQgb2YgYSBkZXZpY2UsIHNvIHJlc29sdmluZyA8Y29kZT4uLjwvY29kZT4gYWdhaW5zdAotICogPGNvZGU+ZmlsZTovLy9jOi88L2NvZGU+IHdvdWxkIG5vdCB5aWVsZCA8Y29kZT5maWxlOi8vLzwvY29kZT4sIGFzIHlvdQotICogbWlnaHQgZXhwZWN0LiAgVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCB3aGVuIHdvcmtpbmcgd2l0aCBmaWxlLXNjaGVtZQotICogVVJJcywgYXMgZGV2aWNlcyBkbyBub3QgdHlwaWNhbGx5IG9jY3VyIGluIHByb3RvY29sLWJhc2VkIG9uZXMuICBBCi0gKiBkZXZpY2UtZW5hYmxlZCA8Y29kZT5VUkk8L2NvZGU+IGlzIGNyZWF0ZWQgYnkgcGFyc2luZyBhIHN0cmluZyB3aXRoCi0gKiB7QGxpbmsgI2NyZWF0ZVVSSShTdHJpbmcpIGNyZWF0ZVVSSX07IGlmIHRoZSBmaXJzdCBzZWdtZW50IG9mIHRoZSBwYXRoCi0gKiBlbmRzIHdpdGggdGhlIDxjb2RlPjo8L2NvZGU+IGNoYXJhY3RlciwgaXQgaXMgc3RvcmVkIChpbmNsdWRpbmcgdGhlIGNvbG9uKQotICogYXMgdGhlIGRldmljZSwgaW5zdGVhZC4gIEFsdGVybmF0ZWx5LCBlaXRoZXIgdGhlIHtAbGluawotICogI2NyZWF0ZUhpZXJhcmNoaWNhbFVSSShTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZykgbm8tcGF0aH0KLSAqIG9yIHRoZSB7QGxpbmsgI2NyZWF0ZUhpZXJhcmNoaWNhbFVSSShTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmdbXSwKLSAqIFN0cmluZywgU3RyaW5nKSBhYnNvbHV0ZS1wYXRofSBmb3JtIG9mIDxjb2RlPmNyZWF0ZUhpZXJhcmNoaWNhbFVSSSgpPC9jb2RlPgotICogY2FuIGJlIHVzZWQsIGluIHdoaWNoIGEgbm9uLW51bGwgPGNvZGU+ZGV2aWNlPC9jb2RlPiBwYXJhbWV0ZXIgY2FuIGJlCi0gKiBzcGVjaWZpZWQuCi0gKgotICogPHA+PGEgbmFtZT0iYXJjaGl2ZV9leHBsYW5hdGlvbiI+IAotICogVGhlIG90aGVyIGVuaGFuY2VtZW50IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBhbG1vc3QtaGllcmFyY2hpY2FsCi0gKiBmb3JtIHVzZWQgZm9yIGZpbGVzIHdpdGhpbiBhcmNoaXZlcywgc3VjaCBhcyB0aGUgSkFSIHNjaGVtZSwgZGVmaW5lZAotICogZm9yIHRoZSBKYXZhIFBsYXRmb3JtIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciB7QGxpbmsKLSAqIGphdmEubmV0LkphclVSTENvbm5lY3Rpb259LiBCeSBkZWZhdWx0LCB0aGlzIHN1cHBvcnQgaXMgZW5hYmxlZCBmb3IKLSAqIGFic29sdXRlIFVSSXMgd2l0aCBzY2hlbWUgZXF1YWwgdG8gImphciIsICJ6aXAiLCBvciAiYXJjaGl2ZSIgKGlnbm9yaW5nIGNhc2UpLCBhbmQKLSAqIGlzIGltcGxlbWVudGVkIGJ5IGEgaGllcmFyY2hpY2FsIFVSSSwgd2hvc2UgYXV0aG9yaXR5IGluY2x1ZGVzIHRoZQotICogZW50aXJlIFVSSSBvZiB0aGUgYXJjaGl2ZSwgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgPGNvZGU+ITwvY29kZT4KLSAqIGNoYXJhY3Rlci4gIFRoZSBVUkkgb2YgdGhlIGFyY2hpdmUgbXVzdCBoYXZlIG5vIGZyYWdtZW50LiAgVGhlIHdob2xlCi0gKiBhcmNoaXZlIFVSSSBtdXN0IGhhdmUgbm8gZGV2aWNlIGFuZCBhbiBhYnNvbHV0ZSBwYXRoLiAgU3BlY2lhbCBoYW5kbGluZwotICogaXMgc3VwcG9ydGVkIGZvciB7QGxpbmsgI2NyZWF0ZVVSSSBjcmVhdGluZ30sIHtAbGluawotICogI3ZhbGlkQXJjaGl2ZUF1dGhvcml0eSB2YWxpZGF0aW5nfSwge0BsaW5rICNkZXZpY2VQYXRoIGdldHRpbmcgdGhlIHBhdGh9Ci0gKiBmcm9tLCBhbmQge0BsaW5rICN0b1N0cmluZyBkaXNwbGF5aW5nfSBhcmNoaXZlIFVSSXMuIEluIGFsbCBvdGhlcgotICogb3BlcmF0aW9ucywgaW5jbHVkaW5nIHtAbGluayAjcmVzb2x2ZShVUkkpIHJlc29sdmluZ30gYW5kIHtAbGluawotICogI2RlcmVzb2x2ZShVUkkpIGRlcmVzb2x2aW5nfSwgdGhleSBhcmUgaGFuZGxlZCBsaWtlIGFueSBvcmRpbmFyeSBVUkkuCi0gKgotICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBpbXBvc2UgdGhlIGFsbCBvZiB0aGUgcmVzdHJpY3Rpb25zIG9uCi0gKiBjaGFyYWN0ZXIgdmFsaWRpdHkgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBSRkMuICBTdGF0aWMgbWV0aG9kcyB3aG9zZQotICogbmFtZXMgYmVnaW4gd2l0aCAidmFsaWQiIGFyZSB1c2VkIHRvIHRlc3Qgd2hldGhlciBhIGdpdmVuIHN0cmluZyBpcyB2YWxpZAotICogdmFsdWUgZm9yIHRoZSB2YXJpb3VzIFVSSSBjb21wb25lbnRzLiAgUHJlc2VudGx5LCB0aGVzZSB0ZXN0cyBwbGFjZSBubwotICogcmVzdHJpY3Rpb25zIGJleW9uZCB3aGF0IHdvdWxkIGhhdmUgYmVlbiByZXF1aXJlZCBpbiBvcmRlciBmb3Ige0BsaW5rCi0gKiBjcmVhdGVVUkkoU3RyaW5nKSBjcmVhdGVVUkl9IHRvIGhhdmUgcGFyc2VkIHRoZW0gY29ycmVjdGx5IGZyb20gYSBzaW5nbGUKLSAqIFVSSSBzdHJpbmcuICBJZiBuZWNlc3NhcnkgaW4gdGhlIGZ1dHVyZSwgdGhlc2UgdGVzdHMgbWF5IGJlIG1hZGUgbW9yZQotICogc3RyaWN0LCB0byBiZXR0ZXIgY29mb3JtIHRvIHRoZSBSRkMuCi0gKiAKLSAqIDxwPkFub3RoZXIgZ3JvdXAgb2Ygc3RhdGljIG1ldGhvZHMsIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggImVuY29kZSIsIHVzZQotICogcGVyY2VudCBlc2NhcGluZyB0byBlbmNvZGUgYW55IGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHBlcm1pdHRlZCBpbiB0aGUKLSAqIHZhcmlvdXMgVVJJIGNvbXBvbmVudHMuIEFub3RoZXIgc3RhdGljIG1ldGhvZCBpcyBwcm92aWRlZCB0byB7QGxpbmsKLSAqICNkZWNvZGUgZGVjb2RlfSBlbmNvZGVkIHN0cmluZ3MuICBBbiBlc2NhcGVkIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCBhcwotICogYSBwZXJjZW50IHN5Ym9sICg8Y29kZT4lPC9jb2RlPiksIGZvbGxvd2VkIGJ5IHR3byBoZXggZGlnaXRzIHRoYXQgc3BlY2lmeQotICogdGhlIGNoYXJhY3RlciBjb2RlLiAgVGhlc2UgZW5jb2RpbmcgbWV0aG9kcyBhcmUgbW9yZSBzdHJpY3QgdGhhbiB0aGUKLSAqIHZhbGlkYXRpb24gbWV0aG9kcyBkZXNjcmliZWQgYWJvdmUuICBUaGV5IGVuc3VyZSB2YWxpZGl0eSBhY2NvcmRpbmcgdG8gdGhlCi0gKiBSRkMsIHdpdGggb25lIGV4Y2VwdGlvbjogbm9uLUFTQ0lJIGNoYXJhY3RlcnMuCi0gKgotICogPHA+VGhlIFJGQyBhbGxvd3Mgb25seSBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIG1hcHBlZCB0byA3LWJpdCBVUy1BU0NJSQotICogcmVwcmVzZW50YXRpb25zLiAgTm9uLUFTQ0lJLCBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXJzIGNhbiBiZSB1c2VkIG9ubHkgdmlhCi0gKiBwZXJjZW50IGVzY2FwaW5nLCBhcyBkZXNjcmliZWQgYWJvdmUuICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgSmF2YSdzCi0gKiBVbmljb2RlIDxjb2RlPmNoYXI8L2NvZGU+IGFuZCA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9ucywgYW5kCi0gKiBtYWtlcyBubyBhdHRlbXB0IHRvIGVuY29kZSBjaGFyYWN0ZXJzIDB4QTAgYW5kIGFib3ZlLiAgQ2hhcmFjdGVycyBpbiB0aGUKLSAqIHJhbmdlIDB4ODAtMHg5RiBhcmUgc3RpbGwgZXNjYXBlZC4gIEluIHRoaXMgcmVzcGVjdCwgdGhpcyBub3Rpb24gb2YgYSBVUkkKLSAqIGlzIGFjdHVhbGx5IG1vcmUgbGlrZSBhbiBJUkkgKEludGVybmF0aW9uYWxpemVkIFJlc291cmNlIElkZW50aWZpZXIpLCBmb3IKLSAqIHdoaWNoIGFuIFJGQyBpcyBub3cgaW4gPGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0ludGVybmF0aW9uYWwvaXJpLWVkaXQvZHJhZnQtZHVlcnN0LWlyaS0wOS50eHQiPmRyYWZ0Ci0gKiBmb3JtPC9hPi4KLSAqCi0gKiA8cD5GaW5hbGx5LCBub3RlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSA8Y29kZT5udWxsPC9jb2RlPiBwYXJhbWV0ZXIgdG8KLSAqIHRoZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIGFuZCBhbiBlbXB0eSBzdHJpbmcuICBUaGUgZm9ybWVyIHNpZ25pZmllcyB0aGUKLSAqIGFic2Vuc2Ugb2YgYSBnaXZlbiBVUkkgY29tcG9uZW50LCB3aGlsZSB0aGUgbGF0dGVyIHNpbXBseSBtYWtlcyB0aGUKLSAqIGNvbXBvbmVudCBibGFuay4gIFRoaXMgY2FuIGhhdmUgYSBzaWduaWZpY2FudCBlZmZlY3Qgd2hlbiByZXNvbHZpbmcuICBGb3IKLSAqIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdHdvIFVSSXM6IDxjb2RlPi9iYXI8L2NvZGU+ICh3aXRoIG5vCi0gKiBhdXRob3JpdHkpIGFuZCA8Y29kZT4vLy9iYXI8L2NvZGU+ICh3aXRoIGEgYmxhbmsgYXV0aG9yaXR5KS4gIEltYWdpbmUKLSAqIHJlc29sdmluZyB0aGVtIGFnYWluc3QgYSBiYXNlIHdpdGggYW4gYXV0aG9yaXR5LCBzdWNoIGFzCi0gKiA8Y29kZT5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvY29kZT4uICBUaGUgZm9ybWVyIGNhc2Ugd2lsbCB5aWVsZAotICogPGNvZGU+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9iYXI8L2NvZGU+LCBhcyB0aGUgYmFzZSBhdXRob3JpdHkgd2lsbCBiZQotICogcHJlc2VydmVkLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgZW1wdHkgYXV0aG9yaXR5IHdpbGwgb3ZlcnJpZGUgdGhlCi0gKiBiYXNlIGF1dGhvcml0eSwgcmVzdWx0aW5nIGluIDxjb2RlPmh0dHA6Ly8vYmFyPC9jb2RlPiEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVSSQotewotICAvLyBDb21tb24gdG8gYWxsIFVSSSB0eXBlcy4KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgaGFzaENvZGU7Ci0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoaWVyYXJjaGljYWw7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHNjaGVtZTsgIC8vIG51bGwgLT4gcmVsYXRpdmUgVVJJIHJlZmVyZW5jZQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBhdXRob3JpdHk7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGZyYWdtZW50OwotICBwcml2YXRlIFVSSSBjYWNoZWRUcmltRnJhZ21lbnQ7Ci0gIHByaXZhdGUgU3RyaW5nIGNhY2hlZFRvU3RyaW5nOwotICAvL3ByaXZhdGUgZmluYWwgYm9vbGVhbiBpcmk7Ci0gIC8vcHJpdmF0ZSBVUkkgY2FjaGVkQVNDSUlVUkk7Ci0KLSAgLy8gQXBwbGljYWJsZSBvbmx5IHRvIGEgaGllcmFyY2hpY2FsIFVSSS4KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGV2aWNlOwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWJzb2x1dGVQYXRoOwotICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHNlZ21lbnRzOyAvLyBlbXB0eSBsYXN0IHNlZ21lbnQgLT4gdHJhaWxpbmcgc2VwYXJhdG9yCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHF1ZXJ5OwotCi0gIC8vIEEgY2FjaGUgb2YgVVJJcywga2V5ZWQgYnkgdGhlIHN0cmluZ3MgZnJvbSB3aGljaCB0aGV5IHdlcmUgY3JlYXRlZC4KLSAgLy8gVGhlIGZyYWdtZW50IG9mIGFueSBVUkkgaXMgcmVtb3ZlZCBiZWZvcmUgY2FjaGluZyBpdCBoZXJlLCB0byBtaW5pbWl6ZQotICAvLyB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gdGhlIHVzdWFsIGNhc2Ugd2hlcmUgbW9zdCBVUklzIG9ubHkgZGlmZmVyIGJ5Ci0gIC8vIHRoZSBmcmFnbWVudC4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIHVyaUNhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotCi0gIC8vIFRoZSBsb3dlci1jYXNlZCBzY2hlbWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IGFyY2hpdmUgVVJJcy4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0IGFyY2hpdmVTY2hlbWVzOwotCi0gIC8vIElkZW50aWZpZXMgYSBmaWxlLXR5cGUgYWJzb2x1dGUgVVJJLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX0ZJTEUgPSAiZmlsZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfSkFSID0gImphciI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfWklQID0gInppcCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfQVJDSElWRSA9ICJhcmNoaXZlIjsKLQotICAvLyBTcGVjaWFsIHNlZ21lbnQgdmFsdWVzIGludGVycHJldGVkIGF0IHJlc29sdmUgYW5kIHJlc29sdmUgdGltZS4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFR01FTlRfRU1QVFkgPSAiIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFR01FTlRfU0VMRiA9ICIuIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFR01FTlRfUEFSRU5UID0gIi4uIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTk9fU0VHTUVOVFMgPSBuZXcgU3RyaW5nWzBdOwotCi0gIC8vIFNlcGFyYXRvcnMgZm9yIHBhcnNpbmcgYSBVUkkgc3RyaW5nLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNDSEVNRV9TRVBBUkFUT1IgPSAnOic7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFlfU0VQQVJBVE9SID0gIi8vIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBERVZJQ0VfSURFTlRJRklFUiA9ICc6JzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTRUdNRU5UX1NFUEFSQVRPUiA9ICcvJzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBRVUVSWV9TRVBBUkFUT1IgPSAnPyc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRlJBR01FTlRfU0VQQVJBVE9SID0gJyMnOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFVTRVJfSU5GT19TRVBBUkFUT1IgPSAnQCc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUE9SVF9TRVBBUkFUT1IgPSAnOic7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklMRV9FWFRFTlNJT05fU0VQQVJBVE9SID0gJy4nOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEFSQ0hJVkVfSURFTlRJRklFUiA9ICchJzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSQ0hJVkVfU0VQQVJBVE9SID0gIiEvIjsKLQotICAvLyBDaGFyYWN0ZXJzIHRvIHVzZSBpbiBlc2NhcGluZy4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBFU0NBUEUgPSAnJSc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhfRElHSVRTID0gewotICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJyB9OwotCi0gIC8vIFNvbWUgY2hhcmFjdGVyIGNsYXNzZXMsIGFzIGRlZmluZWQgaW4gUkZDIDIzOTYncyBCTkYgZm9yIFVSSS4KLSAgLy8gVGhlc2UgYXJlIDEyOC1iaXQgYml0bWFza3MsIHN0b3JlZCBhcyB0d28gbG9uZ3MsIHdoZXJlIHRoZSBOdGggYml0IGlzIHNldAotICAvLyBpZmYgdGhlIEFTQ0lJIGNoYXJhY3RlciB3aXRoIHZhbHVlIE4gaXMgaW5jbHVkZWQgaW4gdGhlIHNldC4gIFRoZXNlIGFyZQotICAvLyBjcmVhdGVkIHdpdGggdGhlIGhpZ2hCaXRtYXNrKCkgYW5kIGxvd0JpdG1hc2soKSBtZXRob2RzIGRlZmluZWQgYmVsb3csCi0gIC8vIGFuZCBhIGNoYXJhY3RlciBpcyB0ZXN0ZWQgYWdhaW5zdCB0aGVtIHVzaW5nIG1hdGNoZXMoKS4KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBTFBIQV9ISSA9IGhpZ2hCaXRtYXNrKCdhJywgJ3onKSB8IGhpZ2hCaXRtYXNrKCdBJywgJ1onKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBTFBIQV9MTyA9IGxvd0JpdG1hc2soJ2EnLCAneicpICB8IGxvd0JpdG1hc2soJ0EnLCAnWicpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERJR0lUX0hJID0gaGlnaEJpdG1hc2soJzAnLCAnOScpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERJR0lUX0xPID0gbG93Qml0bWFzaygnMCcsICc5Jyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQUxQSEFOVU1fSEkgPSBBTFBIQV9ISSB8IERJR0lUX0hJOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFMUEhBTlVNX0xPID0gQUxQSEFfTE8gfCBESUdJVF9MTzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBIRVhfSEkgPSBESUdJVF9ISSB8IGhpZ2hCaXRtYXNrKCdBJywgJ0YnKSB8IGhpZ2hCaXRtYXNrKCdhJywgJ2YnKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBIRVhfTE8gPSBESUdJVF9MTyB8IGxvd0JpdG1hc2soJ0EnLCAnRicpICB8IGxvd0JpdG1hc2soJ2EnLCAnZicpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVOUkVTRVJWRURfSEkgPSBBTFBIQU5VTV9ISSB8IGhpZ2hCaXRtYXNrKCItXy4hfionKCkiKTsgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVU5SRVNFUlZFRF9MTyA9IEFMUEhBTlVNX0xPIHwgbG93Qml0bWFzaygiLV8uIX4qJygpIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVTRVJWRURfSEkgPSBoaWdoQml0bWFzaygiOy8/OkAmPSskLCIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFJFU0VSVkVEX0xPID0gbG93Qml0bWFzaygiOy8/OkAmPSskLCIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVSSUNfSEkgPSBSRVNFUlZFRF9ISSB8IFVOUkVTRVJWRURfSEk7ICAvLyB8IHVjc2NoYXIgfCBlc2NhcGVkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVJJQ19MTyA9IFJFU0VSVkVEX0xPIHwgVU5SRVNFUlZFRF9MTzsKLQotICAvLyBBZGRpdGlvbmFsIHVzZWZ1bCBjaGFyYWN0ZXIgY2xhc3NlcywgaW5jbHVkaW5nIGNoYXJhY3RlcnMgdmFsaWQgaW4gY2VydGFpbgotICAvLyBVUkkgY29tcG9uZW50cyBhbmQgc2VwYXJhdG9ycyB1c2VkIGluIHBhcnNpbmcgdGhlbSBvdXQgb2YgYSBzdHJpbmcuIAotICAvLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNFR01FTlRfQ0hBUl9ISSA9IFVOUkVTRVJWRURfSEkgfCBoaWdoQml0bWFzaygiOzpAJj0rJCwiKTsgIC8vIHwgdWNzY2hhciB8IGVzY2FwZWQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTRUdNRU5UX0NIQVJfTE8gPSBVTlJFU0VSVkVEX0xPIHwgbG93Qml0bWFzaygiOzpAJj0rJCwiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQQVRIX0NIQVJfSEkgPSBTRUdNRU5UX0NIQVJfSEkgfCBoaWdoQml0bWFzaygnLycpOyAgLy8gfCB1Y3NjaGFyIHwgZXNjYXBlZAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBBVEhfQ0hBUl9MTyA9IFNFR01FTlRfQ0hBUl9MTyB8IGxvd0JpdG1hc2soJy8nKTsKLS8vICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNDSEVNRV9DSEFSX0hJID0gQUxQSEFOVU1fSEkgfCBoaWdoQml0bWFzaygiKy0uIik7Ci0vLyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTQ0hFTUVfQ0hBUl9MTyA9IEFMUEhBTlVNX0xPIHwgbG93Qml0bWFzaygiKy0uIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFKT1JfU0VQQVJBVE9SX0hJID0gaGlnaEJpdG1hc2soIjovPyMiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQUpPUl9TRVBBUkFUT1JfTE8gPSBsb3dCaXRtYXNrKCI6Lz8jIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0VHTUVOVF9FTkRfSEkgPSBoaWdoQml0bWFzaygiLz8jIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0VHTUVOVF9FTkRfTE8gPSBsb3dCaXRtYXNrKCIvPyMiKTsKLQotICAvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIGFyY2hpdmVTY2hlbWVzLgotICBzdGF0aWMKLSAgewotICAgIFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotICAgIHNldC5hZGQoU0NIRU1FX0pBUik7Ci0gICAgc2V0LmFkZChTQ0hFTUVfWklQKTsKLSAgICBzZXQuYWRkKFNDSEVNRV9BUkNISVZFKTsKLSAgICAKLSAgICAKLSAgICBhcmNoaXZlU2NoZW1lcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChzZXQpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbG93ZXIgaGFsZiBiaXRtYXNrIGZvciB0aGUgZ2l2ZW4gQVNDSUkgY2hhcmFjdGVyLgotICBwcml2YXRlIHN0YXRpYyBsb25nIGxvd0JpdG1hc2soY2hhciBjKQotICB7Ci0gICAgcmV0dXJuIGMgPCA2NCA/IDFMIDw8IGMgOiAwTDsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHVwcGVyIGhhbGYgYml0bWFzayBmb3IgdGhlIGdpdmVuIEFDU0lJIGNoYXJhY3Rlci4KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBoaWdoQml0bWFzayhjaGFyIGMpCi0gIHsKLSAgICByZXR1cm4gYyA+PSA2NCAmJiBjIDwgMTI4ID8gMUwgPDwgKGMgLSA2NCkgOiAwTDsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGxvd2VyIGhhbGYgYml0bWFzayBmb3IgYWxsIEFTQ0lJIGNoYXJhY3RlcnMgYmV0d2VlbiB0aGUgdHdvCi0gIC8vIGdpdmVuIGNoYXJhY3RlcnMsIGluY2x1c2l2ZS4KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBsb3dCaXRtYXNrKGNoYXIgZnJvbSwgY2hhciB0bykKLSAgewotICAgIGxvbmcgcmVzdWx0ID0gMEw7Ci0gICAgaWYgKGZyb20gPCA2NCAmJiBmcm9tIDw9IHRvKQotICAgIHsKLSAgICAgIHRvID0gdG8gPCA2NCA/IHRvIDogNjM7Ci0gICAgICBmb3IgKGNoYXIgYyA9IGZyb207IGMgPD0gdG87IGMrKykKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0IHw9ICgxTCA8PCBjKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHVwcGVyIGhhbGYgYml0bWFzayBmb3IgYWxsIEFzQ0lJIGNoYXJhY3RlcnMgYmV0d2VlbiB0aGUgdHdvCi0gIC8vIGdpdmVuIGNoYXJhY3RlcnMsIGluY2x1c2l2ZS4KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBoaWdoQml0bWFzayhjaGFyIGZyb20sIGNoYXIgdG8pCi0gIHsKLSAgICByZXR1cm4gdG8gPCA2NCA/IDAgOiBsb3dCaXRtYXNrKChjaGFyKShmcm9tIDwgNjQgPyAwIDogZnJvbSAtIDY0KSwgKGNoYXIpKHRvIC0gNjQpKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGxvd2VyIGhhbGYgYml0bWFzayBmb3IgYWxsIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbgotICAvLyBzdHJpbmcuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgbG93Qml0bWFzayhTdHJpbmcgY2hhcnMpCi0gIHsKLSAgICBsb25nIHJlc3VsdCA9IDBMOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBjaGFycy5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IGNoYXJzLmNoYXJBdChpKTsKLSAgICAgIGlmIChjIDwgNjQpIHJlc3VsdCB8PSAoMUwgPDwgYyk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSB1cHBlciBoYWxmIGJpdG1hc2sgZm9yIGFsbCB0aGUgQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4KLSAgLy8gc3RyaW5nLgotICBwcml2YXRlIHN0YXRpYyBsb25nIGhpZ2hCaXRtYXNrKFN0cmluZyBjaGFycykKLSAgewotICAgIGxvbmcgcmVzdWx0ID0gMEw7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IGNoYXJzLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgY2hhciBjID0gY2hhcnMuY2hhckF0KGkpOwotICAgICAgaWYgKGMgPj0gNjQgJiYgYyA8IDEyOCkgcmVzdWx0IHw9ICgxTCA8PCAoYyAtIDY0KSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBpbiB0aGUgc2V0IHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4KLSAgLy8gYml0bWFzay4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKGNoYXIgYywgbG9uZyBoaWdoQml0bWFzaywgbG9uZyBsb3dCaXRtYXNrKQotICB7Ci0gICAgaWYgKGMgPj0gMTI4KSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIGMgPCA2NCA/Ci0gICAgICAoKDFMIDw8IGMpICYgbG93Qml0bWFzaykgIT0gMCA6Ci0gICAgICAoKDFMIDw8IChjIC0gNjQpKSAmIGhpZ2hCaXRtYXNrKSAhPSAwOwotICB9Ci0KLSAgLy8gRGVidWdnaW5nIG1ldGhvZDogY29udmVydHMgdGhlIGdpdmVuIGxvbmcgdG8gYSBzdHJpbmcgb2YgYmluYXJ5IGRpZ2l0cy4KLS8qCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0JpdHMobG9uZyBsKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY0OyBpKyspCi0gICAgewotICAgICAgYm9vbGVhbiBiID0gKGwgJiAxTCkgIT0gMDsKLSAgICAgIHJlc3VsdC5pbnNlcnQoMCwgYiA/ICcxJyA6ICcwJyk7Ci0gICAgICBsID4+PSAxOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLSovCi0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBmb3IgYSBnZW5lcmljLCBub24taGllcmFyY2hpY2FsIFVSSS4gIFRoZXJlIGlzIG5vCi0gICAqIGNvbmNlcHQgb2YgYSByZWxhdGl2ZSBub24taGllcmFyY2hpY2FsIFVSSTsgc3VjaCBhbiBvYmplY3QgY2Fubm90IGJlCi0gICAqIGNyZWF0ZWQuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzCi0gICAqIG51bGwsIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4gaXMgYW4gPGEgaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUKLSAgICogVVJJPC9hPiBzY2hlbWUsIG9yIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4sIDxjb2RlPm9wYXF1ZVBhcnQ8L2NvZGU+LCBvcgotICAgKiA8Y29kZT5mcmFnbWVudDwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2NoZW1lCi0gICAqIHZhbGlkU2NoZW1lfSwge0BsaW5rICN2YWxpZE9wYXF1ZVBhcnQgdmFsaWRPcGFxdWVQYXJ0fSwgb3Ige0BsaW5rCi0gICAqICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LCByZXNwZWN0aXZlbHkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVHZW5lcmljVVJJKFN0cmluZyBzY2hlbWUsIFN0cmluZyBvcGFxdWVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIGlmIChzY2hlbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZWxhdGl2ZSBub24taGllcmFyY2hpY2FsIFVSSSIpOwotICAgIH0KLQotICAgIGlmIChpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub24taGllcmFyY2hpY2FsIGFyY2hpdmUgVVJJIik7Ci0gICAgfQotCi0gICAgdmFsaWRhdGVVUkkoZmFsc2UsIHNjaGVtZSwgb3BhcXVlUGFydCwgbnVsbCwgZmFsc2UsIE5PX1NFR01FTlRTLCBudWxsLCBmcmFnbWVudCk7Ci0gICAgcmV0dXJuIG5ldyBVUkkoZmFsc2UsIHNjaGVtZSwgb3BhcXVlUGFydCwgbnVsbCwgZmFsc2UsIE5PX1NFR01FTlRTLCBudWxsLCBmcmFnbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGZvciBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBubyBwYXRoLiAgVGhlCi0gICAqIFVSSSB3aWxsIGJlIHJlbGF0aXZlIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4gaXMgbm9uLW51bGwsIGFuZCBhYnNvbHV0ZQotICAgKiBvdGhlcndpc2UuICBBbiBhYnNvbHV0ZSBVUkkgd2l0aCBubyBwYXRoIHJlcXVpcmVzIGEgbm9uLW51bGwKLSAgICogPGNvZGU+YXV0aG9yaXR5PC9jb2RlPiBhbmQvb3IgPGNvZGU+ZGV2aWNlPC9jb2RlPi4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4gaXMKLSAgICogbm9uLW51bGwgd2hpbGUgPGNvZGU+YXV0aG9yaXR5PC9jb2RlPiBhbmQgPGNvZGU+ZGV2aWNlPC9jb2RlPiBhcmUgbnVsbCwKLSAgICogaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcyBhbiA8YSBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZQotICAgKiBVUkk8L2E+IHNjaGVtZSwgb3IgaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiwgPGNvZGU+YXV0aG9yaXR5PC9jb2RlPiwKLSAgICogPGNvZGU+ZGV2aWNlPC9jb2RlPiwgPGNvZGU+cXVlcnk8L2NvZGU+LCBvciA8Y29kZT5mcmFnbWVudDwvY29kZT4gaXMgbm90Ci0gICAqIHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2NoZW1lIHZhbGlkU2hlbWV9LCB7QGxpbmsKLSAgICogI3ZhbGlkQXV0aG9yaXR5IHZhbGlkQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZERldmljZSB2YWxpZERldmljZX0sCi0gICAqIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3Ige0BsaW5rICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LAotICAgKiByZXNwZWN0aXZlbHkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVIaWVyYXJjaGljYWxVUkkoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIGF1dGhvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXZpY2UsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIGlmIChzY2hlbWUgIT0gbnVsbCAmJiBhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiYWJzb2x1dGUgaGllcmFyY2hpY2FsIFVSSSB3aXRob3V0IGF1dGhvcml0eSwgZGV2aWNlLCBwYXRoIik7Ci0gICAgfQotCi0gICAgaWYgKGlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFyY2hpdmUgVVJJIHdpdGggbm8gcGF0aCIpOwotICAgIH0KLQotICAgIHZhbGlkYXRlVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGZhbHNlLCBOT19TRUdNRU5UUywgcXVlcnksIGZyYWdtZW50KTsKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBmYWxzZSwgTk9fU0VHTUVOVFMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGZvciBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhYnNvbHV0ZSBwYXRoLgotICAgKiBUaGUgVVJJIHdpbGwgYmUgcmVsYXRpdmUgaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcyBub24tbnVsbCwgYW5kCi0gICAqIGFic29sdXRlIG90aGVyd2lzZS4gCi0gICAqCi0gICAqIEBwYXJhbSBzZWdtZW50cyBhbiBhcnJheSBvZiBub24tbnVsbCBzdHJpbmdzLCBlYWNoIHJlcHJlc2VudGluZyBvbmUKLSAgICogc2VnbWVudCBvZiB0aGUgcGF0aC4gIEFzIGFuIGFic29sdXRlIHBhdGgsIGl0IGlzIGF1dG9tYXRpY2FsbHkKLSAgICogcHJlY2VlZGVkIGJ5IGEgPGNvZGU+LzwvY29kZT4gc2VwYXJhdG9yLiAgSWYgZGVzaXJlZCwgYSB0cmFpbGluZwotICAgKiBzZXBhcmF0b3Igc2hvdWxkIGJlIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5LXN0cmluZyBzZWdtZW50IGFzIHRoZSBsYXN0Ci0gICAqIGVsZW1lbnQgb2YgdGhlIGFycmF5LiAKLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4gaXMKLSAgICogYW4gPGEgaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJPC9hPiBzY2hlbWUgYW5kIAotICAgKiA8Y29kZT5kZXZpY2U8L2NvZGU+IGlzIG5vbi1udWxsLCBvciBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+LAotICAgKiA8Y29kZT5hdXRob3JpdHk8L2NvZGU+LCA8Y29kZT5kZXZpY2U8L2NvZGU+LCA8Y29kZT5zZWdtZW50czwvY29kZT4sCi0gICAqIDxjb2RlPnF1ZXJ5PC9jb2RlPiwgb3IgPGNvZGU+ZnJhZ21lbnQ8L2NvZGU+IGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8KLSAgICoge0BsaW5rICN2YWxpZFNjaGVtZSB2YWxpZFNjaGVtZX0sIHtAbGluayAjdmFsaWRBdXRob3JpdHkgdmFsaWRBdXRob3JpdHl9Ci0gICAqIG9yIHtAbGluayAjdmFsaWRBcmNoaXZlQXV0aG9yaXR5IHZhbGlkQXJjaGl2ZUF1dGhvcml0eX0sIHtAbGluawotICAgKiAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LCB7QGxpbmsgI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluawotICAgKiAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3Ige0BsaW5rICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LCBhcwotICAgKiBhcHByb3ByaWF0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUhpZXJhcmNoaWNhbFVSSShTdHJpbmcgc2NoZW1lLCBTdHJpbmcgYXV0aG9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRldmljZSwgU3RyaW5nW10gc2VnbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnksIFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIGlmIChpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKSAmJiBkZXZpY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhcmNoaXZlIFVSSSB3aXRoIGRldmljZSIpOwotICAgIH0KLQotICAgIHNlZ21lbnRzID0gZml4KHNlZ21lbnRzKTsKLSAgICB2YWxpZGF0ZVVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCB0cnVlLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCB0cnVlLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgZm9yIGEgcmVsYXRpdmUgaGllcmFyY2hpY2FsIFVSSSB3aXRoIHJlbGF0aXZlCi0gICAqIHBhdGguCi0gICAqCi0gICAqIEBwYXJhbSBzZWdtZW50cyBhbiBhcnJheSBvZiBub24tbnVsbCBzdHJpbmdzLCBlYWNoIHJlcHJlc2VudGluZyBvbmUKLSAgICogc2VnbWVudCBvZiB0aGUgcGF0aC4gIEEgdHJhaWxpbmcgc2VwYXJhdG9yIGlzIHJlcHJlc2VudGVkIGJ5IGFuCi0gICAqIGVtcHR5LXN0cmluZyBzZWdtZW50IGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+c2VnbWVudHM8L2NvZGU+LAotICAgKiA8Y29kZT5xdWVyeTwvY29kZT4sIG9yIDxjb2RlPmZyYWdtZW50PC9jb2RlPiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIAotICAgKiB7QGxpbmsgI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3IKLSAgICoge0BsaW5rICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LCByZXNwZWN0aXZlbHkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVIaWVyYXJjaGljYWxVUkkoU3RyaW5nW10gc2VnbWVudHMsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIHNlZ21lbnRzID0gZml4KHNlZ21lbnRzKTsKLSAgICB2YWxpZGF0ZVVSSSh0cnVlLCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLy8gQ29udmVydHMgbnVsbCB0byBsZW5ndGgtemVybyBhcnJheSwgYW5kIGNsb25lcyBhcnJheSB0byBlbnN1cmUKLSAgLy8gaW1tdXRhYmlsaXR5LgotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmaXgoU3RyaW5nW10gc2VnbWVudHMpCi0gIHsKLSAgICByZXR1cm4gc2VnbWVudHMgPT0gbnVsbCA/IE5PX1NFR01FTlRTIDogKFN0cmluZ1tdKXNlZ21lbnRzLmNsb25lKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgYmFzZWQgb24gcGFyc2luZyBhIFVSSSBzdHJpbmcsIHdpdGggCi0gICAqIDxhIGhyZWY9IiNkZXZpY2VfZXhwbGFuYXRpb24iPmV4cGxpY2l0IGRldmljZSBzdXBwb3J0PC9hPiBhbmQgaGFuZGxpbmcKLSAgICogZm9yIDxhIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlIFVSSXM8L2E+IGVuYWJsZWQuIFRoZQotICAgKiBzcGVjaWZpZWQgc3RyaW5nIGlzIHBhcnNlZCBhcyBkZXNjcmliZWQgaW4gPGEKLSAgICogaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjM5Ni50eHQiPlJGQyAyMzk2PC9hPiwgYW5kIGFuCi0gICAqIGFwcHJvcHJpYXRlIDxjb2RlPlVSSTwvY29kZT4gaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuICBOb3RlIHRoYXQKLSAgICogdmFsaWRpdHkgdGVzdGluZyBpcyBub3QgYXMgc3RyaWN0IGFzIGluIHRoZSBSRkM7IGVzc2VudGlhbGx5LCBvbmx5Ci0gICAqIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGFyZSBjb25zaWRlcmVkLiAgU28sIGZvciBleGFtcGxlLCBub24tTGF0aW4KLSAgICogYWxwaGFiZXQgY2hhcmFjdGVycyBhcHBlYXJpbmcgaW4gdGhlIHNjaGVtZSB3b3VsZCBub3QgYmUgY29uc2lkZXJlZCBhbgotICAgKiBlcnJvci4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBjb21wb25lbnQgcGFyc2VkCi0gICAqIGZyb20gPGNvZGU+dXJpPC9jb2RlPiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTY2hlbWUKLSAgICogdmFsaWRTY2hlbWV9LCB7QGxpbmsgI3ZhbGlkT3BhcXVlUGFydCB2YWxpZE9wYXF1ZVBhcnR9LCB7QGxpbmsKLSAgICogI3ZhbGlkQXV0aG9yaXR5IHZhbGlkQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZEFyY2hpdmVBdXRob3JpdHkKLSAgICogdmFsaWRBcmNoaXZlQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZERldmljZSB2YWxpZERldmljZX0sIHtAbGluawotICAgKiAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsKLSAgICogI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIGFzIGFwcHJvcHJpYXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlVVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlVVJJV2l0aENhY2hlKHVyaSk7IAotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCB0aGF0IGVuY29kZXMgYW5kIHBhcnNlcyB0aGUgZ2l2ZW4gVVJJIHN0cmluZy4KLSAgICogQXBwcm9wcmlhdGUgZW5jb2RpbmcgaXMgcGVyZm9ybWVkIGZvciBlYWNoIGNvbXBvbmVudCBvZiB0aGUgVVJJLgotICAgKiBJZiBtb3JlIHRoYW4gb25lIDxjb2RlPiM8L2NvZGU+IGlzIGluIHRoZSBzdHJpbmcsIHRoZSBsYXN0IG9uZSBpcwotICAgKiBhc3N1bWVkIHRvIGJlIHRoZSBmcmFnbWVudCdzIHNlcGFyYXRvciwgYW5kIGFueSBvdGhlcnMgYXJlIGVuY29kZWQuCi0gICAqICAKLSAgICogQHBhcmFtIGlnbm9yZUVzY2FwZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbGVhdmUgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycwotICAgKiB1bmVzY2FwZWQgaWYgdGhleSBhbHJlYWR5IGJlZ2luIGEgdmFsaWQgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGVuY29kZSBhbGwgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycy4gIE5vdGUgdGhhdAotICAgKiBpZiBhIDxjb2RlPiU8L2NvZGU+IGlzIG5vdCBmb2xsb3dlZCBieSAyIGhleCBkaWdpdHMsIGl0IHdpbGwgYWx3YXlzIGJlCi0gICAqIGVzY2FwZWQuIAotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGNvbXBvbmVudCBwYXJzZWQKLSAgICogZnJvbSA8Y29kZT51cmk8L2NvZGU+IGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNjaGVtZQotICAgKiB2YWxpZFNjaGVtZX0sIHtAbGluayAjdmFsaWRPcGFxdWVQYXJ0IHZhbGlkT3BhcXVlUGFydH0sIHtAbGluawotICAgKiAjdmFsaWRBdXRob3JpdHkgdmFsaWRBdXRob3JpdHl9LCB7QGxpbmsgI3ZhbGlkQXJjaGl2ZUF1dGhvcml0eQotICAgKiB2YWxpZEFyY2hpdmVBdXRob3JpdHl9LCB7QGxpbmsgI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwge0BsaW5rCi0gICAqICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yIHtAbGluawotICAgKiAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwgYXMgYXBwcm9wcmlhdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZVVSSVdpdGhDYWNoZShlbmNvZGVVUkkodXJpLCBpZ25vcmVFc2NhcGVkKSk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGJhc2VkIG9uIHBhcnNpbmcgYSBVUkkgc3RyaW5nLCB3aXRoIAotICAgKiA8YSBocmVmPSIjZGV2aWNlX2V4cGxhbmF0aW9uIj5leHBsaWNpdCBkZXZpY2Ugc3VwcG9ydDwvYT4gZW5hYmxlZC4gIAotICAgKiBOb3RlIHRoYXQgdmFsaWRpdHkgdGVzdGluZyBpcyBub3QgYSBzdHJpY3QgYXMgaW4gdGhlIFJGQzsgZXNzZW50aWFsbHksCi0gICAqIG9ubHkgc2VwYXJhdG9yIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQuICBTbywgZm9yIGV4YW1wbGUsIG5vbi1MYXRpbgotICAgKiBhbHBoYWJldCBjaGFyYWN0ZXJzIGFwcGVhcmluZyBpbiB0aGUgc2NoZW1lIHdvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFuCi0gICAqIGVycm9yLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGNvbXBvbmVudCBwYXJzZWQKLSAgICogZnJvbSA8Y29kZT51cmk8L2NvZGU+IGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNjaGVtZQotICAgKiB2YWxpZFNjaGVtZX0sIHtAbGluayAjdmFsaWRPcGFxdWVQYXJ0IHZhbGlkT3BhcXVlUGFydH0sIHtAbGluawotICAgKiAjdmFsaWRBdXRob3JpdHkgdmFsaWRBdXRob3JpdHl9LCB7QGxpbmsgI3ZhbGlkQXJjaGl2ZUF1dGhvcml0eQotICAgKiB2YWxpZEFyY2hpdmVBdXRob3JpdHl9LCB7QGxpbmsgI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwge0BsaW5rCi0gICAqICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yIHtAbGluawotICAgKiAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwgYXMgYXBwcm9wcmlhdGUuCi0gICAqCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2NyZWF0ZVVSSSBjcmVhdGVVUkl9LCB3aGljaCBub3cgaGFzIGV4cGxpY2l0Ci0gICAqIGRldmljZSBzdXBwb3J0IGVuYWJsZWQuIFRoZSB0d28gbWV0aG9kcyBub3cgb3BlcmF0ZSBpZGVudGljYWxseS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZURldmljZVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZVVSSVdpdGhDYWNoZSh1cmkpOwotICB9Ci0KLSAgLy8gVXNlcyBhIGNhY2hlIHRvIHNwZWVkIHVwIGNyZWF0aW9uIG9mIGEgVVJJIGZyb20gYSBzdHJpbmcuICBUaGUgY2FjaGUKLSAgLy8gaXMgY29uc3VsdGVkIHRvIHNlZSBpZiB0aGUgVVJJLCBsZXNzIGFueSBmcmFnbWVudCwgaGFzIGFscmVhZHkgYmVlbgotICAvLyBjcmVhdGVkLiAgSWYgbmVlZGVkLCB0aGUgZnJhZ21lbnQgaXMgcmUtYXBwZW5kZWQgdG8gdGhlIGNhY2hlZCBVUkksCi0gIC8vIHdoaWNoIGlzIGNvbnNpZGVyYWJseSBtb3JlIGVmZmljaWVudCB0aGFuIGNyZWF0aW5nIHRoZSB3aG9sZSBVUkkgZnJvbQotICAvLyBzY3JhdGNoLiAgSWYgdGhlIFVSSSB3YXNuJ3QgZm91bmQgaW4gdGhlIGNhY2hlLCBpdCBpcyBjcmVhdGVkIHVzaW5nCi0gIC8vIHBhcnNlSW50b1VSSSgpIGFuZCB0aGVuIGNhY2hlZC4gIFRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgdXNlZAotICAvLyBieSBzdHJpbmctcGFyc2luZyBmYWN0b3J5IG1ldGhvZHMsIGluc3RlYWQgb2YgcGFyc2VJbnRvVVJJKCkgZGlyZWN0bHkuCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCB3YXMgaW5jbHVkZWQgaW4gdGhlIHB1YmxpYyBBUEkgYnkgbWlzdGFrZS4KLSAgICogCi0gICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Uge0BsaW5rICNjcmVhdGVVUkkgY3JlYXRlVVJJfSBpbnN0ZWFkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlVVJJV2l0aENhY2hlKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpbnQgaSA9IHVyaS5pbmRleE9mKEZSQUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgU3RyaW5nIGJhc2UgPSBpID09IC0xID8gdXJpIDogdXJpLnN1YnN0cmluZygwLCBpKTsKLSAgICBTdHJpbmcgZnJhZ21lbnQgPSBpID09IC0xID8gbnVsbCA6IHVyaS5zdWJzdHJpbmcoaSArIDEpOwotCi0gICAgVVJJIHJlc3VsdCA9IChVUkkpdXJpQ2FjaGUuZ2V0KGJhc2UpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHBhcnNlSW50b1VSSShiYXNlKTsKLSAgICAgIHVyaUNhY2hlLnB1dChiYXNlLCByZXN1bHQpOwotICAgIH0KLQotICAgIGlmIChmcmFnbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHJlc3VsdC5hcHBlbmRGcmFnbWVudChmcmFnbWVudCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBTdHJpbmctcGFyc2luZyBpbXBsZW1lbnRhdGlvbi4KLSAgcHJpdmF0ZSBzdGF0aWMgVVJJIHBhcnNlSW50b1VSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgYm9vbGVhbiBoaWVyYXJjaGljYWwgPSB0cnVlOwotICAgIFN0cmluZyBzY2hlbWUgPSBudWxsOwotICAgIFN0cmluZyBhdXRob3JpdHkgPSBudWxsOwotICAgIFN0cmluZyBkZXZpY2UgPSBudWxsOwotICAgIGJvb2xlYW4gYWJzb2x1dGVQYXRoID0gZmFsc2U7Ci0gICAgU3RyaW5nW10gc2VnbWVudHMgPSBOT19TRUdNRU5UUzsKLSAgICBTdHJpbmcgcXVlcnkgPSBudWxsOwotICAgIFN0cmluZyBmcmFnbWVudCA9IG51bGw7Ci0KLSAgICBpbnQgaSA9IDA7Ci0gICAgaW50IGogPSBmaW5kKHVyaSwgaSwgTUFKT1JfU0VQQVJBVE9SX0hJLCBNQUpPUl9TRVBBUkFUT1JfTE8pOwotCi0gICAgaWYgKGogPCB1cmkubGVuZ3RoKCkgJiYgdXJpLmNoYXJBdChqKSA9PSBTQ0hFTUVfU0VQQVJBVE9SKQotICAgIHsKLSAgICAgIHNjaGVtZSA9IHVyaS5zdWJzdHJpbmcoaSwgaik7Ci0gICAgICBpID0gaiArIDE7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBhcmNoaXZlU2NoZW1lID0gaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSk7Ci0gICAgaWYgKGFyY2hpdmVTY2hlbWUpCi0gICAgewotICAgICAgaiA9IHVyaS5sYXN0SW5kZXhPZihBUkNISVZFX1NFUEFSQVRPUik7Ci0gICAgICBpZiAoaiA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gYXJjaGl2ZSBzZXBhcmF0b3IiKTsKLSAgICAgIH0KLSAgICAgIGhpZXJhcmNoaWNhbCA9IHRydWU7Ci0gICAgICBhdXRob3JpdHkgPSB1cmkuc3Vic3RyaW5nKGksICsraik7Ci0gICAgICBpID0gajsKLSAgICB9Ci0gICAgZWxzZSBpZiAodXJpLnN0YXJ0c1dpdGgoQVVUSE9SSVRZX1NFUEFSQVRPUiwgaSkpCi0gICAgewotICAgICAgaSArPSBBVVRIT1JJVFlfU0VQQVJBVE9SLmxlbmd0aCgpOwotICAgICAgaiA9IGZpbmQodXJpLCBpLCBTRUdNRU5UX0VORF9ISSwgU0VHTUVOVF9FTkRfTE8pOwotICAgICAgYXV0aG9yaXR5ID0gdXJpLnN1YnN0cmluZyhpLCBqKTsKLSAgICAgIGkgPSBqOwotICAgIH0KLSAgICBlbHNlIGlmIChzY2hlbWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgIChpID09IHVyaS5sZW5ndGgoKSB8fCB1cmkuY2hhckF0KGkpICE9IFNFR01FTlRfU0VQQVJBVE9SKSkKLSAgICB7Ci0gICAgICBoaWVyYXJjaGljYWwgPSBmYWxzZTsKLSAgICAgIGogPSB1cmkuaW5kZXhPZihGUkFHTUVOVF9TRVBBUkFUT1IsIGkpOwotICAgICAgaWYgKGogPT0gLTEpIGogPSB1cmkubGVuZ3RoKCk7Ci0gICAgICBhdXRob3JpdHkgPSB1cmkuc3Vic3RyaW5nKGksIGopOwotICAgICAgaSA9IGo7Ci0gICAgfQotCi0gICAgaWYgKCFhcmNoaXZlU2NoZW1lICYmIGkgPCB1cmkubGVuZ3RoKCkgJiYgdXJpLmNoYXJBdChpKSA9PSBTRUdNRU5UX1NFUEFSQVRPUikKLSAgICB7Ci0gICAgICBqID0gZmluZCh1cmksIGkgKyAxLCBTRUdNRU5UX0VORF9ISSwgU0VHTUVOVF9FTkRfTE8pOwotICAgICAgU3RyaW5nIHMgPSB1cmkuc3Vic3RyaW5nKGkgKyAxLCBqKTsKLSAgICAgIAotICAgICAgaWYgKHMubGVuZ3RoKCkgPiAwICYmIHMuY2hhckF0KHMubGVuZ3RoKCkgLSAxKSA9PSBERVZJQ0VfSURFTlRJRklFUikKLSAgICAgIHsKLSAgICAgICAgZGV2aWNlID0gczsKLSAgICAgICAgaSA9IGo7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGkgPCB1cmkubGVuZ3RoKCkgJiYgdXJpLmNoYXJBdChpKSA9PSBTRUdNRU5UX1NFUEFSQVRPUikKLSAgICB7Ci0gICAgICBpKys7Ci0gICAgICBhYnNvbHV0ZVBhdGggPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChzZWdtZW50c1JlbWFpbih1cmksIGkpKQotICAgIHsKLSAgICAgIExpc3Qgc2VnbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgIHdoaWxlIChzZWdtZW50c1JlbWFpbih1cmksIGkpKQotICAgICAgewotICAgICAgICBqID0gZmluZCh1cmksIGksIFNFR01FTlRfRU5EX0hJLCBTRUdNRU5UX0VORF9MTyk7Ci0gICAgICAgIHNlZ21lbnRMaXN0LmFkZCh1cmkuc3Vic3RyaW5nKGksIGopKTsKLSAgICAgICAgaSA9IGo7Ci0KLSAgICAgICAgaWYgKGkgPCB1cmkubGVuZ3RoKCkgJiYgdXJpLmNoYXJBdChpKSA9PSBTRUdNRU5UX1NFUEFSQVRPUikKLSAgICAgICAgewotICAgICAgICAgIGlmICghc2VnbWVudHNSZW1haW4odXJpLCArK2kpKSBzZWdtZW50TGlzdC5hZGQoU0VHTUVOVF9FTVBUWSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHNlZ21lbnRzID0gbmV3IFN0cmluZ1tzZWdtZW50TGlzdC5zaXplKCldOwotICAgICAgc2VnbWVudExpc3QudG9BcnJheShzZWdtZW50cyk7Ci0gICAgfQotCi0gICAgaWYgKGkgPCB1cmkubGVuZ3RoKCkgJiYgdXJpLmNoYXJBdChpKSA9PSBRVUVSWV9TRVBBUkFUT1IpCi0gICAgewotICAgICAgaiA9IHVyaS5pbmRleE9mKEZSQUdNRU5UX1NFUEFSQVRPUiwgKytpKTsKLSAgICAgIGlmIChqID09IC0xKSBqID0gdXJpLmxlbmd0aCgpOwotICAgICAgcXVlcnkgPSB1cmkuc3Vic3RyaW5nKGksIGopOwotICAgICAgaSA9IGo7Ci0gICAgfQotCi0gICAgaWYgKGkgPCB1cmkubGVuZ3RoKCkpIC8vICYmIHVyaS5jaGFyQXQoaSkgPT0gRlJBR01FTlRfU0VQQVJBVE9SIChpbXBsaWVkKQotICAgIHsKLSAgICAgIGZyYWdtZW50ID0gdXJpLnN1YnN0cmluZygrK2kpOwotICAgIH0KLQotICAgIHZhbGlkYXRlVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgICByZXR1cm4gbmV3IFVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvLyBDaGVja3Mgd2hldGhlciB0aGUgc3RyaW5nIGNvbnRhaW5zIGFueSBtb3JlIHNlZ21lbnRzIGFmdGVyIHRoZSBvbmUgdGhhdAotICAvLyBzdGFydHMgYXQgcG9zaXRpb24gaS4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZWdtZW50c1JlbWFpbihTdHJpbmcgdXJpLCBpbnQgaSkKLSAgewotICAgIHJldHVybiBpIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaSkgIT0gUVVFUllfU0VQQVJBVE9SICYmCi0gICAgICB1cmkuY2hhckF0KGkpICE9IEZSQUdNRU5UX1NFUEFSQVRPUjsKLSAgfQotCi0gIC8vIEZpbmRzIHRoZSBuZXh0IG9jY3VyYW5jZSBvZiBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHNldCByZXByZXNlbnRlZAotICAvLyBieSB0aGUgZ2l2ZW4gYml0bWFzayBpbiB0aGUgZ2l2ZW4gc3RyaW5nLCBiZWdpbm5pbmcgYXQgaW5kZXggaS4gVGhlIGluZGV4Ci0gIC8vIG9mIHRoZSBmaXJzdCBmb3VuZCBjaGFyYWN0ZXIsIG9yIHMubGVuZ3RoKCkgaWYgdGhlcmUgaXMgbm9uZSwgaXMKLSAgLy8gcmV0dXJuZWQuICBCZWZvcmUgc2VhcmNoaW5nLCBpIGlzIGxpbWl0ZWQgdG8gdGhlIHJhbmdlIFswLCBzLmxlbmd0aCgpXS4KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmQoU3RyaW5nIHMsIGludCBpLCBsb25nIGhpZ2hCaXRtYXNrLCBsb25nIGxvd0JpdG1hc2spCi0gIHsKLSAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKLSAgICBpZiAoaSA+PSBsZW4pIHJldHVybiBsZW47Ci0KLSAgICBmb3IgKGkgPSBpID4gMCA/IGkgOiAwOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKG1hdGNoZXMocy5jaGFyQXQoaSksIGhpZ2hCaXRtYXNrLCBsb3dCaXRtYXNrKSkgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBiYXNlZCBvbiBwYXJzaW5nIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gcGF0aAotICAgKiBzdHJpbmcuICBUaGUgPGNvZGU+cGF0aE5hbWU8L2NvZGU+IGlzIGNvbnZlcnRlZCBpbnRvIGFuIGFwcHJvcHJpYXRlCi0gICAqIGZvcm0sIGFzIGZvbGxvd3M6IHBsYXRmb3JtIHNwZWNpZmljIHBhdGggc2VwYXJhdG9ycyBhcmUgY29udmVydGVkIHRvCi0gICAqIDxjb2RlPi88Y29kZT47IHRoZSBwYXRoIGlzIGVuY29kZWQ7IGFuZCBhICJmaWxlIiBzY2hlbWUgYW5kLCBpZiBtaXNzaW5nLAotICAgKiBhIGxlYWRpbmcgPGNvZGU+LzwvY29kZT4sIGFyZSBhZGRlZCB0byBhbiBhYnNvbHV0ZSBwYXRoLiAgVGhlIHJlc3VsdAotICAgKiBpcyB0aGVuIHBhcnNlZCB1c2luZyB7QGxpbmsgI2NyZWF0ZVVSSShTdHJpbmcpIGNyZWF0ZVVSSX0uCi0gICAqCi0gICAqIDxwPlRoZSBlbmNvZGluZyBzdGVwIGVzY2FwZXMgYWxsIHNwYWNlcywgPGNvZGU+IzwvY29kZT4gY2hhcmFjdGVycywgYW5kCi0gICAqIG90aGVyIGNoYXJhY3RlcnMgZGlzYWxsb3dlZCBpbiBVUklzLCBhcyB3ZWxsIGFzIDxjb2RlPj88L2NvZGU+LCB3aGljaAotICAgKiB3b3VsZCBkZWxpbWl0IGEgcGF0aCBmcm9tIGEgcXVlcnkuICBEZWNvZGluZyBpcyBhdXRvbWF0aWNhbGx5IHBlcmZvcm1lZAotICAgKiBieSB7QGxpbmsgI3RvRmlsZVN0cmluZyB0b0ZpbGVTdHJpbmd9LCBhbmQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIHZhbHVlcwotICAgKiByZXR1cm5lZCBieSBvdGhlciBhY2Nlc3NvcnMgYnkgdmlhIHRoZSBzdGF0aWMge0BsaW5rICNkZWNvZGUoU3RyaW5nKQotICAgKiBkZWNvZGV9IG1ldGhvZC4KLSAgICoKLSAgICogPHA+QSByZWxhdGl2ZSBwYXRoIHdpdGggYSBzcGVjaWZpZWQgZGV2aWNlIChzb21ldGhpbmcgbGlrZQotICAgKiA8Y29kZT5DOm15ZmlsZS50eHQ8L2NvZGU+KSBjYW5ub3QgYmUgZXhwcmVzc2VkIGFzIGEgdmFsaWQgVVJJLgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnBhdGhOYW1lPC9jb2RlPgotICAgKiBzcGVjaWZpZXMgYSBkZXZpY2UgYW5kIGEgcmVsYXRpdmUgcGF0aCwgb3IgaWYgYW55IGNvbXBvbmVudCBvZiB0aGUgcGF0aAotICAgKiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRBdXRob3JpdHkgdmFsaWRBdXRob3JpdHl9LCB7QGxpbmsKLSAgICogI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwgb3Ige0BsaW5rICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LAotICAgKiB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUZpbGVVUkkoU3RyaW5nIHBhdGhOYW1lKQotICB7Ci0gICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aE5hbWUpOwotICAgIFN0cmluZyB1cmkgPSBGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nID8gcGF0aE5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsIFNFR01FTlRfU0VQQVJBVE9SKSA6IHBhdGhOYW1lOwotICAgIHVyaSA9IGVuY29kZSh1cmksIFBBVEhfQ0hBUl9ISSwgUEFUSF9DSEFSX0xPLCBmYWxzZSk7Ci0gICAgaWYgKGZpbGUuaXNBYnNvbHV0ZSgpKQotICAgIHsKLSAgICAgIFVSSSByZXN1bHQgPSBjcmVhdGVVUkkoKHVyaS5jaGFyQXQoMCkgPT0gU0VHTUVOVF9TRVBBUkFUT1IgPyAiZmlsZToiIDogImZpbGU6LyIpICsgdXJpKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBVUkkgcmVzdWx0ID0gY3JlYXRlVVJJKHVyaSk7Ci0gICAgICBpZiAocmVzdWx0LnNjaGVtZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgcmVsYXRpdmUgcGF0aE5hbWU6ICIgKyBwYXRoTmFtZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgYmFzZWQgb24gcGFyc2luZyBhIHBsYXRmb3JtLXJlbGF0aXZlIHBhdGggc3RyaW5nLgotICAgKgotICAgKiA8cD5UaGUgPGNvZGU+cGF0aE5hbWU8L2NvZGU+IG11c3QgYmUgb2YgdGhlIGZvcm06Ci0gICAqIDxwcmU+Ci0gICAqICAgL3Byb2plY3QtbmFtZS9wYXRoPC9wcmU+Ci0gICAqCi0gICAqIDxwPlBsYXRmb3JtLXNwZWNpZmljIHBhdGggc2VwYXJhdG9ycyB3aWxsIGJlIGNvbnZlcnRlcnRlZCB0byBzbGFzaGVzLgotICAgKiBJZiBub3QgaW5jbHVkZWQsIHRoZSBsZWFkaW5nIHBhdGggc2VwYXJhdG9yIHdpbGwgYmUgYWRkZWQuICBUaGUKLSAgICogcmVzdWx0IHdpbGwgYmUgb2YgdGhpcyBmb3JtLCB3aGljaCBpcyBwYXJzZWQgdXNpbmcge0BsaW5rICNjcmVhdGVVUkkKLSAgICogY3JlYXRlVVJJfToKLSAgICogPHByZT4KLSAgICogICBwbGF0Zm9ybTovcmVzb3VyY2UvcHJvamVjdC1uYW1lL3BhdGg8L3ByZT4KLSAgICoKLSAgICogCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY29tcG9uZW50IHBhcnNlZAotICAgKiBmcm9tIHRoZSBwYXRoIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZERldmljZSB2YWxpZERldmljZX0sCi0gICAqIHtAbGluayAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvcgotICAgKiB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0uCi0gICAqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtI3Jlc29sdmUKLSAgICogQHNlZSAjY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShTdHJpbmcsIGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKFN0cmluZyBwYXRoTmFtZSkKLSAgewotICAgIHJldHVybiBjcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHBhdGhOYW1lLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGJhc2VkIG9uIHBhcnNpbmcgYSBwbGF0Zm9ybS1yZWxhdGl2ZSBwYXRoIHN0cmluZywKLSAgICogd2l0aCBhbiBvcHRpb24gdG8gZW5jb2RlIHRoZSBjcmVhdGVkIFVSSS4KLSAgICoKLSAgICogPHA+VGhlIDxjb2RlPnBhdGhOYW1lPC9jb2RlPiBtdXN0IGJlIG9mIHRoZSBmb3JtOgotICAgKiA8cHJlPgotICAgKiAgIC9wcm9qZWN0LW5hbWUvcGF0aDwvcHJlPgotICAgKgotICAgKiA8cD5QbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHNlcGFyYXRvcnMgd2lsbCBiZSBjb252ZXJ0ZXJ0ZWQgdG8gc2xhc2hlcy4KLSAgICogSWYgbm90IGluY2x1ZGVkLCB0aGUgbGVhZGluZyBwYXRoIHNlcGFyYXRvciB3aWxsIGJlIGFkZGVkLiAgVGhlCi0gICAqIHJlc3VsdCB3aWxsIGJlIG9mIHRoaXMgZm9ybSwgd2hpY2ggaXMgcGFyc2VkIHVzaW5nIHtAbGluayAjY3JlYXRlVVJJCi0gICAqIGNyZWF0ZVVSSX06Ci0gICAqIDxwcmU+Ci0gICAqICAgcGxhdGZvcm06L3Jlc291cmNlL3Byb2plY3QtbmFtZS9wYXRoPC9wcmU+Ci0gICAqCi0gICAqIDxwPlRoaXMgc2NoZW1lIHN1cHBvcnRzIHJlbG9jYXRhYmxlIHByb2plY3RzIGluIEVjbGlwc2UgYW5kIGluCi0gICAqIHN0YW5kLWFsb25lIC4KLSAgICoKLSAgICogPHA+RGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5lbmNvZGU8L2NvZGU+IGFyZ3VtZW50LCB0aGUgcGF0aCBtYXkgYmUKLSAgICogYXV0b21hdGljYWxseSBlbmNvZGVkIHRvIGVzY2FwZSBhbGwgc3BhY2VzLCA8Y29kZT4jPC9jb2RlPiBjaGFyYWN0ZXJzLAotICAgKiBhbmQgb3RoZXIgY2hhcmFjdGVycyBkaXNhbGxvd2VkIGluIFVSSXMsIGFzIHdlbGwgYXMgPGNvZGU+PzwvY29kZT4sCi0gICAqIHdoaWNoIHdvdWxkIGRlbGltaXQgYSBwYXRoIGZyb20gYSBxdWVyeS4gIERlY29kaW5nIGNhbiBiZSBwZXJmb3JtZWQgd2l0aAotICAgKiB0aGUgc3RhdGljIHtAbGluayAjZGVjb2RlKFN0cmluZykgZGVjb2RlfSBtZXRob2QuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGNvbXBvbmVudCBwYXJzZWQKLSAgICogZnJvbSB0aGUgcGF0aCBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LAotICAgKiB7QGxpbmsgI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3IKLSAgICoge0BsaW5rICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LgotICAgKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybSNyZXNvbHZlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKFN0cmluZyBwYXRoTmFtZSwgYm9vbGVhbiBlbmNvZGUpCi0gIHsKLSAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9IFNFR01FTlRfU0VQQVJBVE9SKQotICAgIHsKLSAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsIFNFR01FTlRfU0VQQVJBVE9SKTsKLSAgICB9Ci0KLSAgICBpZiAoZW5jb2RlKQotICAgIHsKLSAgICAgIHBhdGhOYW1lID0gZW5jb2RlKHBhdGhOYW1lLCBQQVRIX0NIQVJfSEksIFBBVEhfQ0hBUl9MTywgZmFsc2UpOwotICAgIH0KLSAgICBVUkkgcmVzdWx0ID0gY3JlYXRlVVJJKChwYXRoTmFtZS5jaGFyQXQoMCkgPT0gU0VHTUVOVF9TRVBBUkFUT1IgPyAicGxhdGZvcm06L3Jlc291cmNlIiA6ICJwbGF0Zm9ybTovcmVzb3VyY2UvIikgKyBwYXRoTmFtZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgLy8gUHJpdmF0ZSBjb25zdHJ1Y3RvciBmb3IgdXNlIG9mIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMuCi0gIHByaXZhdGUgVVJJKGJvb2xlYW4gaGllcmFyY2hpY2FsLCBTdHJpbmcgc2NoZW1lLCBTdHJpbmcgYXV0aG9yaXR5LAotICAgICAgICAgICAgICBTdHJpbmcgZGV2aWNlLCBib29sZWFuIGFic29sdXRlUGF0aCwgU3RyaW5nW10gc2VnbWVudHMsCi0gICAgICAgICAgICAgIFN0cmluZyBxdWVyeSwgU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgaW50IGhhc2hDb2RlID0gMDsKLSAgICAvL2Jvb2xlYW4gaXJpID0gZmFsc2U7Ci0KLSAgICBpZiAoaGllcmFyY2hpY2FsKQotICAgIHsKLSAgICAgICsraGFzaENvZGU7Ci0gICAgfQotICAgIGlmIChhYnNvbHV0ZVBhdGgpCi0gICAgewotICAgICAgaGFzaENvZGUgKz0gMjsKLSAgICB9Ci0gICAgaWYgKHNjaGVtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGhhc2hDb2RlIF49IHNjaGVtZS50b0xvd2VyQ2FzZSgpLmhhc2hDb2RlKCk7Ci0gICAgfQotICAgIGlmIChhdXRob3JpdHkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNoQ29kZSBePSBhdXRob3JpdHkuaGFzaENvZGUoKTsKLSAgICAgIC8vaXJpID0gaXJpIHx8IGNvbnRhaW5zTm9uQVNDSUkoYXV0aG9yaXR5KTsKLSAgICB9Ci0gICAgaWYgKGRldmljZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGhhc2hDb2RlIF49IGRldmljZS5oYXNoQ29kZSgpOwotICAgICAgLy9pcmkgPSBpcmkgfHwgY29udGFpbnNOb25BU0NJSShkZXZpY2UpOwotICAgIH0KLSAgICBpZiAocXVlcnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNoQ29kZSBePSBxdWVyeS5oYXNoQ29kZSgpOwotICAgICAgLy9pcmkgPSBpcmkgfHwgY29udGFpbnNOb25BU0NJSShxdWVyeSk7Ci0gICAgfQotICAgIGlmIChmcmFnbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGhhc2hDb2RlIF49IGZyYWdtZW50Lmhhc2hDb2RlKCk7Ci0gICAgICAvL2lyaSA9IGlyaSB8fCBjb250YWluc05vbkFTQ0lJKGZyYWdtZW50KTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gc2VnbWVudHNbaV0uaGFzaENvZGUoKTsKLSAgICAgIC8vaXJpID0gaXJpIHx8IGNvbnRhaW5zTm9uQVNDSUkoc2VnbWVudHNbaV0pOwotICAgIH0KLQotICAgIHRoaXMuaGFzaENvZGUgPSBoYXNoQ29kZTsKLSAgICAvL3RoaXMuaXJpID0gaXJpOwotICAgIHRoaXMuaGllcmFyY2hpY2FsID0gaGllcmFyY2hpY2FsOwotICAgIHRoaXMuc2NoZW1lID0gc2NoZW1lID09IG51bGwgPyBudWxsIDogc2NoZW1lLmludGVybigpOwotICAgIHRoaXMuYXV0aG9yaXR5ID0gYXV0aG9yaXR5OwotICAgIHRoaXMuZGV2aWNlID0gZGV2aWNlOwotICAgIHRoaXMuYWJzb2x1dGVQYXRoID0gYWJzb2x1dGVQYXRoOwotICAgIHRoaXMuc2VnbWVudHMgPSBzZWdtZW50czsKLSAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7Ci0gICAgdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50OwotICB9Ci0gIAotICAvLyBWYWxpZGF0ZXMgYWxsIG9mIHRoZSBVUkkgY29tcG9uZW50cy4gIEZhY3RvcnkgbWV0aG9kcyBzaG91bGQgY2FsbCB0aGlzCi0gIC8vIGJlZm9yZSB1c2luZyB0aGUgY29uc3RydWN0b3IsIHRob3VnaCB0aGV5IG11c3QgZW5zdXJlIHRoYXQgdGhlCi0gIC8vIGludGVyLWNvbXBvbmVudCByZXF1aXJlbWVudHMgZGVzY3JpYmVkIGluIHRoZWlyIG93biBKYXZhZG9jcyBhcmUgYWxsCi0gIC8vIHNhdGlzZmllZCwgdGhlbXNlbHZlcy4gIElmIGEgbmV3IFVSSSBpcyBiZWluZyBjb25zdHJ1Y3RlZCBvdXQgb2YKLSAgLy8gYW4gZXhpc3RpbmcgVVJJLCB0aGlzIG5lZWQgbm90IGJlIGNhbGxlZC4gIEluc3RlYWQsIGp1c3QgdGhlIG5ldwotICAvLyBjb21wb25lbnRzIG1heSBiZSB2YWxpZGF0ZWQgaW5kaXZpZHVhbGx5LgotICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlVVJJKGJvb2xlYW4gaGllcmFyY2hpY2FsLCBTdHJpbmcgc2NoZW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhvcml0eSwgU3RyaW5nIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWJzb2x1dGVQYXRoLCBTdHJpbmdbXSBzZWdtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeSwgU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgaWYgKCF2YWxpZFNjaGVtZShzY2hlbWUpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc2NoZW1lOiAiICsgc2NoZW1lKTsKLSAgICB9Ci0gICAgaWYgKCFoaWVyYXJjaGljYWwgJiYgIXZhbGlkT3BhcXVlUGFydChhdXRob3JpdHkpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgb3BhcXVlUGFydDogIiArIGF1dGhvcml0eSk7Ci0gICAgfQotICAgIGlmIChoaWVyYXJjaGljYWwgJiYgIWlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpICYmICF2YWxpZEF1dGhvcml0eShhdXRob3JpdHkpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgYXV0aG9yaXR5OiAiICsgYXV0aG9yaXR5KTsKLSAgICB9Ci0gICAgaWYgKGhpZXJhcmNoaWNhbCAmJiBpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKSAmJiAhdmFsaWRBcmNoaXZlQXV0aG9yaXR5KGF1dGhvcml0eSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBhdXRob3JpdHk6ICIgKyBhdXRob3JpdHkpOwotICAgIH0KLSAgICBpZiAoIXZhbGlkRGV2aWNlKGRldmljZSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBkZXZpY2U6ICIgKyBkZXZpY2UpOwotICAgIH0KLSAgICBpZiAoIXZhbGlkU2VnbWVudHMoc2VnbWVudHMpKQotICAgIHsKLSAgICAgIFN0cmluZyBzID0gc2VnbWVudHMgPT0gbnVsbCA/ICJpbnZhbGlkIHNlZ21lbnRzOiAiICsgc2VnbWVudHMgOgotICAgICAgICAiaW52YWxpZCBzZWdtZW50OiAiICsgZmlyc3RJbnZhbGlkU2VnbWVudChzZWdtZW50cyk7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHMpOwotICAgIH0KLSAgICBpZiAoIXZhbGlkUXVlcnkocXVlcnkpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgcXVlcnk6ICIgKyBxdWVyeSk7Ci0gICAgfQotICAgIGlmICghdmFsaWRGcmFnbWVudChmcmFnbWVudCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBmcmFnbWVudDogIiArIGZyYWdtZW50KTsKLSAgICB9Ci0gIH0KLQotICAvLyBBbHRlcm5hdGUsIHN0cmljdGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHZhbGlkYXRpb24gbWV0aG9kcwotICAvLyBhcmUgcHJvdmlkZWQsIGNvbW1lbnRlZCBvdXQsIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlLi4uCi0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIHNjaGVtZSBjb21wb25lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgc2NoZW1lIG1heSBiZSBudWxsIG9yIGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgZXhjZXB0IGZvciB0aGUKLSAgICogZm9sbG93aW5nOiA8Y29kZT46IC8gPyAjPC9jb2RlPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkU2NoZW1lKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8ICFjb250YWlucyh2YWx1ZSwgTUFKT1JfU0VQQVJBVE9SX0hJLCBNQUpPUl9TRVBBUkFUT1JfTE8pOyAgCi0KLSAgLy8gPHA+QSB2YWxpZCBzY2hlbWUgbWF5IGJlIG51bGwsIG9yIGNvbnNpc3Qgb2YgYSBzaW5nbGUgbGV0dGVyIGZvbGxvd2VkCi0gIC8vIGJ5IGFueSBudW1iZXIgb2YgbGV0dGVycywgbnVtYmVycywgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKLSAgLy8gPGNvZGU+KyAtIC48L2NvZGU+Ci0KLSAgICAvL2lmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAgICAvL3JldHVybiB2YWx1ZS5sZW5ndGgoKSAhPSAwICYmCi0gICAgLy8gIG1hdGNoZXModmFsdWUuY2hhckF0KDApLCBBTFBIQV9ISSwgQUxQSEFfTE8pICYmCi0gICAgLy8gIHZhbGlkYXRlKHZhbHVlLCBTQ0hFTUVfQ0hBUl9ISSwgU0NIRU1FX0NIQVJfTE8sIGZhbHNlLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgb3BhcXVlIHBhcnQgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICogb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIG9wYXF1ZSBwYXJ0IG11c3QgYmUgbm9uLW51bGwsIG5vbi1lbXB0eSwgYW5kIG5vdCBjb250YWluIHRoZQotICAgKiA8Y29kZT4jPC9jb2RlPiBjaGFyYWN0ZXIuICBJbiBhZGRpdGlvbiwgaXRzIGZpcnN0IGNoYXJhY3RlciBtdXN0IG5vdCBiZQotICAgKiA8Y29kZT4vPC9jb2RlPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkT3BhcXVlUGFydChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5pbmRleE9mKEZSQUdNRU5UX1NFUEFSQVRPUikgPT0gLTEgJiYKLSAgICB2YWx1ZS5sZW5ndGgoKSA+IDAgJiYgdmFsdWUuY2hhckF0KDApICE9IFNFR01FTlRfU0VQQVJBVE9SOwotCi0gIC8vIDxwPkEgdmFsaWQgb3BhcXVlIHBhcnQgbXVzdCBiZSBub24tbnVsbCBhbmQgbm9uLWVtcHR5LiBJdCBtYXkgY29udGFpbgotICAvLyBhbnkgYWxsb3dlZCBVUkkgY2hhcmFjdGVycywgYnV0IGl0cyBmaXJzdCBjaGFyYWN0ZXIgbWF5IG5vdCBiZQotICAvLyA8Y29kZT4vPC9jb2RlPiAKLQotICAgIC8vcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgIT0gMCAmJgotICAgIC8vICB2YWx1ZS5jaGFyQXQoMCkgIT0gU0VHTUVOVF9TRVBBUkFUT1IgJiYKLSAgICAvLyAgdmFsaWRhdGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIHRydWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIGF1dGhvcml0eSBjb21wb25lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgYXV0aG9yaXR5IG1heSBiZSBudWxsIG9yIGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgZXhjZXB0IGZvcgotICAgKiB0aGUgZm9sbG93aW5nOiA8Y29kZT4vID8gIzwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZEF1dGhvcml0eShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCAhY29udGFpbnModmFsdWUsIFNFR01FTlRfRU5EX0hJLCBTRUdNRU5UX0VORF9MTyk7Ci0KLSAgLy8gQSB2YWxpZCBhdXRob3JpdHkgbWF5IGJlIG51bGwgb3IgY29udGFpbiBhbnkgYWxsb3dlZCBVUkkgY2hhcmFjdGVycyBleGNlcHQKLSAgLy8gZm9yIHRoZSBmb2xsb3dpbmc6IDxjb2RlPi8gPzwvY29kZT4KLQotICAgIC8vcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsaWRhdGUodmFsdWUsIFNFR01FTlRfQ0hBUl9ISSwgU0VHTUVOVF9DSEFSX0xPLCB0cnVlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBhdXRob3JpdHkgY29tcG9uZW50IG9mIGFuIDxhCi0gICAqIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlIFVSSTwvYT47IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgKiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPlRvIGJlIHZhbGlkLCB0aGUgYXV0aG9yaXR5LCBpdHNlbGYsIG11c3QgYmUgYSBVUkkgd2l0aCBubyBmcmFnbWVudCwKLSAgICogZm9sbG93ZWQgYnkgdGhlIGNoYXJhY3RlciA8Y29kZT4hPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZEFyY2hpdmVBdXRob3JpdHkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwICYmCi0gICAgICAgIHZhbHVlLmNoYXJBdCh2YWx1ZS5sZW5ndGgoKSAtIDEpID09IEFSQ0hJVkVfSURFTlRJRklFUikKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgVVJJIGFyY2hpdmVVUkkgPSBjcmVhdGVVUkkodmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCgpIC0gMSkpOwotICAgICAgICByZXR1cm4gIWFyY2hpdmVVUkkuaGFzRnJhZ21lbnQoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgZGV2aWNlIGNvbXBvbmVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBkZXZpY2UgbWF5IGJlIG51bGwgb3Igbm9uLWVtcHR5LCBjb250YWluaW5nIGFueSBjaGFyYWN0ZXJzCi0gICAqIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZzogPGNvZGU+LyA/ICM8L2NvZGU+ICBJbiBhZGRpdGlvbiwgaXRzIGxhc3QKLSAgICogY2hhcmFjdGVyIG11c3QgYmUgPGNvZGU+OjwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZERldmljZShTdHJpbmcgdmFsdWUpCi0gIHsgICAgCi0gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0cnVlOwotICAgIGludCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICByZXR1cm4gbGVuID4gMCAmJiB2YWx1ZS5jaGFyQXQobGVuIC0gMSkgPT0gREVWSUNFX0lERU5USUZJRVIgJiYKLSAgICAgICFjb250YWlucyh2YWx1ZSwgU0VHTUVOVF9FTkRfSEksIFNFR01FTlRfRU5EX0xPKTsKLQotICAvLyA8cD5BIHZhbGlkIGRldmljZSBtYXkgYmUgbnVsbCBvciBub24tZW1wdHksIGNvbnRhaW5pbmcgYW55IGFsbG93ZWQgVVJJCi0gIC8vIGNoYXJhY3RlcnMgZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nOiA8Y29kZT4vID88L2NvZGU+ICBJbiBhZGRpdGlvbiwgaXRzCi0gIC8vIGxhc3QgY2hhcmFjdGVyIG11c3QgYmUgPGNvZGU+OjwvY29kZT4KLQotICAgIC8vaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0cnVlOwotICAgIC8vaW50IGxlbiA9IHZhbHVlLmxlbmd0aCgpOwotICAgIC8vcmV0dXJuIGxlbiA+IDAgJiYgdmFsaWRhdGUodmFsdWUsIFNFR01FTlRfQ0hBUl9ISSwgU0VHTUVOVF9DSEFSX0xPLCB0cnVlLCB0cnVlKSAmJgotICAgIC8vICB2YWx1ZS5jaGFyQXQobGVuIC0gMSkgPT0gREVWSUNFX0lERU5USUZJRVI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiBhIHZhbGlkIHBhdGggc2VnbWVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBwYXRoIHNlZ21lbnQgbXVzdCBiZSBub24tbnVsbCBhbmQgbm90IGNvbnRhaW4gYW55IG9mIHRoZQotICAgKiBmb2xsb3dpbmcgY2hhcmFjdGVyczogPGNvZGU+LyA/ICM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRTZWdtZW50KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICFjb250YWlucyh2YWx1ZSwgU0VHTUVOVF9FTkRfSEksIFNFR01FTlRfRU5EX0xPKTsKLQotICAvLyA8cD5BIHZhbGlkIHBhdGggc2VnbWVudCBtdXN0IGJlIG5vbi1udWxsIGFuZCBtYXkgY29udGFpbiBhbnkgYWxsb3dlZCBVUkkKLSAgLy8gY2hhcmFjdGVycyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmc6IDxjb2RlPi8gPzwvY29kZT4gCi0KLSAgICAvL3JldHVybiB2YWx1ZSAhPSBudWxsICYmIHZhbGlkYXRlKHZhbHVlLCBTRUdNRU5UX0NIQVJfSEksIFNFR01FTlRfQ0hBUl9MTywgdHJ1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiBhIHZhbGlkIHBhdGggc2VnbWVudCBhcnJheSBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBwYXRoIHNlZ21lbnQgYXJyYXkgbXVzdCBiZSBub24tbnVsbCBhbmQgY29udGFpbiBvbmx5IHBhdGgKLSAgICogc2VnZW1lbnRzIHRoYXQgYXJlIHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2VnbWVudCB2YWxpZFNlZ21lbnR9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkU2VnbWVudHMoU3RyaW5nW10gdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXZhbGlkU2VnbWVudCh2YWx1ZVtpXSkpIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBSZXR1cm5zIG51bGwgaWYgdGhlIHNwZWNpY2llZCB2YWx1ZSBpcyBudWxsIG9yIHdvdWxkIGJlIGEgdmFsaWQgcGF0aAotICAvLyBzZWdtZW50IGFycmF5IG9mIGEgVVJJOyBvdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52YWxpZAotICAvLyBzZWdtZW50LiAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpcnN0SW52YWxpZFNlZ21lbnQoU3RyaW5nW10gdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmICghdmFsaWRTZWdtZW50KHZhbHVlW2ldKSkgcmV0dXJuIHZhbHVlW2ldOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBxdWVyeSBjb21wb25lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgcXVlcnkgbWF5IGJlIG51bGwgb3IgY29udGFpbiBhbnkgY2hhcmFjdGVycyBleGNlcHQgZm9yCi0gICAqIDxjb2RlPiM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRRdWVyeShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5pbmRleE9mKEZSQUdNRU5UX1NFUEFSQVRPUikgPT0gLTE7Ci0KLSAgLy8gPHA+QSB2YWxpZCBxdWVyeSBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBhbGxvd2VkIFVSSSBjaGFyYWN0ZXJzLgotCi0gICAgLy9yZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWxpZGF0ZSh2YWx1ZSwgVVJJQ19ISSwgVVJJQ19MTywgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIGZyYWdtZW50IGNvbXBvbmVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSBmcmFnbWVudCBpcyB0YWtlbiB0byBiZSB1bmNvbmRpdGlvbmFsbHkgdmFsaWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRGcmFnbWVudChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvLyA8cD5BIHZhbGlkIGZyYWdtZW50IG1heSBiZSBudWxsIG9yIGNvbnRhaW4gYW55IGFsbG93ZWQgVVJJIGNoYXJhY3RlcnMuCi0KLSAgICAvL3JldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbGlkYXRlKHZhbHVlLCBVUklDX0hJLCBVUklDX0xPLCB0cnVlLCB0cnVlKTsKLSAgfQotCi0gIC8vIFNlYXJjaGVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGZvciBhbnkgY2hhcmFjdGVycyBpbiB0aGUgc2V0IHJlcHJlc250ZWQKLSAgLy8gYnkgdGhlIDEyOC1iaXQgYml0bWFzay4gIFJldHVybnMgdHJ1ZSBpZiBhbnkgb2NjdXIsIG9yIGZhbHNlIG90aGVyd2lzZS4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgcywgbG9uZyBoaWdoQml0bWFzaywgbG9uZyBsb3dCaXRtYXNrKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHMubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAobWF0Y2hlcyhzLmNoYXJBdChpKSwgaGlnaEJpdG1hc2ssIGxvd0JpdG1hc2spKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVGVzdHMgdGhlIG5vbi1udWxsIHN0cmluZyB2YWx1ZSB0byBzZWUgaWYgaXQgY29udGFpbnMgb25seSBBU0NJSQotICAvLyBjaGFyYWN0ZXJzIGluIHRoZSBzZXQgcmVwcmVzZW50ZWQgYnkgdGhlIHNwZWNpZmllZCAxMjgtYml0IGJpdG1hc2ssCi0gIC8vIGFzIHdlbGwgYXMsIG9wdGlvbmFsbHksIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIDB4QTAgYW5kIGFib3ZlLCBhbmQsCi0gIC8vIGFsc28gb3B0aW9uYWxseSwgZXNjYXBlIHNlcXVlbmNlcyBvZiAlIGZvbGxvd2VkIGJ5IHR3byBoZXggZGlnaXRzLgotICAvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciB0aGUgbmV3LCBzdHJpY3QgVVJJIHZhbGlkYXRpb24gdGhhdCBpcyBub3QKLSAgLy8gbm90IGN1cnJlbnRseSBpbiBwbGFjZS4KLS8qCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGUoU3RyaW5nIHZhbHVlLCBsb25nIGhpZ2hCaXRtYXNrLCBsb25nIGxvd0JpdG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd05vbkFTQ0lJLCBib29sZWFuIGFsbG93RXNjYXBlZCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsgCi0gICAgICBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7Ci0KLSAgICAgIGlmIChtYXRjaGVzKGMsIGhpZ2hCaXRtYXNrLCBsb3dCaXRtYXNrKSkgY29udGludWU7Ci0gICAgICBpZiAoYWxsb3dOb25BU0NJSSAmJiBjID49IDE2MCkgY29udGludWU7Ci0gICAgICBpZiAoYWxsb3dFc2NhcGVkICYmIGlzRXNjYXBlZCh2YWx1ZSwgaSkpCi0gICAgICB7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0qLwotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSByZWxhdGl2ZSBVUkksIG9yCi0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBhbiBhYnNvbHV0ZSBVUkkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aXZlKCkKLSAgewotICAgIHJldHVybiBzY2hlbWUgPT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYSBhIGhpZXJhcmNoaWNhbCBVUkksIG9yCi0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBvZiB0aGUgZ2VuZXJpYyBmb3JtLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwoKQotICB7Ci0gICAgcmV0dXJuIGhpZXJhcmNoaWNhbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaWNhbCBVUkkgd2l0aCBhbiBhdXRob3JpdHkKLSAgICogY29tcG9uZW50OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiAKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0F1dGhvcml0eSgpCi0gIHsKLSAgICByZXR1cm4gaGllcmFyY2hpY2FsICYmIGF1dGhvcml0eSAhPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIG5vbi1oaWVyYXJjaGljYWwgVVJJIHdpdGggYW4KLSAgICogb3BhcXVlIHBhcnQgY29tcG9uZW50OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzT3BhcXVlUGFydCgpCi0gIHsKLSAgICAvLyBub3RlOiBoaWVyYXJjaGljYWwgLT4gYXV0aG9yaXR5ICE9IG51bGwKLSAgICByZXR1cm4gIWhpZXJhcmNoaWNhbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBkZXZpY2UKLSAgICogY29tcG9uZW50OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRGV2aWNlKCkKLSAgewotICAgIC8vIG5vdGU6IGRldmljZSAhPSBudWxsIC0+IGhpZXJhcmNoaWNhbAotICAgIHJldHVybiBkZXZpY2UgIT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4KLSAgICogYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1BhdGgoKQotICB7Ci0gICAgLy8gbm90ZTogKGFic29sdXRlUGF0aCB8fCBhdXRob3JpdHkgPT0gbnVsbCkgLT4gaGllcmFyY2hpY2FsCi0gICAgLy8gKGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGgpIC0+IHNjaGVtZSA9PSBudWxsCi0gICAgcmV0dXJuIGFic29sdXRlUGF0aCB8fCAoYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbgotICAgKiBhYnNvbHV0ZSBwYXRoLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgbm9uLWhpZXJhcmNoaWNhbCwgaGFzIG5vCi0gICAqIHBhdGgsIG9yIGhhcyBhIHJlbGF0aXZlIHBhdGguCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNBYnNvbHV0ZVBhdGgoKQotICB7Ci0gICAgLy8gbm90ZTogYWJzb2x1dGVQYXRoIC0+IGhpZXJhcmNoaWNhbAotICAgIHJldHVybiBhYnNvbHV0ZVBhdGg7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgcmVsYXRpdmUKLSAgICogcGF0aCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG5vbi1oaWVyYXJjaGljYWwsIGhhcyBubyBwYXRoLCBvcgotICAgKiBoYXMgYW4gYWJzb2x1dGUgcGF0aC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1JlbGF0aXZlUGF0aCgpCi0gIHsKLSAgICAvLyBub3RlOiBhdXRob3JpdHkgPT0gbnVsbCAtPiBoaWVyYXJjaGljYWwKLSAgICAvLyAoYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCkgLT4gc2NoZW1lID09IG51bGwKLSAgICByZXR1cm4gYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4gZW1wdHkKLSAgICogcmVsYXRpdmUgcGF0aDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4gIAotICAgKgotICAgKiA8cD5Ob3RlIHRoYXQgPGNvZGU+IWhhc0VtcHR5KCk8L2NvZGU+IGRvZXMgPGVtPm5vdDwvZW0+IGltcGx5IHRoYXQgdGhpcwotICAgKiBVUkkgaGFzIGFueSBwYXRoIHNlZ21lbnRzOyBob3dldmVyLCA8Y29kZT5oYXNSZWxhdGl2ZVBhdGggJiYKLSAgICogIWhhc0VtcHR5UGF0aCgpPC9jb2RlPiBkb2VzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRW1wdHlQYXRoKCkKLSAgewotICAgIC8vIG5vdGU6IGF1dGhvcml0eSA9PSBudWxsIC0+IGhpZXJhcmNoaWNhbAotICAgIC8vIChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoKSAtPiBzY2hlbWUgPT0gbnVsbAotICAgIHJldHVybiBhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoICYmCi0gICAgICBzZWdtZW50cy5sZW5ndGggPT0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBxdWVyeQotICAgKiBjb21wb25lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNRdWVyeSgpCi0gIHsKLSAgICAvLyBub3RlOiBxdWVyeSAhPSBudWxsIC0+IGhpZXJhcmNoaWNhbAotICAgIHJldHVybiBxdWVyeSAhPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBVUkkgaGFzIGEgZnJhZ21lbnQgY29tcG9uZW50OwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRnJhZ21lbnQoKQotICB7Ci0gICAgcmV0dXJuIGZyYWdtZW50ICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgY3VycmVudCBkb2N1bWVudCByZWZlcmVuY2U7IHRoYXQKLSAgICogaXMsIGlmIGl0IGlzIGEgcmVsYXRpdmUgaGllcmFyY2hpY2FsIFVSSSB3aXRoIG5vIGF1dGhvcml0eSwgZGV2aWNlIG9yCi0gICAqIHF1ZXJ5IGNvbXBvbmVudHMsIGFuZCBubyBwYXRoIHNlZ21lbnRzOyA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQKLSAgICogb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDdXJyZW50RG9jdW1lbnRSZWZlcmVuY2UoKQotICB7Ci0gICAgLy8gbm90ZTogYXV0aG9yaXR5ID09IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgLy8gKGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGgpIC0+IHNjaGVtZSA9PSBudWxsCi0gICAgcmV0dXJuIGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGggJiYKLSAgICAgIHNlZ21lbnRzLmxlbmd0aCA9PSAwICYmIHF1ZXJ5ID09IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEge0BsaW5rCi0gICAqICNpc0N1cnJlbnREb2N1bWVudFJlZmVyZW5jZSgpIGN1cnJlbnQgZG9jdW1lbnQgcmVmZXJlbmNlfSB3aXRoIG5vCi0gICAqIGZyYWdtZW50IGNvbXBvbmVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogQHNlZSAjaXNDdXJyZW50RG9jdW1lbnRSZWZlcmVuY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0gIHsKLSAgICAvLyBub3RlOiBhdXRob3JpdHkgPT0gbnVsbCAtPiBoaWVyYXJjaGljYWwKLSAgICAvLyAoYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCkgLT4gc2NoZW1lID09IG51bGwKLSAgICByZXR1cm4gYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCAmJgotICAgICAgc2VnbWVudHMubGVuZ3RoID09IDAgJiYgcXVlcnkgPT0gbnVsbCAmJiBmcmFnbWVudCA9PSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgdGhhdCBtYXkgcmVmZXIKLSAgICogZGlyZWN0bHkgdG8gYSBsb2NhbGx5IGFjY2Vzc2libGUgZmlsZS4gIFRoaXMgaXMgY29uc2lkZXJlZCB0byBiZSB0aGUKLSAgICogY2FzZSBmb3IgYSBmaWxlLXNjaGVtZSBhYnNvbHV0ZSBVUkksIG9yIGZvciBhIHJlbGF0aXZlIFVSSSB3aXRoIG5vIHF1ZXJ5OwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNGaWxlKCkKLSAgewotICAgIHJldHVybiBpc0hpZXJhcmNoaWNhbCgpICYmCi0gICAgICAoKGlzUmVsYXRpdmUoKSAmJiAhaGFzUXVlcnkoKSkgfHwgU0NIRU1FX0ZJTEUuZXF1YWxzSWdub3JlQ2FzZShzY2hlbWUpKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGFuIGFyY2hpdmUgVVJJLiAgSWYgc28sIHdlIHNob3VsZCBleHBlY3QgdGhhdAotICAvLyBpdCBpcyBhbHNvIGhpZXJhcmNoaWNhbCwgd2l0aCBhbiBhdXRob3JpdHkgKGNvbnNpc3Rpbmcgb2YgYW4gYWJzb2x1dGUKLSAgLy8gVVJJIGZvbGxvd2VkIGJ5ICIhIiksIG5vIGRldmljZSwgYW5kIGFuIGFic29sdXRlIHBhdGguCi0gIHByaXZhdGUgYm9vbGVhbiBpc0FyY2hpdmUoKQotICB7Ci0gICAgcmV0dXJuIGlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIHNjaGVtZSBvZiBhbiA8YQotICAgKiBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZSBVUkk8L2E+OyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICogb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXJjaGl2ZVNjaGVtZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBhcmNoaXZlU2NoZW1lcy5jb250YWlucyh2YWx1ZS50b0xvd2VyQ2FzZSgpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGhhc2ggY29kZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICB7Ci0gICAgcmV0dXJuIGhhc2hDb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+b2JqPC9jb2RlPiBpcyBhbiBpbnN0YW5jZSBvZgotICAgKiA8Y29kZT5VUkk8L2NvZGU+IGVxdWFsIHRvIHRoaXMgb25lOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5FcXVhbGl0eSBpcyBkZXRlcm1pbmVkIHN0cmljdGx5IGJ5IGNvbXBhcmluZyBjb21wb25lbnRzLCBub3QgYnkKLSAgICogYXR0ZW1wdGluZyB0byBpbnRlcnByZXQgd2hhdCByZXNvdXJjZSBpcyBiZWluZyBpZGVudGlmaWVkLiAgVGhlCi0gICAqIGNvbXBhcmlzb24gb2Ygc2NoZW1lcyBpcyBjYXNlLWluc2Vuc2l0aXZlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0gIHsKLSAgICBpZiAodGhpcyA9PSBvYmopIHJldHVybiB0cnVlOwotICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFVSSSkpIHJldHVybiBmYWxzZTsKLSAgICBVUkkgdXJpID0gKFVSSSkgb2JqOwotCi0gICAgcmV0dXJuIGhhc2hDb2RlID09IHVyaS5oYXNoQ29kZSgpICYmCi0gICAgICBoaWVyYXJjaGljYWwgPT0gdXJpLmlzSGllcmFyY2hpY2FsKCkgJiYKLSAgICAgIGFic29sdXRlUGF0aCA9PSB1cmkuaGFzQWJzb2x1dGVQYXRoKCkgJiYKLSAgICAgIGVxdWFscyhzY2hlbWUsIHVyaS5zY2hlbWUoKSwgdHJ1ZSkgJiYKLSAgICAgIGVxdWFscyhhdXRob3JpdHksIGhpZXJhcmNoaWNhbCA/IHVyaS5hdXRob3JpdHkoKSA6IHVyaS5vcGFxdWVQYXJ0KCkpICYmCi0gICAgICBlcXVhbHMoZGV2aWNlLCB1cmkuZGV2aWNlKCkpICYmCi0gICAgICBlcXVhbHMocXVlcnksIHVyaS5xdWVyeSgpKSAmJiAKLSAgICAgIGVxdWFscyhmcmFnbWVudCwgdXJpLmZyYWdtZW50KCkpICYmCi0gICAgICBzZWdtZW50c0VxdWFsKHVyaSk7Ci0gIH0KLQotICAvLyBUZXN0cyB3aGV0aGVyIHRoaXMgVVJJJ3MgcGF0aCBzZWdtZW50IGFycmF5IGlzIGVxdWFsIHRvIHRoYXQgb2YgdGhlCi0gIC8vIGdpdmVuIHVyaS4KLSAgcHJpdmF0ZSBib29sZWFuIHNlZ21lbnRzRXF1YWwoVVJJIHVyaSkKLSAgewotICAgIGlmIChzZWdtZW50cy5sZW5ndGggIT0gdXJpLnNlZ21lbnRDb3VudCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmICghc2VnbWVudHNbaV0uZXF1YWxzKHVyaS5zZWdtZW50KGkpKSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFRlc3RzIHR3byBvYmplY3RzIGZvciBlcXVhbGl0eSwgdG9sZXJhdGluZyBudWxsczsgbnVsbCBpcyBjb25zaWRlcmVkCi0gIC8vIHRvIGJlIGEgdmFsaWQgdmFsdWUgdGhhdCBpcyBvbmx5IGVxdWFsIHRvIGl0c2VsZi4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gIHsKLSAgICByZXR1cm4gbzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpOwotICB9Ci0KLSAgLy8gVGVzdHMgdHdvIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCB0b2xlcmF0aW5nIG51bGxzIGFuZCBvcHRpb25hbGx5Ci0gIC8vIGlnbm9yaW5nIGNhc2UuCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBzMSwgU3RyaW5nIHMyLCBib29sZWFuIGlnbm9yZUNhc2UpCi0gIHsKLSAgICByZXR1cm4gczEgPT0gbnVsbCA/IHMyID09IG51bGwgOgotICAgICAgaWdub3JlQ2FzZSA/IHMxLmVxdWFsc0lnbm9yZUNhc2UoczIpIDogczEuZXF1YWxzKHMyKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGFuIGFic29sdXRlIFVSSSwgcmV0dXJucyB0aGUgc2NoZW1lIGNvbXBvbmVudDsKLSAgICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBzY2hlbWUoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtZTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgbm9uLWhpZXJhcmNoaWNhbCBVUkksIHJldHVybnMgdGhlIG9wYXF1ZSBwYXJ0IGNvbXBvbmVudDsKLSAgICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBvcGFxdWVQYXJ0KCkKLSAgewotICAgIHJldHVybiBpc0hpZXJhcmNoaWNhbCgpID8gbnVsbCA6IGF1dGhvcml0eTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHJldHVybnMgaXQ7Ci0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgYXV0aG9yaXR5KCkKLSAgewotICAgIHJldHVybiBpc0hpZXJhcmNoaWNhbCgpID8gYXV0aG9yaXR5IDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuIGF1dGhvcml0eSBjb21wb25lbnQgdGhhdCBoYXMgYQotICAgKiB1c2VyIGluZm8gcG9ydGlvbiwgcmV0dXJucyBpdDsgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB1c2VySW5mbygpCi0gIHsgCi0gICAgaWYgKCFoYXNBdXRob3JpdHkoKSkgcmV0dXJuIG51bGw7Ci0gICAKLSAgICBpbnQgaSA9IGF1dGhvcml0eS5pbmRleE9mKFVTRVJfSU5GT19TRVBBUkFUT1IpOwotICAgIHJldHVybiBpIDwgMCA/IG51bGwgOiBhdXRob3JpdHkuc3Vic3RyaW5nKDAsIGkpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4gYXV0aG9yaXR5IGNvbXBvbmVudCB0aGF0IGhhcyBhCi0gICAqIGhvc3QgcG9ydGlvbiwgcmV0dXJucyBpdDsgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBob3N0KCkKLSAgewotICAgIGlmICghaGFzQXV0aG9yaXR5KCkpIHJldHVybiBudWxsOwotICAgIAotICAgIGludCBpID0gYXV0aG9yaXR5LmluZGV4T2YoVVNFUl9JTkZPX1NFUEFSQVRPUik7Ci0gICAgaW50IGogPSBhdXRob3JpdHkuaW5kZXhPZihQT1JUX1NFUEFSQVRPUik7Ci0gICAgcmV0dXJuIGogPCAwID8gYXV0aG9yaXR5LnN1YnN0cmluZyhpICsgMSkgOiBhdXRob3JpdHkuc3Vic3RyaW5nKGkgKyAxLCBqKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuIGF1dGhvcml0eSBjb21wb25lbnQgdGhhdCBoYXMgYQotICAgKiBwb3J0IHBvcnRpb24sIHJldHVybnMgaXQ7IDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcG9ydCgpCi0gIHsKLSAgICBpZiAoIWhhc0F1dGhvcml0eSgpKSByZXR1cm4gbnVsbDsKLQotICAgIGludCBpID0gYXV0aG9yaXR5LmluZGV4T2YoUE9SVF9TRVBBUkFUT1IpOwotICAgIHJldHVybiBpIDwgMCA/IG51bGwgOiBhdXRob3JpdHkuc3Vic3RyaW5nKGkgKyAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgZGV2aWNlIGNvbXBvbmVudCwgcmV0dXJucyBpdDsKLSAgICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBkZXZpY2UoKQotICB7Ci0gICAgcmV0dXJuIGRldmljZTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgcGF0aCwgcmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nCi0gICAqIHRoZSBzZWdtZW50cyBvZiB0aGUgcGF0aDsgYW4gZW1wdHkgYXJyYXkgb3RoZXJ3aXNlLiAgVGhlIGxlYWRpbmcKLSAgICogc2VwYXJhdG9yIGluIGFuIGFic29sdXRlIHBhdGggaXMgbm90IHJlcHJlc2VudGVkIGluIHRoaXMgYXJyYXksIGJ1dCBhCi0gICAqIHRyYWlsaW5nIHNlcGFyYXRvciBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eS1zdHJpbmcgc2VnbWVudCBhcyB0aGUKLSAgICogZmluYWwgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBzZWdtZW50cygpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKXNlZ21lbnRzLmNsb25lKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIHNlZ21lbnRzIGFzIHRoZSBhcnJheQotICAgKiByZXR1cm5lZCBieSB7QGxpbmsgI3NlZ21lbnRzIHNlZ21lbnRzfS4KLSAgICovCi0gIHB1YmxpYyBMaXN0IHNlZ21lbnRzTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KHNlZ21lbnRzKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZWdtZW50IGFycmF5IHRoYXQgd291bGQgYmUKLSAgICogcmV0dXJuZWQgYnkge0BsaW5rICNzZWdtZW50cyBzZWdtZW50c30uCi0gICAqLwotICBwdWJsaWMgaW50IHNlZ21lbnRDb3VudCgpCi0gIHsKLSAgICByZXR1cm4gc2VnbWVudHMubGVuZ3RoOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIGZhc3QsIGluZGV4ZWQgYWNjZXNzIHRvIGluZGl2aWR1YWwgc2VnbWVudHMgaW4gdGhlIHBhdGgKLSAgICogc2VnbWVudCBhcnJheS4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiA8Y29kZT5pIDwgMDwvY29kZT4gb3IKLSAgICogPGNvZGU+aSA+PSBzZWdtZW50Q291bnQoKTwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHNlZ21lbnQoaW50IGkpCi0gIHsKLSAgICByZXR1cm4gc2VnbWVudHNbaV07Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGFzdCBzZWdtZW50IGluIHRoZSBzZWdtZW50IGFycmF5LCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgbGFzdFNlZ21lbnQoKQotICB7Ci0gICAgaW50IGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBpZiAobGVuID09IDApIHJldHVybiBudWxsOwotICAgIHJldHVybiBzZWdtZW50c1tsZW4gLSAxXTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgcGF0aCwgcmV0dXJucyBhIHN0cmluZwotICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF0aDsgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLiAgVGhlIHBhdGgKLSAgICogY29uc2lzdHMgb2YgYSBsZWFkaW5nIHNlZ21lbnQgc2VwYXJhdG9yIGNoYXJhY3RlciAoYSBzbGFzaCksIGlmIHRoZQotICAgKiBwYXRoIGlzIGFic29sdXRlLCBmb2xsb3dlZCBieSB0aGUgc2xhc2gtc2VwYXJhdGVkIHBhdGggc2VnbWVudHMuICBJZgotICAgKiB0aGlzIFVSSSBoYXMgYSBzZXBhcmF0ZSA8YSBocmVmPSIjZGV2aWNlX2V4cGxhbmF0aW9uIj5kZXZpY2UKLSAgICogY29tcG9uZW50PC9hPiwgaXQgaXMgPGVtPm5vdDwvZW0+IGluY2x1ZGVkIGluIHRoZSBwYXRoLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBwYXRoKCkKLSAgewotICAgIGlmICghaGFzUGF0aCgpKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKGhhc0Fic29sdXRlUGF0aCgpKSByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSAhPSAwKSByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoc2VnbWVudHNbaV0pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIHBhdGgsIHJldHVybnMgYSBzdHJpbmcKLSAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhdGgsIGluY2x1ZGluZyB0aGUgYXV0aG9yaXR5IGFuZCB0aGUgCi0gICAqIDxhIGhyZWY9IiNkZXZpY2VfZXhwbGFuYXRpb24iPmRldmljZSBjb21wb25lbnQ8L2E+OyAKLSAgICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLiAgCi0gICAqCi0gICAqIDxwPklmIHRoZXJlIGlzIG5vIGF1dGhvcml0eSwgdGhlIGZvcm1hdCBvZiB0aGlzIHN0cmluZyBpczoKLSAgICogPHByZT4KLSAgICogICBkZXZpY2UvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLjwvcHJlPgotICAgKgotICAgKiA8cD5JZiB0aGVyZSBpcyBhbiBhdXRob3JpdHksIGl0IGlzOgotICAgKiA8cHJlPgotICAgKiAgIC8vYXV0aG9yaXR5L2RldmljZS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uPC9wcmU+Ci0gICAqCi0gICAqIDxwPkZvciBhbiA8YSBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZSBVUkk8L2E+LCBpdCdzIGp1c3Q6Ci0gICAqIDxwcmU+Ci0gICAqICAgYXV0aG9yaXR5L3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi48L3ByZT4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZGV2aWNlUGF0aCgpCi0gIHsKLSAgICBpZiAoIWhhc1BhdGgoKSkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgaWYgKGhhc0F1dGhvcml0eSgpKQotICAgIHsKLSAgICAgIGlmICghaXNBcmNoaXZlKCkpIHJlc3VsdC5hcHBlbmQoQVVUSE9SSVRZX1NFUEFSQVRPUik7Ci0gICAgICByZXN1bHQuYXBwZW5kKGF1dGhvcml0eSk7Ci0KLSAgICAgIGlmIChoYXNEZXZpY2UoKSkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgfQotCi0gICAgaWYgKGhhc0RldmljZSgpKSByZXN1bHQuYXBwZW5kKGRldmljZSk7Ci0gICAgaWYgKGhhc0Fic29sdXRlUGF0aCgpKSByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSAhPSAwKSByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoc2VnbWVudHNbaV0pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCwgcmV0dXJucyBpdDsKLSAgICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBxdWVyeSgpCi0gIHsKLSAgICByZXR1cm4gcXVlcnk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGZyb20gdGhpcyBVUkkgYW5kIHRoZSBnaXZlbiBxdWVyeS4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmCi0gICAqIDxjb2RlPnF1ZXJ5PC9jb2RlPiBpcyBub3QgYSB2YWxpZCBxdWVyeSAocG9ydGlvbikgYWNjb3JkaW5nCi0gICAqIHRvIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fS4KLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kUXVlcnkoU3RyaW5nIHF1ZXJ5KQotICB7Ci0gICAgaWYgKCF2YWxpZFF1ZXJ5KHF1ZXJ5KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiaW52YWxpZCBxdWVyeSBwb3J0aW9uOiAiICsgcXVlcnkpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7IAotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgVVJJIGhhcyBhIG5vbi1udWxsIHtAbGluayAjcXVlcnkgcXVlcnl9LCByZXR1cm5zIHRoZSBVUkkKLSAgICogZm9ybWVkIGJ5IHJlbW92aW5nIGl0OyB0aGlzIFVSSSB1bmNoYW5nZWQsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgdHJpbVF1ZXJ5KCkKLSAgewotICAgIGlmIChxdWVyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsIHNlZ21lbnRzLCBudWxsLCBmcmFnbWVudCk7IAotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIFVSSSBoYXMgYSBmcmFnbWVudCBjb21wb25lbnQsIHJldHVybnMgaXQ7IDxjb2RlPm51bGw8L2NvZGU+Ci0gICAqIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZnJhZ21lbnQoKQotICB7Ci0gICAgcmV0dXJuIGZyYWdtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3JtZWQgZnJvbSB0aGlzIFVSSSBhbmQgdGhlIGdpdmVuIGZyYWdtZW50LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYKLSAgICogPGNvZGU+ZnJhZ21lbnQ8L2NvZGU+IGlzIG5vdCBhIHZhbGlkIGZyYWdtZW50IChwb3J0aW9uKSBhY2NvcmRpbmcKLSAgICogdG8ge0BsaW5rICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LgotICAgKi8KLSAgcHVibGljIFVSSSBhcHBlbmRGcmFnbWVudChTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpZiAoIXZhbGlkRnJhZ21lbnQoZnJhZ21lbnQpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJpbnZhbGlkIGZyYWdtZW50IHBvcnRpb246ICIgKyBmcmFnbWVudCk7Ci0gICAgfQotICAgIFVSSSByZXN1bHQgPSBuZXcgVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsgCi0KLSAgICBpZiAoIWhhc0ZyYWdtZW50KCkpCi0gICAgewotICAgICAgcmVzdWx0LmNhY2hlZFRyaW1GcmFnbWVudCA9IHRoaXM7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBVUkkgaGFzIGEgbm9uLW51bGwge0BsaW5rICNmcmFnbWVudCBmcmFnbWVudH0sIHJldHVybnMgdGhlIFVSSQotICAgKiBmb3JtZWQgYnkgcmVtb3ZpbmcgaXQ7IHRoaXMgVVJJIHVuY2hhbmdlZCwgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFVSSSB0cmltRnJhZ21lbnQoKQotICB7Ci0gICAgaWYgKGZyYWdtZW50ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNhY2hlZFRyaW1GcmFnbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIGNhY2hlZFRyaW1GcmFnbWVudCA9IG5ldyBVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsIHNlZ21lbnRzLCBxdWVyeSwgbnVsbCk7IAotICAgIH0KLQotICAgIHJldHVybiBjYWNoZWRUcmltRnJhZ21lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmVzb2x2ZXMgdGhpcyBVUkkgcmVmZXJlbmNlIGFnYWluc3QgYSA8Y29kZT5iYXNlPC9jb2RlPiBhYnNvbHV0ZQotICAgKiBoaWVyYXJjaGljYWwgVVJJLCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZyBhYnNvbHV0ZSBVUkkuICBJZiBhbHJlYWR5Ci0gICAqIGFic29sdXRlLCB0aGUgVVJJIGl0c2VsZiBpcyByZXR1cm5lZC4gIFVSSSByZXNvbHV0aW9uIGlzIGRlc2NyaWJlZCBpbgotICAgKiBkZXRhaWwgaW4gc2VjdGlvbiA1LjIgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjM5Ni50eHQiPlJGQwotICAgKiAyMzk2PC9hPiwgIlJlc29sdmluZyBSZWxhdGl2ZSBSZWZlcmVuY2VzIHRvIEFic29sdXRlIEZvcm0uIgotICAgKgotICAgKiA8cD5EdXJpbmcgcmVzb2x1dGlvbiwgZW1wdHkgc2VnbWVudHMsIHNlbGYgcmVmZXJlbmNlcyAoIi4iKSwgYW5kIHBhcmVudAotICAgKiByZWZlcmVuY2VzICgiLi4iKSBhcmUgaW50ZXJwcmV0ZWQsIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZQotICAgKiBwYXRoLiAgU3RlcCA2KGcpIGdpdmVzIGEgY2hvaWNlIG9mIGhvdyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgcGFyZW50Ci0gICAqIHJlZmVyZW5jZXMgcG9pbnQgdG8gYSBwYXRoIGFib3ZlIHRoZSByb290OiB0aGUgb2ZmZW5kaW5nIHNlZ21lbnRzIGNhbgotICAgKiBiZSBwcmVzZXJ2ZWQgb3IgZGlzY2FyZGVkLiAgVGhpcyBtZXRob2QgcHJlc2VydmVzIHRoZW0uICBUbyBoYXZlIHRoZW0KLSAgICogZGlzY2FyZGVkLCBwbGVhc2UgdXNlIHRoZSB0d28tcGFyYW1ldGVyIGZvcm0gb2Yge0BsaW5rCi0gICAqICNyZXNvbHZlKFVSSSwgYm9vbGVhbikgcmVzb2x2ZX0uCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5iYXNlPC9jb2RlPiBpcwotICAgKiBub24taGllcmFyY2hpY2FsIG9yIGlzIHJlbGF0aXZlLgotICAgKi8KLSAgcHVibGljIFVSSSByZXNvbHZlKFVSSSBiYXNlKQotICB7Ci0gICAgcmV0dXJuIHJlc29sdmUoYmFzZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVzb2x2ZXMgdGhpcyBVUkkgcmVmZXJlbmNlIGFnYWluc3QgYSA8Y29kZT5iYXNlPC9jb2RlPiBhYnNvbHV0ZQotICAgKiBoaWVyYXJjaGljYWwgVVJJLCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZyBhYnNvbHV0ZSBVUkkuICBJZiBhbHJlYWR5Ci0gICAqIGFic29sdXRlLCB0aGUgVVJJIGl0c2VsZiBpcyByZXR1cm5lZC4gIFVSSSByZXNvbHV0aW9uIGlzIGRlc2NyaWJlZCBpbgotICAgKiBkZXRhaWwgaW4gc2VjdGlvbiA1LjIgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjM5Ni50eHQiPlJGQwotICAgKiAyMzk2PC9hPiwgIlJlc29sdmluZyBSZWxhdGl2ZSBSZWZlcmVuY2VzIHRvIEFic29sdXRlIEZvcm0uIgotICAgKgotICAgKiA8cD5EdXJpbmcgcmVzdWx0aW9uLCBlbXB0eSBzZWdtZW50cywgc2VsZiByZWZlcmVuY2VzICgiLiIpLCBhbmQgcGFyZW50Ci0gICAqIHJlZmVyZW5jZXMgKCIuLiIpIGFyZSBpbnRlcnByZXRlZCwgc28gdGhhdCB0aGV5IGNhbiBiZSByZW1vdmVkIGZyb20gdGhlCi0gICAqIHBhdGguICBTdGVwIDYoZykgZ2l2ZXMgYSBjaG9pY2Ugb2YgaG93IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBwYXJlbnQKLSAgICogcmVmZXJlbmNlcyBwb2ludCB0byBhIHBhdGggYWJvdmUgdGhlIHJvb3Q6IHRoZSBvZmZlbmRpbmcgc2VnbWVudHMgY2FuCi0gICAqIGJlIHByZXNlcnZlZCBvciBkaXNjYXJkZWQuICBUaGlzIG1ldGhvZCBjYW4gZG8gZWl0aGVyLgotICAgKgotICAgKiBAcGFyYW0gcHJlc2VydmVSb290UGFyZW50cyA8Y29kZT50cnVlPC9jb2RlPiBpZiBzZWdtZW50cyByZWZlcmluZyB0byB0aGUKLSAgICogcGFyZW50IG9mIHRoZSByb290IHBhdGggYXJlIHRvIGJlIHByZXNlcnZlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkKLSAgICogYXJlIHRvIGJlIGRpc2NhcmRlZC4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmJhc2U8L2NvZGU+IGlzCi0gICAqIG5vbi1oaWVyYXJjaGljYWwgb3IgaXMgcmVsYXRpdmUuCi0gICAqLwotICBwdWJsaWMgVVJJIHJlc29sdmUoVVJJIGJhc2UsIGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cykKLSAgewotICAgIGlmICghYmFzZS5pc0hpZXJhcmNoaWNhbCgpIHx8IGJhc2UuaXNSZWxhdGl2ZSgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJyZXNvbHZlIGFnYWluc3Qgbm9uLWhpZXJhcmNoaWNhbCBvciByZWxhdGl2ZSBiYXNlIik7Ci0gICAgfQotCi0gICAgLy8gYW4gYWJzb2x1dGUgVVJJIG5lZWRzIG5vIHJlc29sdmluZwotICAgIGlmICghaXNSZWxhdGl2ZSgpKSByZXR1cm4gdGhpczsKLQotICAgIC8vIG5vdGU6IGlzUmVsYXRpdmUoKSAtPiBoaWVyYXJjaGljYWwKLQotICAgIFN0cmluZyBuZXdBdXRob3JpdHkgPSBhdXRob3JpdHk7Ci0gICAgU3RyaW5nIG5ld0RldmljZSA9IGRldmljZTsKLSAgICBib29sZWFuIG5ld0Fic29sdXRlUGF0aCA9IGFic29sdXRlUGF0aDsKLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IHNlZ21lbnRzOwotICAgIFN0cmluZyBuZXdRdWVyeSA9IHF1ZXJ5OwotICAgIC8vIG5vdGU6IGl0J3Mgb2theSBmb3IgdHdvIFVSSXMgdG8gc2hhcmUgYSBzZWdtZW50cyBhcnJheSwgc2luY2UKLSAgICAvLyBuZWl0aGVyIHdpbGwgZXZlciBtb2RpZnkgaXQKLSAgICAKLSAgICBpZiAoYXV0aG9yaXR5ID09IG51bGwpCi0gICAgewotICAgICAgLy8gbm8gYXV0aG9yaXR5OiB1c2UgYmFzZSdzCi0gICAgICBuZXdBdXRob3JpdHkgPSBiYXNlLmF1dGhvcml0eSgpOwotCi0gICAgICBpZiAoZGV2aWNlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIG5vIGRldmljZTogdXNlIGJhc2UncwotICAgICAgICBuZXdEZXZpY2UgPSBiYXNlLmRldmljZSgpOwotCi0gICAgICAgIGlmIChoYXNFbXB0eVBhdGgoKSAmJiBxdWVyeSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gY3VycmVudCBkb2N1bWVudCByZWZlcmVuY2U6IHVzZSBiYXNlIHBhdGggYW5kIHF1ZXJ5Ci0gICAgICAgICAgbmV3QWJzb2x1dGVQYXRoID0gYmFzZS5oYXNBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICBuZXdTZWdtZW50cyA9IGJhc2Uuc2VnbWVudHMoKTsKLSAgICAgICAgICBuZXdRdWVyeSA9IGJhc2UucXVlcnkoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChoYXNSZWxhdGl2ZVBhdGgoKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIHJlbGF0aXZlIHBhdGg6IG1lcmdlIHdpdGggYmFzZSBhbmQga2VlcCBxdWVyeSAobm90ZTogaWYgdGhlCi0gICAgICAgICAgLy8gYmFzZSBoYXMgbm8gcGF0aCBhbmQgdGhpcyBhIG5vbi1lbXB0eSByZWxhdGl2ZSBwYXRoLCB0aGVyZSBpcwotICAgICAgICAgIC8vIGFuIGltcGxpZWQgcm9vdCBpbiB0aGUgcmVzdWx0aW5nIHBhdGgpIAotICAgICAgICAgIG5ld0Fic29sdXRlUGF0aCA9IGJhc2UuaGFzQWJzb2x1dGVQYXRoKCkgfHwgIWhhc0VtcHR5UGF0aCgpOwotICAgICAgICAgIG5ld1NlZ21lbnRzID0gbmV3QWJzb2x1dGVQYXRoID8gbWVyZ2VQYXRoKGJhc2UsIHByZXNlcnZlUm9vdFBhcmVudHMpCi0gICAgICAgICAgICA6IE5PX1NFR01FTlRTOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVsc2UgYWJzb2x1dGUgcGF0aDoga2VlcCBpdCBhbmQgcXVlcnkKLSAgICAgIH0KLSAgICAgIC8vIGVsc2Uga2VlcCBkZXZpY2UsIHBhdGgsIGFuZCBxdWVyeQotICAgIH0KLSAgICAvLyBlbHNlIGtlZXAgYXV0aG9yaXR5LCBkZXZpY2UsIHBhdGgsIGFuZCBxdWVyeQotICAgIAotICAgIC8vIGFsd2F5cyBrZWVwIGZyYWdtZW50LCBldmVuIGlmIG51bGwsIGFuZCB1c2Ugc2NoZW1lIGZyb20gYmFzZTsKLSAgICAvLyBubyB2YWxpZGF0aW9uIG5lZWRlZCBzaW5jZSBhbGwgY29tcG9uZW50cyBhcmUgZnJvbSBleGlzdGluZyBVUklzCi0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgYmFzZS5zY2hlbWUoKSwgbmV3QXV0aG9yaXR5LCBuZXdEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgbmV3QWJzb2x1dGVQYXRoLCBuZXdTZWdtZW50cywgbmV3UXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8vIE1lcmdlcyB0aGlzIFVSSSdzIHJlbGF0aXZlIHBhdGggd2l0aCB0aGUgYmFzZSBub24tcmVsYXRpdmUgcGF0aC4gIElmCi0gIC8vIGJhc2UgaGFzIG5vIHBhdGgsIHRyZWF0IGl0IGFzIHRoZSByb290IGFic29sdXRlIHBhdGgsIHVubGVzcyB0aGlzIGhhcwotICAvLyBubyBwYXRoIGVpdGhlci4KLSAgcHJpdmF0ZSBTdHJpbmdbXSBtZXJnZVBhdGgoVVJJIGJhc2UsIGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cykKLSAgewotICAgIGlmIChiYXNlLmhhc1JlbGF0aXZlUGF0aCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lcmdlIGFnYWluc3QgcmVsYXRpdmUgcGF0aCIpOwotICAgIH0KLSAgICBpZiAoIWhhc1JlbGF0aXZlUGF0aCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1lcmdlIG5vbi1yZWxhdGl2ZSBwYXRoIik7Ci0gICAgfQotCi0gICAgaW50IGJhc2VTZWdtZW50Q291bnQgPSBiYXNlLnNlZ21lbnRDb3VudCgpOwotICAgIGludCBzZWdtZW50Q291bnQgPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgU3RyaW5nW10gc3RhY2sgPSBuZXcgU3RyaW5nW2Jhc2VTZWdtZW50Q291bnQgKyBzZWdtZW50Q291bnRdOwotICAgIGludCBzcCA9IDA7Ci0KLSAgICAvLyB1c2UgYSBzdGFjayB0byBhY2N1bXVsYXRlIHNlZ21lbnRzIG9mIGJhc2UsIGV4Y2VwdCBmb3IgdGhlIGxhc3QKLSAgICAvLyAoaS5lLiBza2lwIHRyYWlsaW5nIHNlcGFyYXRvciBhbmQgYW55dGhpbmcgZm9sbG93aW5nIGl0KSwgYW5kIG9mCi0gICAgLy8gcmVsYXRpdmUgcGF0aAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFzZVNlZ21lbnRDb3VudCAtIDE7IGkrKykKLSAgICB7Ci0gICAgICBzcCA9IGFjY3VtdWxhdGUoc3RhY2ssIHNwLCBiYXNlLnNlZ21lbnQoaSksIHByZXNlcnZlUm9vdFBhcmVudHMpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudENvdW50OyBpKyspCi0gICAgewotICAgICAgc3AgPSBhY2N1bXVsYXRlKHN0YWNrLCBzcCwgc2VnbWVudHNbaV0sIHByZXNlcnZlUm9vdFBhcmVudHMpOwotICAgIH0KLQotICAgIC8vIGlmIHRoZSByZWxhdGl2ZSBwYXRoIGlzIGVtcHR5IG9yIGVuZHMgaW4gYW4gZW1wdHkgc2VnbWVudCwgYSBwYXJlbnQgCi0gICAgLy8gcmVmZXJlbmNlLCBvciBhIHNlbGYgcmVmZXJlbmZjZSwgYWRkIGEgdHJhaWxpbmcgc2VwYXJhdG9yIHRvIGEKLSAgICAvLyBub24tZW1wdHkgcGF0aAotICAgIGlmIChzcCA+IDAgJiYgIChzZWdtZW50Q291bnQgPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICBTRUdNRU5UX0VNUFRZLmVxdWFscyhzZWdtZW50c1tzZWdtZW50Q291bnQgLSAxXSkgfHwKLSAgICAgICAgICAgICAgICAgICAgU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRDb3VudCAtIDFdKSB8fAotICAgICAgICAgICAgICAgICAgICBTRUdNRU5UX1NFTEYuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRDb3VudCAtIDFdKSkpCi0gICAgewotICAgICAgc3RhY2tbc3ArK10gPSBTRUdNRU5UX0VNUFRZOwotICAgIH0KLQotICAgIC8vIHJldHVybiBhIGNvcnJlY3RseSBzaXplZCByZXN1bHQKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3NwXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHN0YWNrLCAwLCByZXN1bHQsIDAsIHNwKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gQWRkcyBhIHNlZ21lbnQgdG8gYSBzdGFjaywgc2tpcHBpbmcgZW1wdHkgc2VnbWVudHMgYW5kIHNlbGYgcmVmZXJlbmNlcywKLSAgLy8gYW5kIGludGVycHJldGluZyBwYXJlbnQgcmVmZXJlbmNlcy4KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGFjY3VtdWxhdGUoU3RyaW5nW10gc3RhY2ssIGludCBzcCwgU3RyaW5nIHNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cykKLSAgewotICAgIGlmIChTRUdNRU5UX1BBUkVOVC5lcXVhbHMoc2VnbWVudCkpCi0gICAgewotICAgICAgaWYgKHNwID09IDApCi0gICAgICB7Ci0gICAgICAgIC8vIHNwZWNpYWwgY2FyZSBtdXN0IGJlIHRha2VuIGZvciBhIHJvb3QncyBwYXJlbnQgcmVmZXJlbmNlOiBpdCBpcwotICAgICAgICAvLyBlaXRoZXIgaWdub3JlZCBvciB0aGUgc3ltYm9saWMgcmVmZXJlbmNlIGl0c2VsZiBpcyBwdXNoZWQKLSAgICAgICAgaWYgKHByZXNlcnZlUm9vdFBhcmVudHMpIHN0YWNrW3NwKytdID0gc2VnbWVudDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gdW5sZXNzIHdlJ3JlIGFscmVhZHkgYWNjdW11bGF0aW5nIHJvb3QgcGFyZW50IHJlZmVyZW5jZXMsCi0gICAgICAgIC8vIHBhcmVudCByZWZlcmVuY2VzIHNpbXBseSBwb3AgdGhlIGxhc3Qgc2VnbWVudCBkZXNjZW5kZWQKLSAgICAgICAgaWYgKFNFR01FTlRfUEFSRU5ULmVxdWFscyhzdGFja1tzcCAtIDFdKSkgc3RhY2tbc3ArK10gPSBzZWdtZW50OwotICAgICAgICBlbHNlIHNwLS07Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCFTRUdNRU5UX0VNUFRZLmVxdWFscyhzZWdtZW50KSAmJiAhU0VHTUVOVF9TRUxGLmVxdWFscyhzZWdtZW50KSkKLSAgICB7Ci0gICAgICAvLyBza2lwIGVtcHR5IHNlZ21lbnRzIGFuZCBzZWxmIHJlZmVyZW5jZXM7IHB1c2ggZXZlcnl0aGluZyBlbHNlCi0gICAgICBzdGFja1tzcCsrXSA9IHNlZ21lbnQ7Ci0gICAgfQotICAgIHJldHVybiBzcDsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyB0aGUgc2hvcnRlc3QgcmVsYXRpdmUgb3IsIGlmIG5lY2Vzc2FyeSwgdGhlIGFic29sdXRlIFVSSSB0aGF0LAotICAgKiB3aGVuIHJlc29sdmVkIGFnYWluc3QgdGhlIGdpdmVuIDxjb2RlPmJhc2U8L2NvZGU+IGFic29sdXRlIGhpZXJhcmNoaWNhbAotICAgKiBVUkkgdXNpbmcge0BsaW5rICNyZXNvbHZlKFVSSSkgcmVzb2x2ZX0sIHdpbGwgeWllbGQgdGhpcyBhYnNvbHV0ZSBVUkkuICAKLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmJhc2U8L2NvZGU+IGlzCi0gICAqIG5vbi1oaWVyYXJjaGljYWwgb3IgaXMgcmVsYXRpdmUuCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT50aGlzPC9jb2RlPiBpcwotICAgKiByZWxhdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgZGVyZXNvbHZlKFVSSSBiYXNlKQotICB7Ci0gICAgcmV0dXJuIGRlcmVzb2x2ZShiYXNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgYW4gYWJzb2x1dGUgVVJJIHRoYXQsIHdoZW4gcmVzb2x2ZWQgYWdhaW5zdCB0aGUgZ2l2ZW4KLSAgICogPGNvZGU+YmFzZTwvY29kZT4gYWJzb2x1dGUgaGllcmFyY2hpY2FsIFVSSSB1c2luZyB7QGxpbmsKLSAgICogI3Jlc29sdmUoVVJJLCBib29sZWFuKSByZXNvbHZlfSwgd2lsbCB5aWVsZCB0aGlzIGFic29sdXRlIFVSSS4KLSAgICoKLSAgICogQHBhcmFtIHByZXNlcnZlUm9vdFBhcmVudHMgdGhlIGJvb2xlYW4gYXJndW1lbnQgdG8gPGNvZGU+cmVzb2x2ZShVUkksCi0gICAqIGJvb2xlYW4pPC9jb2RlPiBmb3Igd2hpY2ggdGhlIHJldHVybmVkIFVSSSBzaG91bGQgcmVzb2x2ZSB0byB0aGlzIFVSSS4KLSAgICogQHBhcmFtIGFueVJlbFBhdGggaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSByZXR1cm5lZCBVUkkncyBwYXRoIChpZgotICAgKiBhbnkpIHdpbGwgYmUgcmVsYXRpdmUsIGlmIHBvc3NpYmxlLiAgSWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgZm9ybSBvZgotICAgKiB0aGUgcmVzdWx0J3MgcGF0aCB3aWxsIGRlcGVuZCB1cG9uIHRoZSBuZXh0IHBhcmFtZXRlci4KLSAgICogQHBhcmFtIHNob3J0ZXJSZWxQYXRoIGlmIDxjb2RlPmFueVJlbFBhdGg8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgKiBhbmQgdGhpcyBwYXJhbWV0ZXIgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSByZXR1cm5lZCBVUkkncyBwYXRoIChpZgotICAgKiBhbnkpIHdpbGwgYmUgcmVsYXRpdmUsIGlmIG9uZSBjYW4gYmUgZm91bmQgdGhhdCBpcyBubyBsb25nZXIgKGJ5IG51bWJlcgotICAgKiBvZiBzZWdtZW50cykgdGhhbiB0aGUgYWJzb2x1dGUgcGF0aC4gIElmIGJvdGggPGNvZGU+YW55UmVsUGF0aDwvY29kZT4KLSAgICogYW5kIHRoaXMgcGFyYW1ldGVyIGFyZSA8Y29kZT5mYWxzZTwvY29kZT4sIGl0IHdpbGwgYmUgYWJzb2x1dGUuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5iYXNlPC9jb2RlPiBpcwotICAgKiBub24taGllcmFyY2hpY2FsIG9yIGlzIHJlbGF0aXZlLgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+dGhpczwvY29kZT4gaXMKLSAgICogcmVsYXRpdmUuCi0gICAqLwotICBwdWJsaWMgVVJJIGRlcmVzb2x2ZShVUkkgYmFzZSwgYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFueVJlbFBhdGgsIGJvb2xlYW4gc2hvcnRlclJlbFBhdGgpCi0gIHsKLSAgICBpZiAoIWJhc2UuaXNIaWVyYXJjaGljYWwoKSB8fCBiYXNlLmlzUmVsYXRpdmUoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiZGVyZXNvbHZlIGFnYWluc3Qgbm9uLWhpZXJhcmNoaWNhbCBvciByZWxhdGl2ZSBiYXNlIik7Ci0gICAgfQotICAgIGlmIChpc1JlbGF0aXZlKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGVyZXNvbHZlIHJlbGF0aXZlIFVSSSIpOwotICAgIH0KLQotICAgIC8vIG5vdGU6IHRoZXNlIGFzc2VydGlvbnMgaW1wbHkgdGhhdCBuZWl0aGVyIHRoaXMgbm9yIHRoZSBiYXNlIFVSSSBoYXMgYQotICAgIC8vIHJlbGF0aXZlIHBhdGg7IHRodXMsIGJvdGggaGF2ZSBlaXRoZXIgYW4gYWJzb2x1dGUgcGF0aCBvciBubyBwYXRoCi0gICAgCi0gICAgLy8gZGlmZmVyZW50IHNjaGVtZTogbmVlZCBjb21wbGV0ZSwgYWJzb2x1dGUgVVJJCi0gICAgaWYgKCFzY2hlbWUuZXF1YWxzSWdub3JlQ2FzZShiYXNlLnNjaGVtZSgpKSkgcmV0dXJuIHRoaXM7Ci0KLSAgICAvLyBzaW5jZSBiYXNlIG11c3QgYmUgaGllcmFyY2hpY2FsLCBhbmQgc2luY2UgYSBub24taGllcmFyY2hpY2FsIFVSSQotICAgIC8vIG11c3QgaGF2ZSBib3RoIHNjaGVtZSBhbmQgb3BhcXVlIHBhcnQsIHRoZSBjb21wbGV0ZSBhYnNvbHV0ZSBVUkkgaXMKLSAgICAvLyBuZWVkZWQgdG8gcmVzb2x2ZSB0byBhIG5vbi1oaWVyYXJjaGljYWwgVVJJCi0gICAgaWYgKCFpc0hpZXJhcmNoaWNhbCgpKSByZXR1cm4gdGhpczsKLQotICAgIFN0cmluZyBuZXdBdXRob3JpdHkgPSBhdXRob3JpdHk7Ci0gICAgU3RyaW5nIG5ld0RldmljZSA9IGRldmljZTsKLSAgICBib29sZWFuIG5ld0Fic29sdXRlUGF0aCA9IGFic29sdXRlUGF0aDsKLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IHNlZ21lbnRzOwotICAgIFN0cmluZyBuZXdRdWVyeSA9IHF1ZXJ5OwotCi0gICAgaWYgKGVxdWFscyhhdXRob3JpdHksIGJhc2UuYXV0aG9yaXR5KCkpICYmCi0gICAgICAgIChoYXNEZXZpY2UoKSB8fCBoYXNQYXRoKCkgfHwgKCFiYXNlLmhhc0RldmljZSgpICYmICFiYXNlLmhhc1BhdGgoKSkpKQotICAgIHsKLSAgICAgIC8vIG1hdGNoaW5nIGF1dGhvcml0aWVzIGFuZCBubyBkZXZpY2Ugb3IgcGF0aCByZW1vdmFsCi0gICAgICBuZXdBdXRob3JpdHkgPSBudWxsOwotCi0gICAgICBpZiAoZXF1YWxzKGRldmljZSwgYmFzZS5kZXZpY2UoKSkgJiYgKGhhc1BhdGgoKSB8fCAhYmFzZS5oYXNQYXRoKCkpKQotICAgICAgewotICAgICAgICAvLyBtYXRjaGluZyBkZXZpY2VzIGFuZCBubyBwYXRoIHJlbW92YWwKLSAgICAgICAgbmV3RGV2aWNlID0gbnVsbDsKLQotICAgICAgICAvLyBleGNlcHRpb24gaWYgKCFoYXNQYXRoKCkgJiYgYmFzZS5oYXNQYXRoKCkpCi0KLSAgICAgICAgaWYgKCFhbnlSZWxQYXRoICYmICFzaG9ydGVyUmVsUGF0aCkKLSAgICAgICAgewotICAgICAgICAgIC8vIHVzZXIgcmVqZWN0cyBhIHJlbGF0aXZlIHBhdGg6IGtlZXAgYWJzb2x1dGUgb3Igbm8gcGF0aAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGhhc1BhdGgoKSA9PSBiYXNlLmhhc1BhdGgoKSAmJiBzZWdtZW50c0VxdWFsKGJhc2UpICYmCi0gICAgICAgICAgICAgICAgIGVxdWFscyhxdWVyeSwgYmFzZS5xdWVyeSgpKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGN1cnJlbnQgZG9jdW1lbnQgcmVmZXJlbmNlOiBrZWVwIG5vIHBhdGggb3IgcXVlcnkKLSAgICAgICAgICBuZXdBYnNvbHV0ZVBhdGggPSBmYWxzZTsKLSAgICAgICAgICBuZXdTZWdtZW50cyA9IE5PX1NFR01FTlRTOwotICAgICAgICAgIG5ld1F1ZXJ5ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghaGFzUGF0aCgpICYmICFiYXNlLmhhc1BhdGgoKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIG5vIHBhdGhzOiBrZWVwIHF1ZXJ5IG9ubHkKLSAgICAgICAgICBuZXdBYnNvbHV0ZVBhdGggPSBmYWxzZTsKLSAgICAgICAgICBuZXdTZWdtZW50cyA9IE5PX1NFR01FTlRTOwotICAgICAgICB9Ci0gICAgICAgIC8vIGV4Y2VwdGlvbiBpZiAoIWhhc0Fic29sdXRlUGF0aCgpKQotICAgICAgICBlbHNlIGlmIChoYXNDb2xsYXBzYWJsZVNlZ21lbnRzKHByZXNlcnZlUm9vdFBhcmVudHMpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gcGF0aCBmb3JtIGRlbWFuZHMgYW4gYWJzb2x1dGUgcGF0aDoga2VlcCBpdCBhbmQgcXVlcnkKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBrZWVwIHF1ZXJ5IGFuZCBzZWxlY3QgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCBiYXNlZCBvbiBsZW5ndGgKLSAgICAgICAgICBTdHJpbmdbXSByZWwgPSBmaW5kUmVsYXRpdmVQYXRoKGJhc2UsIHByZXNlcnZlUm9vdFBhcmVudHMpOwotICAgICAgICAgIGlmIChhbnlSZWxQYXRoIHx8IHNlZ21lbnRzLmxlbmd0aCA+IHJlbC5sZW5ndGgpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gdXNlciBkZW1hbmRzIGEgcmVsYXRpdmUgcGF0aCBvciB0aGUgYWJzb2x1dGUgcGF0aCBpcyBsb25nZXIKLSAgICAgICAgICAgIG5ld0Fic29sdXRlUGF0aCA9IGZhbHNlOwotICAgICAgICAgICAgbmV3U2VnbWVudHMgPSByZWw7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGVsc2Uga2VlcCBzaG9ydGVyIGFic29sdXRlIHBhdGgKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gZWxzZSBrZWVwIGRldmljZSwgcGF0aCwgYW5kIHF1ZXJ5Ci0gICAgfQotICAgIC8vIGVsc2Uga2VlcCBhdXRob3JpdHksIGRldmljZSwgcGF0aCwgYW5kIHF1ZXJ5Ci0KLSAgICAvLyBhbHdheXMgaW5jbHVkZSBmcmFnbWVudCwgZXZlbiBpZiBudWxsOwotICAgIC8vIG5vIHZhbGlkYXRpb24gbmVlZGVkIHNpbmNlIGFsbCBjb21wb25lbnRzIGFyZSBmcm9tIGV4aXN0aW5nIFVSSXMKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBudWxsLCBuZXdBdXRob3JpdHksIG5ld0RldmljZSwgbmV3QWJzb2x1dGVQYXRoLAotICAgICAgICAgICAgICAgICAgIG5ld1NlZ21lbnRzLCBuZXdRdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBub24tcmVsYXRpdmUgcGF0aCBpbmNsdWRlcyBzZWdtZW50cyB0aGF0IHdvdWxkIGJlCi0gIC8vIGNvbGxhcHNlZCB3aGVuIHJlc29sdmluZzsgZmFsc2Ugb3RoZXJ3aXNlLiAgSWYgcHJlc2VydmVSb290UGFyZW50cyBpcwotICAvLyB0cnVlLCBjb2xsYXBzYWJsZSBzZWdtZW50cyBpbmNsdWRlIGFueSBlbXB0eSBzZWdtZW50cywgZXhjZXB0IGZvciB0aGUKLSAgLy8gbGFzdCBzZWdtZW50LCBhcyB3ZWxsIGFzIGFuZCBwYXJlbnQgYW5kIHNlbGYgcmVmZXJlbmNlcy4gIElmCi0gIC8vIHByZXNlcnZlUm9vdHNQYXJlbnRzIGlzIGZhbHNlLCBwYXJlbnQgcmVmZXJlbmNlcyBhcmUgbm90IGNvbGxhcHNhYmxlIGlmCi0gIC8vIHRoZXkgYXJlIHRoZSBmaXJzdCBzZWdtZW50IG9yIHByZWNlZWRlZCBvbmx5IGJ5IG90aGVyIHBhcmVudAotICAvLyByZWZlcmVuY2VzLgotICBwcml2YXRlIGJvb2xlYW4gaGFzQ29sbGFwc2FibGVTZWdtZW50cyhib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMpCi0gIHsKLSAgICBpZiAoaGFzUmVsYXRpdmVQYXRoKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVzdCBjb2xsYXBzYWJpbGl0eSBvZiByZWxhdGl2ZSBwYXRoIik7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWdtZW50ID0gc2VnbWVudHNbaV07Ci0gICAgICBpZiAoKGkgPCBsZW4gLSAxICYmIFNFR01FTlRfRU1QVFkuZXF1YWxzKHNlZ21lbnQpKSB8fAotICAgICAgICAgIFNFR01FTlRfU0VMRi5lcXVhbHMoc2VnbWVudCkgfHwKLSAgICAgICAgICBTRUdNRU5UX1BBUkVOVC5lcXVhbHMoc2VnbWVudCkgJiYgKAotICAgICAgICAgICAgIXByZXNlcnZlUm9vdFBhcmVudHMgfHwgKAotICAgICAgICAgICAgICBpICE9IDAgJiYgIVNFR01FTlRfUEFSRU5ULmVxdWFscyhzZWdtZW50c1tpIC0gMV0pKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBzaG9ydGVzdCByZWxhdGl2ZSBwYXRoIGJldHdlZW4gdGhlIHRoZSBub24tcmVsYXRpdmUgcGF0aCBvZgotICAvLyB0aGUgZ2l2ZW4gYmFzZSBhbmQgdGhpcyBhYnNvbHV0ZSBwYXRoLiAgSWYgdGhlIGJhc2UgaGFzIG5vIHBhdGgsIGl0IGlzCi0gIC8vIHRyZWF0ZWQgYXMgdGhlIHJvb3QgYWJzb2x1dGUgcGF0aC4KLSAgcHJpdmF0ZSBTdHJpbmdbXSBmaW5kUmVsYXRpdmVQYXRoKFVSSSBiYXNlLCBib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMpCi0gIHsKLSAgICBpZiAoYmFzZS5oYXNSZWxhdGl2ZVBhdGgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiZmluZCByZWxhdGl2ZSBwYXRoIGFnYWluc3QgYmFzZSB3aXRoIHJlbGF0aXZlIHBhdGgiKTsKLSAgICB9Ci0gICAgaWYgKCFoYXNBYnNvbHV0ZVBhdGgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiZmluZCByZWxhdGl2ZSBwYXRoIG9mIG5vbi1hYnNvbHV0ZSBwYXRoIik7Ci0gICAgfQotCi0gICAgLy8gdHJlYXQgYW4gZW1wdHkgYmFzZSBwYXRoIGFzIHRoZSByb290IGFic29sdXRlIHBhdGgKLSAgICBTdHJpbmdbXSBzdGFydFBhdGggPSBiYXNlLmNvbGxhcHNlU2VnbWVudHMocHJlc2VydmVSb290UGFyZW50cyk7Ci0gICAgU3RyaW5nW10gZW5kUGF0aCA9IHNlZ21lbnRzOwotCi0gICAgLy8gZHJvcCBsYXN0IHNlZ21lbnQgZnJvbSBiYXNlLCBhcyBpbiByZXNvbHZpbmcKLSAgICBpbnQgc3RhcnRDb3VudCA9IHN0YXJ0UGF0aC5sZW5ndGggPiAwID8gc3RhcnRQYXRoLmxlbmd0aCAtIDEgOiAwOwotICAgIGludCBlbmRDb3VudCA9IGVuZFBhdGgubGVuZ3RoOwotCi0gICAgLy8gaW5kZXggb2YgZmlyc3Qgc2VnbWVudCB0aGF0IGlzIGRpZmZlcmVudCBiZXR3ZWVuIGVuZFBhdGggYW5kIHN0YXJ0UGF0aAotICAgIGludCBkaWZmID0gMDsKLQotICAgIC8vIGlmIGVuZFBhdGggaXMgc2hvcnRlciB0aGFuIHN0YXJ0UGF0aCwgdGhlIGxhc3Qgc2VnbWVudCBvZiBlbmRQYXRoIG1heQotICAgIC8vIG5vdCBiZSBjb21wYXJlZDogYmVjYXVzZSBzdGFydFBhdGggaGFzIGJlZW4gY29sbGFwc2VkIGFuZCBoYWQgaXRzCi0gICAgLy8gbGFzdCBzZWdtZW50IHJlbW92ZWQsIGFsbCBwcmVjZWVkaW5nIHNlZ21lbnRzIGNhbiBiZSBjb25zaWRlcmVkIG5vbi0KLSAgICAvLyBlbXB0eSBhbmQgZm9sbG93ZWQgYnkgYSBzZXBhcmF0b3IsIHdoaWxlIHRoZSBsYXN0IHNlZ21lbnQgb2YgZW5kUGF0aAotICAgIC8vIHdpbGwgZWl0aGVyIGJlIG5vbi1lbXB0eSBhbmQgbm90IGZvbGxvd2VkIGJ5IGEgc2VwYXJhdG9yLCBvciBqdXN0IGVtcHR5Ci0gICAgZm9yIChpbnQgY291bnQgPSBzdGFydENvdW50IDwgZW5kQ291bnQgPyBzdGFydENvdW50IDogZW5kQ291bnQgLSAxOwotICAgICAgICAgZGlmZiA8IGNvdW50ICYmIHN0YXJ0UGF0aFtkaWZmXS5lcXVhbHMoZW5kUGF0aFtkaWZmXSk7IGRpZmYrKyk7Ci0KLSAgICBpbnQgdXBDb3VudCA9IHN0YXJ0Q291bnQgLSBkaWZmOwotICAgIGludCBkb3duQ291bnQgPSBlbmRDb3VudCAtIGRpZmY7Ci0KLSAgICAvLyBhIHNpbmdsZSBzZXBhcmF0b3IsIHBvc3NpYmx5IHByZWNlZWRlZCBieSBzb21lIHBhcmVudCByZWZlcmVuY2UKLSAgICAvLyBzZWdtZW50cywgaXMgcmVkdW5kYW50Ci0gICAgaWYgKGRvd25Db3VudCA9PSAxICYmIFNFR01FTlRfRU1QVFkuZXF1YWxzKGVuZFBhdGhbZW5kQ291bnQgLSAxXSkpCi0gICAgewotICAgICAgZG93bkNvdW50ID0gMDsKLSAgICB9Ci0KLSAgICAvLyBhbiBlbXB0eSBwYXRoIG5lZWRzIHRvIGJlIHJlcGxhY2VkIGJ5IGEgc2luZ2xlICIuIiBpZiB0aGVyZSBpcyBubwotICAgIC8vIHF1ZXJ5LCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIGEgY3VycmVudCBkb2N1bWVudCByZWZlcmVuY2UKLSAgICBpZiAodXBDb3VudCArIGRvd25Db3VudCA9PSAwKQotICAgIHsKLSAgICAgIGlmIChxdWVyeSA9PSBudWxsKSByZXR1cm4gbmV3IFN0cmluZ1tdIHsgU0VHTUVOVF9TRUxGIH07Ci0gICAgICByZXR1cm4gTk9fU0VHTUVOVFM7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJuIGEgY29ycmVjdGx5IHNpemVkIHJlc3VsdAotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbdXBDb3VudCArIGRvd25Db3VudF07Ci0gICAgQXJyYXlzLmZpbGwocmVzdWx0LCAwLCB1cENvdW50LCBTRUdNRU5UX1BBUkVOVCk7Ci0gICAgU3lzdGVtLmFycmF5Y29weShlbmRQYXRoLCBkaWZmLCByZXN1bHQsIHVwQ291bnQsIGRvd25Db3VudCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIENvbGxhcHNlcyBub24tZW5kaW5nIGVtcHR5IHNlZ21lbnRzLCBwYXJlbnQgcmVmZXJlbmNlcywgYW5kIHNlbGYKLSAgLy8gcmVmZXJlbmNlcyBpbiBhIG5vbi1yZWxhdGl2ZSBwYXRoLCByZXR1cm5pbmcgdGhlIHNhbWUgcGF0aCB0aGF0IHdvdWxkCi0gIC8vIGJlIHByb2R1Y2VkIGZyb20gdGhlIGJhc2UgaGllcmFyY2hpY2FsIFVSSSBhcyBwYXJ0IG9mIGEgcmVzb2x2ZS4KLSAgU3RyaW5nW10gY29sbGFwc2VTZWdtZW50cyhib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMpCi0gIHsKLSAgICBpZiAoaGFzUmVsYXRpdmVQYXRoKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29sbGFwc2UgcmVsYXRpdmUgcGF0aCIpOwotICAgIH0KLQotICAgIGlmICghaGFzQ29sbGFwc2FibGVTZWdtZW50cyhwcmVzZXJ2ZVJvb3RQYXJlbnRzKSkgcmV0dXJuIHNlZ21lbnRzKCk7Ci0KLSAgICAvLyB1c2UgYSBzdGFjayB0byBhY2N1bXVsYXRlIHNlZ21lbnRzCi0gICAgaW50IHNlZ21lbnRDb3VudCA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBTdHJpbmdbXSBzdGFjayA9IG5ldyBTdHJpbmdbc2VnbWVudENvdW50XTsKLSAgICBpbnQgc3AgPSAwOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50Q291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBzcCA9IGFjY3VtdWxhdGUoc3RhY2ssIHNwLCBzZWdtZW50c1tpXSwgcHJlc2VydmVSb290UGFyZW50cyk7Ci0gICAgfQotCi0gICAgLy8gaWYgdGhlIHBhdGggaXMgbm9uLWVtcHR5IGFuZCBvcmlnaW5hbGx5IGVuZGVkIGluIGFuIGVtcHR5IHNlZ21lbnQsIGEKLSAgICAvLyBwYXJlbnQgcmVmZXJlbmNlLCBvciBhIHNlbGYgcmVmZXJlbmNlLCBhZGQgYSB0cmFpbGluZyBzZXBhcmF0b3IKLSAgICBpZiAoc3AgPiAwICYmIChTRUdNRU5UX0VNUFRZLmVxdWFscyhzZWdtZW50c1tzZWdtZW50Q291bnQgLSAxXSkgfHwKLSAgICAgICAgICAgICAgICAgICBTRUdNRU5UX1BBUkVOVC5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pIHx8Ci0gICAgICAgICAgICAgICAgICAgU0VHTUVOVF9TRUxGLmVxdWFscyhzZWdtZW50c1tzZWdtZW50Q291bnQgLSAxXSkpKQotICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICBzdGFja1tzcCsrXSA9IFNFR01FTlRfRU1QVFk7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJuIGEgY29ycmVjdGx5IHNpemVkIHJlc3VsdAotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbc3BdOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc3RhY2ssIDAsIHJlc3VsdCwgMCwgc3ApOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVJJLiAgRm9yIGEgZ2VuZXJpYywKLSAgICogbm9uLWhpZXJhcmNoaWNhbCBVUkksIHRoaXMgbG9va3MgbGlrZToKLSAgICogPHByZT4KLSAgICogICBzY2hlbWU6b3BhcXVlUGFydCNmcmFnbWVudDwvcHJlPgotICAgKiAKLSAgICogPHA+Rm9yIGEgaGllcmFyY2hpY2FsIFVSSSwgaXQgbG9va3MgbGlrZToKLSAgICogPHByZT4KLSAgICogICBzY2hlbWU6Ly9hdXRob3JpdHkvZGV2aWNlL3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi4/cXVlcnkjZnJhZ21lbnQ8L3ByZT4KLSAgICoKLSAgICogPHA+Rm9yIGFuIDxhIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlIFVSSTwvYT4sIGl0J3MganVzdDoKLSAgICogPHByZT4KLSAgICogICBzY2hlbWU6YXV0aG9yaXR5L3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi4/cXVlcnkjZnJhZ21lbnQ8L3ByZT4KLSAgICogPHA+T2YgY291cnNlLCBhYnNlbnQgY29tcG9uZW50cyBhbmQgdGhlaXIgc2VwYXJhdG9ycyB3aWxsIGJlIG9taXR0ZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChjYWNoZWRUb1N0cmluZyA9PSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBpZiAoIWlzUmVsYXRpdmUoKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChzY2hlbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKFNDSEVNRV9TRVBBUkFUT1IpOwotICAgICAgfQotCi0gICAgICBpZiAoaXNIaWVyYXJjaGljYWwoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGhhc0F1dGhvcml0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc0FyY2hpdmUoKSkgcmVzdWx0LmFwcGVuZChBVVRIT1JJVFlfU0VQQVJBVE9SKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKGF1dGhvcml0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzRGV2aWNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzQWJzb2x1dGVQYXRoKCkpIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChpICE9IDApIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VnbWVudHNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc1F1ZXJ5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFFVRVJZX1NFUEFSQVRPUik7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChxdWVyeSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChhdXRob3JpdHkpOwotICAgICAgfQotCi0gICAgICBpZiAoaGFzRnJhZ21lbnQoKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChGUkFHTUVOVF9TRVBBUkFUT1IpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGZyYWdtZW50KTsKLSAgICAgIH0KLSAgICAgIGNhY2hlZFRvU3RyaW5nID0gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBjYWNoZWRUb1N0cmluZzsKLSAgfQotCi0gIC8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVUkkgZm9yIGRlYnVnZ2luZywgZXhwbGljaXRseQotICAvLyBzaG93aW5nIGVhY2ggb2YgdGhlIGNvbXBvbmVudHMuCi0gIFN0cmluZyB0b1N0cmluZyhib29sZWFuIGluY2x1ZGVTaW1wbGVGb3JtKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpZiAoaW5jbHVkZVNpbXBsZUZvcm0pIHJlc3VsdC5hcHBlbmQodG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4gaGllcmFyY2hpY2FsOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGhpZXJhcmNoaWNhbCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4gICAgICAgc2NoZW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHNjaGVtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4gICAgYXV0aG9yaXR5OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGF1dGhvcml0eSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4gICAgICAgZGV2aWNlOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGRldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4gYWJzb2x1dGVQYXRoOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGFic29sdXRlUGF0aCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4gICAgIHNlZ21lbnRzOiAiKTsKLSAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09IDApIHJlc3VsdC5hcHBlbmQoIjxlbXB0eT4iKTsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgPiAwKSByZXN1bHQuYXBwZW5kKCJcbiAgICAgICAgICAgICAgICIpOwotICAgICAgcmVzdWx0LmFwcGVuZChzZWdtZW50c1tpXSk7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgICAgICBxdWVyeTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChxdWVyeSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4gICAgIGZyYWdtZW50OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGZyYWdtZW50KTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBVUkkgbWF5IHJlZmVyIGRpcmVjdGx5IHRvIGEgbG9jYWxseSBhY2Nlc3NpYmxlIGZpbGUsIGFzCi0gICAqIGRldGVybWluZWQgYnkge0BsaW5rICNpc0ZpbGUgaXNGaWxlfSwge0BsaW5rIGRlY29kZSBkZWNvZGVzfSBhbmQgZm9ybWF0cyAgCi0gICAqIHRoZSBVUkkgYXMgYSBwYXRobmFtZSB0byB0aGF0IGZpbGU7IHJldHVybnMgbnVsbCBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPklmIHRoZXJlIGlzIG5vIGF1dGhvcml0eSwgdGhlIGZvcm1hdCBvZiB0aGlzIHN0cmluZyBpczoKLSAgICogPHByZT4KLSAgICogICBkZXZpY2UvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLjwvcHJlPgotICAgKgotICAgKiA8cD5JZiB0aGVyZSBpcyBhbiBhdXRob3JpdHksIGl0IGlzOgotICAgKiA8cHJlPgotICAgKiAgIC8vYXV0aG9yaXR5L2RldmljZS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uPC9wcmU+Ci0gICAqIAotICAgKiA8cD5Ib3dldmVyLCB0aGUgY2hhcmFjdGVyIHVzZWQgYXMgYSBzZXBhcmF0b3IgaXMgc3lzdGVtLWRlcGVuZGFudCBhbmQKLSAgICogb2J0YWluZWQgZnJvbSB7QGxpbmsgamF2YS5pby5GaWxlI3NlcGFyYXRvckNoYXJ9LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b0ZpbGVTdHJpbmcoKQotICB7Ci0gICAgaWYgKCFpc0ZpbGUoKSkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGNoYXIgc2VwYXJhdG9yID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCi0gICAgaWYgKGhhc0F1dGhvcml0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoYXV0aG9yaXR5KTsKLQotICAgICAgaWYgKGhhc0RldmljZSgpKSByZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgaWYgKGhhc0RldmljZSgpKSByZXN1bHQuYXBwZW5kKGRldmljZSk7Ci0gICAgaWYgKGhhc0Fic29sdXRlUGF0aCgpKSByZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkgcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotICAgICAgcmVzdWx0LmFwcGVuZChzZWdtZW50c1tpXSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRlY29kZShyZXN1bHQudG9TdHJpbmcoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvcm1lZCBieSBhcHBlbmRpbmcgdGhlIHNwZWNpZmllZCBzZWdtZW50IG9uIHRvIHRoZSBlbmQKLSAgICogb2YgdGhlIHBhdGggb2YgdGhpcyBVUkksIGlmIGhpZXJhcmNoaWNhbDsgdGhpcyBVUkkgdW5jaGFuZ2VkLAotICAgKiBvdGhlcndpc2UuICBJZiB0aGlzIFVSSSBoYXMgYW4gYXV0aG9yaXR5IGFuZC9vciBkZXZpY2UsIGJ1dCBubyBwYXRoLAotICAgKiB0aGUgc2VnbWVudCBiZWNvbWVzIHRoZSBmaXJzdCB1bmRlciB0aGUgcm9vdCBpbiBhbiBhYnNvbHV0ZSBwYXRoLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+c2VnbWVudDwvY29kZT4KLSAgICogaXMgbm90IGEgdmFsaWQgc2VnbWVudCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNlZ21lbnR9LgotICAgKi8KLSAgcHVibGljIFVSSSBhcHBlbmRTZWdtZW50KFN0cmluZyBzZWdtZW50KQotICB7Ci0gICAgaWYgKCF2YWxpZFNlZ21lbnQoc2VnbWVudCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzZWdtZW50OiAiICsgc2VnbWVudCk7Ci0gICAgfQotCi0gICAgaWYgKCFpc0hpZXJhcmNoaWNhbCgpKSByZXR1cm4gdGhpczsKLQotICAgIC8vIGFic29sdXRlIHBhdGggb3Igbm8gcGF0aCAtPiBhYnNvbHV0ZSBwYXRoCi0gICAgYm9vbGVhbiBuZXdBYnNvbHV0ZVBhdGggPSAhaGFzUmVsYXRpdmVQYXRoKCk7Ci0KLSAgICBpbnQgbGVuID0gc2VnbWVudHMubGVuZ3RoOwotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tsZW4gKyAxXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnRzLCAwLCBuZXdTZWdtZW50cywgMCwgbGVuKTsKLSAgICBuZXdTZWdtZW50c1tsZW5dID0gc2VnbWVudDsKLQotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIG5ld0Fic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGJ5IGFwcGVuZGluZyB0aGUgc3BlY2lmaWVkIHNlZ21lbnRzIG9uIHRvIHRoZQotICAgKiBlbmQgb2YgdGhlIHBhdGggb2YgdGhpcyBVUkksIGlmIGhpZXJhcmNoaWNhbDsgdGhpcyBVUkkgdW5jaGFuZ2VkLAotICAgKiBvdGhlcndpc2UuICBJZiB0aGlzIFVSSSBoYXMgYW4gYXV0aG9yaXR5IGFuZC9vciBkZXZpY2UsIGJ1dCBubyBwYXRoLAotICAgKiB0aGUgc2VnbWVudHMgYXJlIG1hZGUgdG8gZm9ybSBhbiBhYnNvbHV0ZSBwYXRoLgotICAgKgotICAgKiBAcGFyYW0gc2VnbWVudHMgYW4gYXJyYXkgb2Ygbm9uLW51bGwgc3RyaW5ncywgZWFjaCByZXByZXNlbnRpbmcgb25lCi0gICAqIHNlZ21lbnQgb2YgdGhlIHBhdGguICBJZiBkZXNpcmVkLCBhIHRyYWlsaW5nIHNlcGFyYXRvciBzaG91bGQgYmUKLSAgICogcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHktc3RyaW5nIHNlZ21lbnQgYXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUKLSAgICogYXJyYXkuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5zZWdtZW50czwvY29kZT4KLSAgICogaXMgbm90IGEgdmFsaWQgc2VnbWVudCBhcnJheSBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNlZ21lbnRzfS4KLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kU2VnbWVudHMoU3RyaW5nW10gc2VnbWVudHMpCi0gIHsKLSAgICBpZiAoIXZhbGlkU2VnbWVudHMoc2VnbWVudHMpKQotICAgIHsKLSAgICAgIFN0cmluZyBzID0gc2VnbWVudHMgPT0gbnVsbCA/ICJpbnZhbGlkIHNlZ21lbnRzOiAiICsgc2VnbWVudHMgOgotICAgICAgICAiaW52YWxpZCBzZWdtZW50OiAiICsgZmlyc3RJbnZhbGlkU2VnbWVudChzZWdtZW50cyk7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHMpOwotICAgIH0KLQotICAgIGlmICghaXNIaWVyYXJjaGljYWwoKSkgcmV0dXJuIHRoaXM7Ci0KLSAgICAvLyBhYnNvbHV0ZSBwYXRoIG9yIG5vIHBhdGggLT4gYWJzb2x1dGUgcGF0aAotICAgIGJvb2xlYW4gbmV3QWJzb2x1dGVQYXRoID0gIWhhc1JlbGF0aXZlUGF0aCgpOyAKLQotICAgIGludCBsZW4gPSB0aGlzLnNlZ21lbnRzLmxlbmd0aDsKLSAgICBpbnQgc2VnbWVudHNDb3VudCA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IG5ldyBTdHJpbmdbbGVuICsgc2VnbWVudHNDb3VudF07Ci0gICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLnNlZ21lbnRzLCAwLCBuZXdTZWdtZW50cywgMCwgbGVuKTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnRzLCAwLCBuZXdTZWdtZW50cywgbGVuLCBzZWdtZW50c0NvdW50KTsKLSAgICAKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBuZXdBYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvcm1lZCBieSB0cmltbWluZyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzZWdtZW50cwotICAgKiAoaW5jbHVkaW5nIGVtcHR5IHNlZ21lbnRzLCBzdWNoIGFzIG9uZSByZXByZXNlbnRpbmcgYSB0cmFpbGluZwotICAgKiBzZXBhcmF0b3IpIGZyb20gdGhlIGVuZCBvZiB0aGUgcGF0aCBvZiB0aGlzIFVSSSwgaWYgaGllcmFyY2hpY2FsOwotICAgKiBvdGhlcndpc2UsIHRoaXMgVVJJIGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLSAgICoKLSAgICogPHA+Tm90ZSB0aGF0IGlmIGFsbCBzZWdtZW50cyBhcmUgdHJpbW1lZCBmcm9tIGFuIGFic29sdXRlIHBhdGgsIHRoZQotICAgKiByb290IGFic29sdXRlIHBhdGggcmVtYWlucy4KLSAgICogCi0gICAqIEBwYXJhbSBpIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgdG8gYmUgdHJpbW1lZCBpbiB0aGUgcmV0dXJuZWQgVVJJLiAgSWYKLSAgICogbGVzcyB0aGFuIDEsIHRoaXMgVVJJIGlzIHJldHVybmVkIHVuY2hhbmdlZDsgaWYgZXF1YWwgdG8gb3IgZ3JlYXRlcgotICAgKiB0aGFuIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgaW4gdGhpcyBVUkkncyBwYXRoLCBhbGwgc2VnbWVudHMgYXJlCi0gICAqIHRyaW1tZWQuICAKLSAgICovCi0gIHB1YmxpYyBVUkkgdHJpbVNlZ21lbnRzKGludCBpKQotICB7Ci0gICAgaWYgKCFpc0hpZXJhcmNoaWNhbCgpIHx8IGkgPCAxKSByZXR1cm4gdGhpczsKLQotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gTk9fU0VHTUVOVFM7Ci0gICAgaW50IGxlbiA9IHNlZ21lbnRzLmxlbmd0aCAtIGk7Ci0gICAgaWYgKGxlbiA+IDApCi0gICAgewotICAgICAgbmV3U2VnbWVudHMgPSBuZXcgU3RyaW5nW2xlbl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnRzLCAwLCBuZXdTZWdtZW50cywgMCwgbGVuKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLAotICAgICAgICAgICAgICAgICAgIG5ld1NlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgdGhhdCBoYXMgYSBwYXRoCi0gICAqIHRoYXQgZW5kcyB3aXRoIGEgdHJhaWxpbmcgc2VwYXJhdG9yOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHRyYWlsaW5nIHNlcGFyYXRvciBpcyByZXByZXNlbnRlZCBhcyBhbiBlbXB0eSBzZWdtZW50IGFzIHRoZQotICAgKiBsYXN0IHNlZ21lbnQgaW4gdGhlIHBhdGg7IG5vdGUgdGhhdCB0aGlzIGRlZmluaXRpb24gZG9lcyA8ZW0+bm90PC9lbT4KLSAgICogaW5jbHVkZSB0aGUgbG9uZSBzZXBhcmF0b3IgaW4gdGhlIHJvb3QgYWJzb2x1dGUgcGF0aC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1RyYWlsaW5nUGF0aFNlcGFyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gc2VnbWVudHMubGVuZ3RoID4gMCAmJiAKLSAgICAgIFNFR01FTlRfRU1QVFkuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aG9zZSBwYXRoIGluY2x1ZGVzIGEgZmlsZSBleHRlbnNpb24sCi0gICAqIHRoYXQgZmlsZSBleHRlbnNpb24gaXMgcmV0dXJuZWQ7IG51bGwgb3RoZXJ3aXNlLiAgV2UgZGVmaW5lIGEgZmlsZQotICAgKiBleHRlbnNpb24gYXMgYW55IHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhc3QgcGVyaW9kICgiLiIpIGluIHRoZSBmaW5hbAotICAgKiBwYXRoIHNlZ21lbnQuICBJZiB0aGVyZSBpcyBubyBwYXRoLCB0aGUgcGF0aCBlbmRzIGluIGEgdHJhaWxpbmcKLSAgICogc2VwYXJhdG9yLCBvciB0aGUgZmluYWwgc2VnbWVudCBjb250YWlucyBubyBwZXJpb2QsIHRoZW4gd2UgY29uc2lkZXIKLSAgICogdGhlcmUgdG8gYmUgbm8gZmlsZSBleHRlbnNpb24uICBJZiB0aGUgZmluYWwgc2VnbWVudCBlbmRzIGluIGEgcGVyaW9kLAotICAgKiB0aGVuIHRoZSBmaWxlIGV4dGVuc2lvbiBpcyBhbiBlbXB0eSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGZpbGVFeHRlbnNpb24oKQotICB7Ci0gICAgaW50IGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBpZiAobGVuID09IDApIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nIGxhc3RTZWdtZW50ID0gc2VnbWVudHNbbGVuIC0gMV07Ci0gICAgaW50IGkgPSBsYXN0U2VnbWVudC5sYXN0SW5kZXhPZihGSUxFX0VYVEVOU0lPTl9TRVBBUkFUT1IpOwotICAgIHJldHVybiBpIDwgMCA/IG51bGwgOiBsYXN0U2VnbWVudC5zdWJzdHJpbmcoaSArIDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3JtZWQgYnkgYXBwZW5kaW5nIGEgcGVyaW9kICgiLiIpIGZvbGxvd2VkIGJ5IHRoZQotICAgKiBzcGVjaWZpZWQgZmlsZSBleHRlbnNpb24gdG8gdGhlIGxhc3QgcGF0aCBzZWdtZW50IG9mIHRoaXMgVVJJLCBpZiBpdCBpcwotICAgKiBoaWVyYXJjaGljYWwgd2l0aCBhIG5vbi1lbXB0eSBwYXRoIGVuZGluZyBpbiBhIG5vbi1lbXB0eSBzZWdtZW50OwotICAgKiBvdGhlcndpc2UsIHRoaXMgVVJJIGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQotICAgKiA8cD5UaGUgZXh0ZW5zaW9uIGlzIGFwcGVuZGVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgc2VnbWVudCBhbHJlYWR5Ci0gICAqIGNvbnRhaW5zIGFuIGV4dGVuc2lvbi4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmCi0gICAqIDxjb2RlPmZpbGVFeHRlbnNpb248L2NvZGU+IGlzIG5vdCBhIHZhbGlkIHNlZ21lbnQgKHBvcnRpb24pIGFjY29yZGluZwotICAgKiB0byB7QGxpbmsgI3ZhbGlkU2VnbWVudH0uCi0gICAqLwotICBwdWJsaWMgVVJJIGFwcGVuZEZpbGVFeHRlbnNpb24oU3RyaW5nIGZpbGVFeHRlbnNpb24pCi0gIHsKLSAgICBpZiAoIXZhbGlkU2VnbWVudChmaWxlRXh0ZW5zaW9uKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiaW52YWxpZCBzZWdtZW50IHBvcnRpb246ICIgKyBmaWxlRXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBpbnQgbGVuID0gc2VnbWVudHMubGVuZ3RoOwotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIHRoaXM7Ci0KLSAgICBTdHJpbmcgbGFzdFNlZ21lbnQgPSBzZWdtZW50c1tsZW4gLSAxXTsKLSAgICBpZiAoU0VHTUVOVF9FTVBUWS5lcXVhbHMobGFzdFNlZ21lbnQpKSByZXR1cm4gdGhpczsKLSAgICBTdHJpbmdCdWZmZXIgbmV3TGFzdFNlZ21lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKGxhc3RTZWdtZW50KTsKLSAgICBuZXdMYXN0U2VnbWVudC5hcHBlbmQoRklMRV9FWFRFTlNJT05fU0VQQVJBVE9SKTsKLSAgICBuZXdMYXN0U2VnbWVudC5hcHBlbmQoZmlsZUV4dGVuc2lvbik7Ci0KLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IG5ldyBTdHJpbmdbbGVuXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnRzLCAwLCBuZXdTZWdtZW50cywgMCwgbGVuIC0gMSk7Ci0gICAgbmV3U2VnbWVudHNbbGVuIC0gMV0gPSBuZXdMYXN0U2VnbWVudC50b1N0cmluZygpOwotICAgIAotICAgIC8vIG5vdGU6IHNlZ21lbnRzLmxlbmd0aCA+IDAgLT4gaGllcmFyY2hpY2FsCi0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLAotICAgICAgICAgICAgICAgICAgIG5ld1NlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOyAKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIFVSSSBoYXMgYSBub24tbnVsbCB7QGxpbmsgI2ZpbGVFeHRlbnNpb24gZmlsZUV4dGVuc2lvbn0sCi0gICAqIHJldHVybnMgdGhlIFVSSSBmb3JtZWQgYnkgcmVtb3ZpbmcgaXQ7IHRoaXMgVVJJIHVuY2hhbmdlZCwgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFVSSSB0cmltRmlsZUV4dGVuc2lvbigpCi0gIHsKLSAgICBpbnQgbGVuID0gc2VnbWVudHMubGVuZ3RoOwotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIHRoaXM7Ci0KLSAgICBTdHJpbmcgbGFzdFNlZ21lbnQgPSBzZWdtZW50c1tsZW4gLSAxXTsKLSAgICBpbnQgaSA9IGxhc3RTZWdtZW50Lmxhc3RJbmRleE9mKEZJTEVfRVhURU5TSU9OX1NFUEFSQVRPUik7Ci0gICAgaWYgKGkgPCAwKSByZXR1cm4gdGhpczsKLQotICAgIFN0cmluZyBuZXdMYXN0U2VnbWVudCA9IGxhc3RTZWdtZW50LnN1YnN0cmluZygwLCBpKTsKLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IG5ldyBTdHJpbmdbbGVuXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnRzLCAwLCBuZXdTZWdtZW50cywgMCwgbGVuIC0gMSk7Ci0gICAgbmV3U2VnbWVudHNbbGVuIC0gMV0gPSBuZXdMYXN0U2VnbWVudDsKLQotICAgIC8vIG5vdGU6IHNlZ21lbnRzLmxlbmd0aCA+IDAgLT4gaGllcmFyY2hpY2FsCi0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLAotICAgICAgICAgICAgICAgICAgIG5ld1NlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOyAKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHRoYXQgZW5kcyBpbiBhCi0gICAqIHNsYXNoOyB0aGF0IGlzLCBpdCBoYXMgYSB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBvciBpcyB0aGUgcm9vdAotICAgKiBhYnNvbHV0ZSBwYXRoLCBhbmQgaGFzIG5vIHF1ZXJ5IGFuZCBubyBmcmFnbWVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIGlzIHJldHVybmVkIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlZml4KCkKLSAgewotICAgIHJldHVybiBoaWVyYXJjaGljYWwgJiYgcXVlcnkgPT0gbnVsbCAmJiBmcmFnbWVudCA9PSBudWxsICYmCi0gICAgICAoaGFzVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgfHwgKGFic29sdXRlUGF0aCAmJiBzZWdtZW50cy5sZW5ndGggPT0gMCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHJlZmVyZW5jZSBhbmQgPGNvZGU+b2xkUHJlZml4PC9jb2RlPiBpcyBhCi0gICAqIHByZWZpeCBvZiBpdCwgdGhpcyByZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGJ5IHJlcGxhY2luZyBpdCBieQotICAgKiA8Y29kZT5uZXdQcmVmaXg8L2NvZGU+OyA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkluIG9yZGVyIHRvIGJlIGEgcHJlZml4LCB0aGUgPGNvZGU+b2xkUHJlZml4PC9jb2RlPidzCi0gICAqIHtAbGluayAjaXNQcmVmaXggaXNQcmVmaXh9IG11c3QgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LCBhbmQgaXQgbXVzdAotICAgKiBtYXRjaCB0aGlzIFVSSSdzIHNjaGVtZSwgYXV0aG9yaXR5LCBhbmQgZGV2aWNlLiAgQWxzbywgdGhlIHBhdGhzIG11c3QKLSAgICogbWF0Y2gsIHVwIHRvIHByZWZpeCdzIGVuZC4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGVpdGhlcgotICAgKiA8Y29kZT5vbGRQcmVmaXg8L2NvZGU+IG9yIDxjb2RlPm5ld1ByZWZpeDwvY29kZT4gaXMgbm90IGEgcHJlZml4IFVSSQotICAgKiBhY2NvcmRpbmcgdG8ge0BsaW5rICNpc1ByZWZpeH0uCi0gICAqLwotICBwdWJsaWMgVVJJIHJlcGxhY2VQcmVmaXgoVVJJIG9sZFByZWZpeCwgVVJJIG5ld1ByZWZpeCkKLSAgewotICAgIGlmICghb2xkUHJlZml4LmlzUHJlZml4KCkgfHwgIW5ld1ByZWZpeC5pc1ByZWZpeCgpKQotICAgIHsKLSAgICAgIFN0cmluZyB3aGljaCA9IG9sZFByZWZpeC5pc1ByZWZpeCgpID8gIm5ldyIgOiAib2xkIjsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vbi1wcmVmaXggIiArIHdoaWNoICsgIiB2YWx1ZSIpOwotICAgIH0KLQotICAgIC8vIEdldCB3aGF0J3MgbGVmdCBvZiB0aGUgc2VnbWVudHMgYWZ0ZXIgdHJpbW1pbmcgdGhlIHByZWZpeC4KLSAgICBTdHJpbmdbXSB0YWlsU2VnbWVudHMgPSBnZXRUYWlsU2VnbWVudHMob2xkUHJlZml4KTsKLSAgICBpZiAodGFpbFNlZ21lbnRzID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgLy8gSWYgdGhlIG5ldyBwcmVmaXggaGFzIHNlZ21lbnRzLCBpdCBpcyBub3QgdGhlIHJvb3QgYWJzb2x1dGUgcGF0aCwKLSAgICAvLyBhbmQgd2UgbmVlZCB0byBkcm9wIHRoZSB0cmFpbGluZyBlbXB0eSBzZWdtZW50IGFuZCBhcHBlbmQgdGhlIHRhaWwKLSAgICAvLyBzZWdtZW50cy4KLSAgICBTdHJpbmdbXSBtZXJnZWRTZWdtZW50cyA9IHRhaWxTZWdtZW50czsKLSAgICBpZiAobmV3UHJlZml4LnNlZ21lbnRDb3VudCgpICE9IDApCi0gICAgewotICAgICAgaW50IHNlZ21lbnRzVG9LZWVwID0gbmV3UHJlZml4LnNlZ21lbnRDb3VudCgpIC0gMTsKLSAgICAgIG1lcmdlZFNlZ21lbnRzID0gbmV3IFN0cmluZ1tzZWdtZW50c1RvS2VlcCArIHRhaWxTZWdtZW50cy5sZW5ndGhdOwotICAgICAgU3lzdGVtLmFycmF5Y29weShuZXdQcmVmaXguc2VnbWVudHMoKSwgMCwgbWVyZ2VkU2VnbWVudHMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzVG9LZWVwKTsKLQotICAgICAgaWYgKHRhaWxTZWdtZW50cy5sZW5ndGggIT0gMCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0YWlsU2VnbWVudHMsIDAsIG1lcmdlZFNlZ21lbnRzLCBzZWdtZW50c1RvS2VlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsU2VnbWVudHMubGVuZ3RoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBubyB2YWxpZGF0aW9uIG5lZWRlZCBzaW5jZSBhbGwgY29tcG9uZW50cyBhcmUgZnJvbSBleGlzdGluZyBVUklzCi0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgbmV3UHJlZml4LnNjaGVtZSgpLCBuZXdQcmVmaXguYXV0aG9yaXR5KCksCi0gICAgICAgICAgICAgICAgICAgbmV3UHJlZml4LmRldmljZSgpLCBuZXdQcmVmaXguaGFzQWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgbWVyZ2VkU2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvLyBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSByZWZlcmVuY2UgYW5kIHByZWZpeCBpcyBhIHByZWZpeCBvZiBpdCwKLSAgLy8gcmV0dXJucyB0aGUgcG9ydGlvbiBvZiB0aGUgcGF0aCByZW1haW5pbmcgYWZ0ZXIgdGhhdCBwcmVmaXggaGFzIGJlZW4KLSAgLy8gdHJpbW1lZDsgbnVsbCBvdGhlcndpc2UuCi0gIHByaXZhdGUgU3RyaW5nW10gZ2V0VGFpbFNlZ21lbnRzKFVSSSBwcmVmaXgpCi0gIHsKLSAgICBpZiAoIXByZWZpeC5pc1ByZWZpeCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vbi1wcmVmaXggdHJpbSIpOwotICAgIH0KLQotICAgIC8vIERvbid0IGV2ZW4gY29uc2lkZXIgaXQgdW5sZXNzIHRoaXMgaXMgaGllcmFyY2hpY2FsIGFuZCBoYXMgc2NoZW1lLAotICAgIC8vIGF1dGhvcml0eSwgZGV2aWNlIGFuZCBwYXRoIGFic29sdXRlbmVzcyBlcXVhbCB0byB0aG9zZSBvZiB0aGUgcHJlZml4LgotICAgIGlmICghaGllcmFyY2hpY2FsIHx8Ci0gICAgICAgICFlcXVhbHMoc2NoZW1lLCBwcmVmaXguc2NoZW1lKCksIHRydWUpIHx8Ci0gICAgICAgICFlcXVhbHMoYXV0aG9yaXR5LCBwcmVmaXguYXV0aG9yaXR5KCkpIHx8Ci0gICAgICAgICFlcXVhbHMoZGV2aWNlLCBwcmVmaXguZGV2aWNlKCkpIHx8Ci0gICAgICAgIGFic29sdXRlUGF0aCAhPSBwcmVmaXguaGFzQWJzb2x1dGVQYXRoKCkpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIHByZWZpeCBoYXMgbm8gc2VnbWVudHMsIHRoZW4gaXQgaXMgdGhlIHJvb3QgYWJzb2x1dGUgcGF0aCwgYW5kCi0gICAgLy8gd2Uga25vdyB0aGlzIGlzIGFuIGFic29sdXRlIHBhdGgsIHRvby4KLSAgICBpZiAocHJlZml4LnNlZ21lbnRDb3VudCgpID09IDApIHJldHVybiBzZWdtZW50czsKLQotICAgIC8vIFRoaXMgbXVzdCBoYXZlIG5vIGZld2VyIHNlZ21lbnRzIHRoYW4gdGhlIHByZWZpeC4gIFNpbmNlIHRoZSBwcmVmaXgKLSAgICAvLyBpcyBub3QgdGhlIHJvb3QgYWJzb2x1dGUgcGF0aCwgaXRzIGxhc3Qgc2VnbWVudCBpcyBlbXB0eTsgYWxsIG90aGVycwotICAgIC8vIG11c3QgbWF0Y2guCi0gICAgaW50IGkgPSAwOwotICAgIGludCBzZWdtZW50c1RvQ29tcGFyZSA9IHByZWZpeC5zZWdtZW50Q291bnQoKSAtIDE7Ci0gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA8PSBzZWdtZW50c1RvQ29tcGFyZSkgcmV0dXJuIG51bGw7Ci0KLSAgICBmb3IgKDsgaSA8IHNlZ21lbnRzVG9Db21wYXJlOyBpKyspCi0gICAgewotICAgICAgaWYgKCFzZWdtZW50c1tpXS5lcXVhbHMocHJlZml4LnNlZ21lbnQoaSkpKSByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBUaGUgcHJlZml4IHJlYWxseSBpcyBhIHByZWZpeCBvZiB0aGlzLiAgSWYgdGhpcyBoYXMganVzdCBvbmUgbW9yZSwKLSAgICAvLyBlbXB0eSBzZWdtZW50LCB0aGUgcGF0aHMgYXJlIHRoZSBzYW1lLgotICAgIGlmIChpID09IHNlZ21lbnRzLmxlbmd0aCAtIDEgJiYgU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudHNbaV0pKQotICAgIHsKLSAgICAgIHJldHVybiBOT19TRUdNRU5UUzsKLSAgICB9Ci0gICAgCi0gICAgLy8gT3RoZXJ3aXNlLCB0aGUgcGF0aCBuZWVkcyBvbmx5IHRoZSByZW1haW5pbmcgc2VnbWVudHMuCi0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBuZXcgU3RyaW5nW3NlZ21lbnRzLmxlbmd0aCAtIGldOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIGksIG5ld1NlZ21lbnRzLCAwLCBuZXdTZWdtZW50cy5sZW5ndGgpOwotICAgIHJldHVybiBuZXdTZWdtZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIGEgc3RyaW5nIHNvIGFzIHRvIHByb2R1Y2UgYSB2YWxpZCBvcGFxdWUgcGFydCB2YWx1ZSwgYXMgZGVmaW5lZAotICAgKiBieSB0aGUgUkZDLiAgQWxsIGV4Y2x1ZGVkIGNoYXJhY3RlcnMsIHN1Y2ggYXMgc3BhY2UgYW5kIDxjb2RlPiM8L2NvZGU+LAotICAgKiBhcmUgZXNjYXBlZCwgYXMgaXMgPGNvZGU+LzwvY29kZT4gaWYgaXQgaXMgdGhlIGZpcnN0IGNoYXJhY3Rlci4KLSAgICogCi0gICAqIEBwYXJhbSBpZ25vcmVFc2NhcGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGxlYXZlIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMKLSAgICogdW5lc2NhcGVkIGlmIHRoZXkgYWxyZWFkeSBiZWdpbiBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBlbmNvZGUgYWxsIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMuICBOb3RlIHRoYXQKLSAgICogaWYgYSA8Y29kZT4lPC9jb2RlPiBpcyBub3QgZm9sbG93ZWQgYnkgMiBoZXggZGlnaXRzLCBpdCB3aWxsIGFsd2F5cyBiZQotICAgKiBlc2NhcGVkLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZU9wYXF1ZVBhcnQoU3RyaW5nIHZhbHVlLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gZW5jb2RlKHZhbHVlLCBVUklDX0hJLCBVUklDX0xPLCBpZ25vcmVFc2NhcGVkKTsKLSAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCgpID4gMCAmJiByZXN1bHQuY2hhckF0KDApID09IFNFR01FTlRfU0VQQVJBVE9SID8KLSAgICAgICIlMkYiICsgcmVzdWx0LnN1YnN0cmluZygxKSA6Ci0gICAgICByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlcyBhIHN0cmluZyBzbyBhcyB0byBwcm9kdWNlIGEgdmFsaWQgYXV0aG9yaXR5LCBhcyBkZWZpbmVkIGJ5IHRoZQotICAgKiBSRkMuICBBbGwgZXhjbHVkZWQgY2hhcmFjdGVycywgc3VjaCBhcyBzcGFjZSBhbmQgPGNvZGU+IzwvY29kZT4sCi0gICAqIGFyZSBlc2NhcGVkLCBhcyBhcmUgPGNvZGU+LzwvY29kZT4gYW5kIDxjb2RlPj88L2NvZGU+Ci0gICAqIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVBdXRob3JpdHkoU3RyaW5nIHZhbHVlLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICByZXR1cm4gZW5jb2RlKHZhbHVlLCBTRUdNRU5UX0NIQVJfSEksIFNFR01FTlRfQ0hBUl9MTywgaWdub3JlRXNjYXBlZCk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlcyBhIHN0cmluZyBzbyBhcyB0byBwcm9kdWNlIGEgdmFsaWQgc2VnbWVudCwgYXMgZGVmaW5lZCBieSB0aGUKLSAgICogUkZDLiAgQWxsIGV4Y2x1ZGVkIGNoYXJhY3RlcnMsIHN1Y2ggYXMgc3BhY2UgYW5kIDxjb2RlPiM8L2NvZGU+LAotICAgKiBhcmUgZXNjYXBlZCwgYXMgYXJlIDxjb2RlPi88L2NvZGU+IGFuZCA8Y29kZT4/PC9jb2RlPgotICAgKiAKLSAgICogQHBhcmFtIGlnbm9yZUVzY2FwZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbGVhdmUgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycwotICAgKiB1bmVzY2FwZWQgaWYgdGhleSBhbHJlYWR5IGJlZ2luIGEgdmFsaWQgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGVuY29kZSBhbGwgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycy4gIE5vdGUgdGhhdAotICAgKiBpZiBhIDxjb2RlPiU8L2NvZGU+IGlzIG5vdCBmb2xsb3dlZCBieSAyIGhleCBkaWdpdHMsIGl0IHdpbGwgYWx3YXlzIGJlCi0gICAqIGVzY2FwZWQuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlU2VnbWVudChTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIHJldHVybiBlbmNvZGUodmFsdWUsIFNFR01FTlRfQ0hBUl9ISSwgU0VHTUVOVF9DSEFSX0xPLCBpZ25vcmVFc2NhcGVkKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIGEgc3RyaW5nIHNvIGFzIHRvIHByb2R1Y2UgYSB2YWxpZCBxdWVyeSwgYXMgZGVmaW5lZCBieSB0aGUgUkZDLgotICAgKiBPbmx5IGV4Y2x1ZGVkIGNoYXJhY3RlcnMsIHN1Y2ggYXMgc3BhY2UgYW5kIDxjb2RlPiM8L2NvZGU+LCBhcmUgZXNjYXBlZC4KLSAgICogCi0gICAqIEBwYXJhbSBpZ25vcmVFc2NhcGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGxlYXZlIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMKLSAgICogdW5lc2NhcGVkIGlmIHRoZXkgYWxyZWFkeSBiZWdpbiBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBlbmNvZGUgYWxsIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMuICBOb3RlIHRoYXQKLSAgICogaWYgYSA8Y29kZT4lPC9jb2RlPiBpcyBub3QgZm9sbG93ZWQgYnkgMiBoZXggZGlnaXRzLCBpdCB3aWxsIGFsd2F5cyBiZQotICAgKiBlc2NhcGVkLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZVF1ZXJ5KFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgcmV0dXJuIGVuY29kZSh2YWx1ZSwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlcyBhIHN0cmluZyBzbyBhcyB0byBwcm9kdWNlIGEgdmFsaWQgZnJhZ21lbnQsIGFzIGRlZmluZWQgYnkgdGhlCi0gICAqIFJGQy4gIE9ubHkgZXhjbHVkZWQgY2hhcmFjdGVycywgc3VjaCBhcyBzcGFjZSBhbmQgPGNvZGU+IzwvY29kZT4sIGFyZQotICAgKiBlc2NhcGVkLgotICAgKiAKLSAgICogQHBhcmFtIGlnbm9yZUVzY2FwZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbGVhdmUgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycwotICAgKiB1bmVzY2FwZWQgaWYgdGhleSBhbHJlYWR5IGJlZ2luIGEgdmFsaWQgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGVuY29kZSBhbGwgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycy4gIE5vdGUgdGhhdAotICAgKiBpZiBhIDxjb2RlPiU8L2NvZGU+IGlzIG5vdCBmb2xsb3dlZCBieSAyIGhleCBkaWdpdHMsIGl0IHdpbGwgYWx3YXlzIGJlCi0gICAqIGVzY2FwZWQuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlRnJhZ21lbnQoU3RyaW5nIHZhbHVlLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICByZXR1cm4gZW5jb2RlKHZhbHVlLCBVUklDX0hJLCBVUklDX0xPLCBpZ25vcmVFc2NhcGVkKTsKLSAgfQotCi0gIC8vIEVuY29kZXMgYSBjb21wbGV0ZSBVUkksIG9wdGlvbmFsbHkgbGVhdmluZyAlIGNoYXJhY3RlcnMgdW5lc2NhcGVkIHdoZW4KLSAgLy8gYmVnaW5uaW5nIGEgdmFsaWQgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZS4gIFdlIGFzc3VtZSB0aGF0IHRoZQotICAvLyBsYXN0ICMgYmVnaW5zIHRoZSBmcmFnbWVudC4KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZVVSSShTdHJpbmcgdXJpLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICBpZiAodXJpID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIGludCBpID0gdXJpLmluZGV4T2YoU0NIRU1FX1NFUEFSQVRPUik7Ci0gICAgaWYgKGkgIT0gLTEpCi0gICAgewotICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5zdWJzdHJpbmcoMCwgaSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNjaGVtZSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKFNDSEVNRV9TRVBBUkFUT1IpOwotICAgIH0KLSAgICAKLSAgICBpbnQgaiA9IHVyaS5sYXN0SW5kZXhPZihGUkFHTUVOVF9TRVBBUkFUT1IpOwotICAgIGlmIChqICE9IC0xKQotICAgIHsKLSAgICAgIFN0cmluZyBzc3BhcnQgPSB1cmkuc3Vic3RyaW5nKCsraSwgaik7Ci0gICAgICByZXN1bHQuYXBwZW5kKGVuY29kZShzc3BhcnQsIFVSSUNfSEksIFVSSUNfTE8sIGlnbm9yZUVzY2FwZWQpKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoRlJBR01FTlRfU0VQQVJBVE9SKTsKLQotICAgICAgU3RyaW5nIGZyYWdtZW50ID0gdXJpLnN1YnN0cmluZygrK2opOwotICAgICAgcmVzdWx0LmFwcGVuZChlbmNvZGUoZnJhZ21lbnQsIFVSSUNfSEksIFVSSUNfTE8sIGlnbm9yZUVzY2FwZWQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBzc3BhcnQgPSB1cmkuc3Vic3RyaW5nKCsraSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKGVuY29kZShzc3BhcnQsIFVSSUNfSEksIFVSSUNfTE8sIGlnbm9yZUVzY2FwZWQpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8gRW5jb2RlcyB0aGUgZ2l2ZW4gc3RyaW5nLCByZXBsYWNpbmcgZWFjaCBBU0NJSSBjaGFyYWN0ZXIgdGhhdCBpcyBub3QgaW4KLSAgLy8gdGhlIHNldCBzcGVjaWZpZWQgYnkgdGhlIDEyOC1iaXQgYml0bWFzayBhbmQgZWFjaCBub24tQVNDSUkgY2hhcmFjdGVyCi0gIC8vIGJlbG93IDB4QTAgYnkgYW4gZXNjYXBlIHNlcXVlbmNlIG9mICUgZm9sbG93ZWQgYnkgdHdvIGhleCBkaWdpdHMuICBJZgotICAvLyAlIGlzIG5vdCBpbiB0aGUgc2V0IGJ1dCBpZ25vcmVFc2NhcGVkIGlzIHRydWUsIHRoZW4gJSB3aWxsIG5vdCBiZSBlbmNvZGVkCi0gIC8vIGlmZiBpdCBhbHJlYWR5IGJlZ2lucyBhIHZhbGlkIGVzY2FwZSBzZXF1ZW5jZS4KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgdmFsdWUsIGxvbmcgaGlnaEJpdG1hc2ssIGxvbmcgbG93Qml0bWFzaywgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7Ci0KLSAgICAgIGlmICghbWF0Y2hlcyhjLCBoaWdoQml0bWFzaywgbG93Qml0bWFzaykgJiYgYyA8IDE2MCAmJgotICAgICAgICAgICghaWdub3JlRXNjYXBlZCB8fCAhaXNFc2NhcGVkKHZhbHVlLCBpKSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUuc3Vic3RyaW5nKDAsIGkpKTsKLSAgICAgICAgfQotICAgICAgICBhcHBlbmRFc2NhcGVkKHJlc3VsdCwgKGJ5dGUpYyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gdmFsdWUgOiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vIFRlc3RzIHdoZXRoZXIgYW4gZXNjYXBlIG9jY3VycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nLCBzdGFydGluZyBhdCBpbmRleCBpLgotICAvLyBBbiBlc2NhcGUgc2VxdWVuY2UgaXMgYSAlIGZvbGxvd2VkIGJ5IHR3byBoZXggZGlnaXRzLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXNjYXBlZChTdHJpbmcgcywgaW50IGkpCi0gIHsKLSAgICByZXR1cm4gcy5jaGFyQXQoaSkgPT0gRVNDQVBFICYmIHMubGVuZ3RoKCkgPiBpICsgMiAmJgotICAgICAgbWF0Y2hlcyhzLmNoYXJBdChpICsgMSksIEhFWF9ISSwgSEVYX0xPKSAmJgotICAgICAgbWF0Y2hlcyhzLmNoYXJBdChpICsgMiksIEhFWF9ISSwgSEVYX0xPKTsKLSAgfQotCi0gIC8vIENvbXB1dGVzIGEgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZSBmb3IgdGhlIGJ5dGUsIGFwcGVuZGluZwotICAvLyBpdCB0byB0aGUgU3RyaW5nQnVmZmVyLiAgT25seSBjaGFyYWN0ZXJzIHVwIHRvIDB4RkYgc2hvdWxkIGJlIGVzY2FwZWQ7Ci0gIC8vIGFsbCBidXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgd2lsbCBiZSBpZ25vcmVkLgotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZEVzY2FwZWQoU3RyaW5nQnVmZmVyIHJlc3VsdCwgYnl0ZSBiKQotICB7Ci0gICAgcmVzdWx0LmFwcGVuZChFU0NBUEUpOwotCi0gICAgLy8gVGhlIGJ5dGUgaXMgYXV0b21hdGljYWxseSB3aWRlbmVkIGludG8gYW4gaW50LCB3aXRoIHNpZ24gZXh0ZW5zaW9uLAotICAgIC8vIGZvciBzaGlmdGluZy4gIFRoaXMgY2FuIGludHJvZHVjZSAxJ3MgdG8gdGhlIGxlZnQgb2YgdGhlIGJ5dGUsIHdoaWNoCi0gICAgLy8gbXVzdCBiZSBjbGVhcmVkIGJ5IG1hc2tpbmcgYmVmb3JlIGxvb2tpbmcgdXAgdGhlIGhleCBkaWdpdC4KLSAgICAvLwotICAgIHJlc3VsdC5hcHBlbmQoSEVYX0RJR0lUU1soYiA+PiA0KSAmIDB4MEZdKTsKLSAgICByZXN1bHQuYXBwZW5kKEhFWF9ESUdJVFNbYiAmIDB4MEZdKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWNvZGVzIHRoZSBnaXZlbiBzdHJpbmcsIHJlcGxhY2luZyBlYWNoIHRocmVlLWRpZ2l0IGVzY2FwZSBzZXF1ZW5jZSBieQotICAgKiB0aGUgY2hhcmFjdGVyIHRoYXQgaXQgcmVwcmVzZW50cy4gIEluY29tcGxldGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUKLSAgICogaWdub3JlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbnVsbDsKLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpc0VzY2FwZWQodmFsdWUsIGkpKSAKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodW5lc2NhcGUodmFsdWUuY2hhckF0KGkgKyAxKSwgdmFsdWUuY2hhckF0KGkgKyAyKSkpOwotICAgICAgICBpICs9IDI7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh2YWx1ZS5jaGFyQXQoaSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyB2YWx1ZSA6IHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgY2hhcmFjdGVyIGVuY29kZWQgYnkgJSBmb2xsb3dlZCBieSB0aGUgdHdvIGdpdmVuIGhleCBkaWdpdHMsCi0gIC8vIHdoaWNoIGlzIGFsd2F5cyAweEZGIG9yIGxlc3MsIHNvIGNhbiBzYWZlbHkgYmUgY2FzdGVkIHRvIGEgYnl0ZS4gIElmCi0gIC8vIGVpdGhlciBjaGFyYWN0ZXIgaXMgbm90IGEgaGV4IGRpZ2l0LCBhIGJvZ3VzIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLgotICBwcml2YXRlIHN0YXRpYyBjaGFyIHVuZXNjYXBlKGNoYXIgaGlnaEhleERpZ2l0LCBjaGFyIGxvd0hleERpZ2l0KQotICB7Ci0gICAgcmV0dXJuIChjaGFyKSgodmFsdWVPZihoaWdoSGV4RGlnaXQpIDw8IDQpIHwgdmFsdWVPZihsb3dIZXhEaWdpdCkpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgaW50IHZhbHVlIG9mIHRoZSBnaXZlbiBoZXggZGlnaXQuCi0gIHByaXZhdGUgc3RhdGljIGludCB2YWx1ZU9mKGNoYXIgaGV4RGlnaXQpCi0gIHsKLSAgICBpZiAoaGV4RGlnaXQgPj0gJ0EnICYmIGhleERpZ2l0IDw9ICdGJykKLSAgICB7Ci0gICAgICByZXR1cm4gaGV4RGlnaXQgLSAnQScgKyAxMDsKLSAgICB9Ci0gICAgaWYgKGhleERpZ2l0ID49ICdhJyAmJiBoZXhEaWdpdCA8PSAnZicpCi0gICAgewotICAgICAgcmV0dXJuIGhleERpZ2l0IC0gJ2EnICsgMTA7Ci0gICAgfQotICAgIGlmIChoZXhEaWdpdCA+PSAnMCcgJiYgaGV4RGlnaXQgPD0gJzknKQotICAgIHsKLSAgICAgIHJldHVybiBoZXhEaWdpdCAtICcwJzsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHRha2VzIHR3byBVUklzLCB0aGUgZmlyc3Qgb25lIHJlbGF0aXZlLCB0aGUgc2Vjb25kIGFic29sdXRlLiBJdAotICAgKiB0cmllcyB0byByZXNvbHZlIHRoZSBmaXJzdCBVUkkgKG1ha2luZyBpdCBhYnNvbHV0ZSkgYnkgdXNpbmcgdGhlIHNlY29uZCBvbmUuCi0gICAqIElmIHRoZSBVUkkgY2Fubm90IGJlIHJlc29sdmVkLCB0aGUgcmVsYXRpdmUgb25lIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCi0gICAqIAotICAgKiBAcGFyYW0gcmVsYXRpdmVVUkkKLSAgICogQHBhcmFtIGFic29sdXRlVVJJCi0gICAqIEByZXR1cm4gcmVsYXRpdmVVUkkgcmVzb2x2ZWQgKGFic29sdXRlKSBvciByZWxhdGl2ZVVSSSB1bm1vZGlmaWVkIGlmIGl0IGNhbm5vdAotICAgKiBiZSByZXNvbHZlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVSZWxhdGl2ZVVSSShTdHJpbmcgcmVsYXRpdmVVUkksIFN0cmluZyBhYnNvbHV0ZVVSSSkgewotCi0JICBTdHJpbmcgcmVzdWx0ID0gcmVsYXRpdmVVUkk7Ci0KLQkgIHRyeSB7Ci0gICAgICAJVVJJIHJlbGF0aXZlID0gVVJJLmNyZWF0ZVVSSShyZWxhdGl2ZVVSSSk7Ci0gICAgICAgCVVSSSBhYnNvbHV0ZSA9IFVSSS5jcmVhdGVVUkkoYWJzb2x1dGVVUkkpOwotICAgICAgIAlVUkkgcmVzb2x2ZWRSZWxhdGl2ZSA9IHJlbGF0aXZlLnJlc29sdmUoYWJzb2x1dGUpOwotICAgICAgIAlyZXN1bHQgPSByZXNvbHZlZFJlbGF0aXZlLnRvU3RyaW5nKCk7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIAotICAvKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgVVJJIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiBUaGlzIHVudXNlZCBjb2RlIGlzIGluY2x1ZGVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlLi4uIAotICAgKi8KLS8qCi0gIHB1YmxpYyBib29sZWFuIGlzSVJJKCkKLSAgewotICAgIHJldHVybiBpcmk7IAotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgY29udGFpbnMgYW55IG5vbi1BU0NJSSBjaGFyYWN0ZXJzOwotICAvLyBmYWxzZSBvdGhlcndpc2UuCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNOb25BU0NJSShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAodmFsdWUuY2hhckF0KGkpID4gMTI3KSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0qLwotCi0gIC8qCi0gICAqIElmIHRoaXMgaXMgYW4ge0BsaW5rICNpc0lSSSBJUkl9LCBjb252ZXJ0cyBpdCB0byBhIHN0cmljdCBBU0NJSSBVUkksCi0gICAqIHVzaW5nIHRoZSBwcm9jZWR1cmUgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4xIG9mIHRoZQotICAgKiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9JbnRlcm5hdGlvbmFsL2lyaS1lZGl0L2RyYWZ0LWR1ZXJzdC1pcmktMDkudHh0Ij5JUkkKLSAgICogRHJhZnQgUkZDPC9hPi4gIE90aGVyd2lzZSwgdGhpcyBVUkksIGl0c2VsZiwgaXMgcmV0dXJuZWQuCi0gICAqCi0gICAqIFRoaXMgdW51c2VkIGNvZGUgaXMgaW5jbHVkZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UuLi4KLSAgICovCi0vKgotICBwdWJsaWMgVVJJIHRvQVNDSUlVUkkoKQotICB7Ci0gICAgaWYgKCFpcmkpIHJldHVybiB0aGlzOwotCi0gICAgaWYgKGNhY2hlZEFTQ0lJVVJJID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGVBdXRob3JpdHkgPSBlbmNvZGVBc0FTQ0lJKGF1dGhvcml0eSk7Ci0gICAgICBTdHJpbmcgZURldmljZSA9IGVuY29kZUFzQVNDSUkoZGV2aWNlKTsKLSAgICAgIFN0cmluZyBlUXVlcnkgPSBlbmNvZGVBc0FTQ0lJKHF1ZXJ5KTsKLSAgICAgIFN0cmluZyBlRnJhZ21lbnQgPSBlbmNvZGVBc0FTQ0lJKGZyYWdtZW50KTsKLSAgICAgIFN0cmluZ1tdIGVTZWdtZW50cyA9IG5ldyBTdHJpbmdbc2VnbWVudHMubGVuZ3RoXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGVTZWdtZW50c1tpXSA9IGVuY29kZUFzQVNDSUkoc2VnbWVudHNbaV0pOwotICAgICAgfQotICAgICAgY2FjaGVkQVNDSUlVUkkgPSBuZXcgVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBlQXV0aG9yaXR5LCBlRGV2aWNlLCBhYnNvbHV0ZVBhdGgsIGVTZWdtZW50cywgZVF1ZXJ5LCBlRnJhZ21lbnQpOyAKLQotICAgIH0KLSAgICByZXR1cm4gY2FjaGVkQVNDSUlVUkk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIGEgc3RyaWN0IEFTQ0lJIGVuY29kaW5nIG9mIHRoZSBnaXZlbiB2YWx1ZS4gIEVhY2ggbm9uLUFTQ0lJCi0gIC8vIGNoYXJhY3RlciBpcyBjb252ZXJ0ZWQgdG8gYnl0ZXMgdXNpbmcgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGFyZSB0aGVuCi0gIC8vIHJlcHJlc250ZWQgdXNpbmcgJSBlc2NhcGluZy4KLSAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlQXNBU0NJSShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbnVsbDsKLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKLQotICAgICAgaWYgKGMgPj0gMTI4KQotICAgICAgewotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLnN1YnN0cmluZygwLCBpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGJ5dGVbXSBlbmNvZGVkID0gKG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7IGMgfSkpLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgICAgIGZvciAoaW50IGogPSAwLCBlbmNMZW4gPSBlbmNvZGVkLmxlbmd0aDsgaiA8IGVuY0xlbjsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFwcGVuZEVzY2FwZWQocmVzdWx0LCBlbmNvZGVkW2pdKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyB2YWx1ZSA6IHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhbGlkLCBjb25zZWN1dGl2ZSwgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZQotICAvLyBzZXF1ZW5jZXMgaW4gdGhlIGdpdmVuIHN0cmluZywgc3RhcnRpbmcgYXQgaW5kZXggaS4KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50RXNjYXBlZChTdHJpbmcgcywgaW50IGkpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLQotICAgIGZvciAoaW50IGxlbiA9IHMubGVuZ3RoKCk7IGkgPCBsZW47IGkgKz0gMykKLSAgICB7Ci0gICAgICBpZiAoaXNFc2NhcGVkKHMsIGkpKSByZXN1bHQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotKi8KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3ZmEzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEEgVVJJIHJlc29sdmVyIGV4dGVuc2lvbiBkZXNjcmlwdG9yIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQKLSAqIGFuIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuIFRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgYWxsb3dzIGZvciB0aGUKLSAqIGV4dGVuc2lvbiByZXNvbHZlciB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIGNhbGxlZCBhdCB0aGUgY29ycmVjdCB0aW1lcy4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvcgotewotCXByb3RlY3RlZCBVUklSZXNvbHZlckV4dGVuc2lvbiByZXNvbHZlcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgZmlsZVR5cGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsKLQotCXB1YmxpYyBMaXN0IHByb2plY3ROYXR1cmVJZHM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVHlwZTsKLQotCXByb3RlY3RlZCBpbnQgc3RhZ2UgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlNUQUdFX1BPU1ROT1JNQUxJWkFUSU9OOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmlvcml0eSA9IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuUFJJT1JJVFlfTUVESVVNOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwbHVnaW5JZDsKLQotCXByb3RlY3RlZCBib29sZWFuIGVycm9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlciBjbGFzcyBuYW1lLgotCSAqIEBwYXJhbSBwbHVnaW5JZCBUaGUgSUQgb2YgdGhlIHBsdWdpbiB0aGF0IGNvbnRhaW5zIHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyIGNsYXNzLgotCSAqIEBwYXJhbSBwcm9qZWN0TmF0dXJlSWRzIFRoZSBwcm9qZWN0IG5hdHVyZSBJRHMgZm9yIHdoaWNoIHRoZSByZXNvbHZlciBzaG91bGQgcnVuLgotCSAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHR5cGUgb2YgcmVzb3VyY2UgZm9yIHdoaWNoIHRoZSByZXNvbHZlciBzaG91bGQgcnVuLgotCSAqIEBwYXJhbSBzdGFnZSBUaGUgc3RhZ2Ugb2YgdGhlIHJlc29sdmVyLiBFaXRoZXIgcHJlbm9ybWFsaXphdGlvbiBvciBwb3N0bm9ybWFsaXphdGlvbi4KLQkgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIHJlc29sdmVyJ3MgcHJpb3JpdHkuIGhpZ2gsIG1lZGl1bSwgb3IgbG93LgotCSAqLwotCXB1YmxpYyBVUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHBsdWdpbklkLAotCQkJTGlzdCBwcm9qZWN0TmF0dXJlSWRzLCBTdHJpbmcgcmVzb3VyY2VUeXBlLCBpbnQgc3RhZ2UsIFN0cmluZyBwcmlvcml0eSkKLQl7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JCXRoaXMucHJvamVjdE5hdHVyZUlkcyA9IHByb2plY3ROYXR1cmVJZHM7Ci0JCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOwotCQl0aGlzLnN0YWdlID0gc3RhZ2U7Ci0JCXRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuCi0JICogCi0JICogQHJldHVybiBUaGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLQkgKi8KLQlwdWJsaWMgVVJJUmVzb2x2ZXJFeHRlbnNpb24gZ2V0UmVzb2x2ZXIoKQotCXsKLQotCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCAmJiBjbGFzc05hbWUgIT0gbnVsbCAmJiAhZXJyb3IpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCS8vIENsYXNzIHRoZUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/Ci0JCQkJLy8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJQ2xhc3MgdGhlQ2xhc3MgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXJFeHRlbnNpb24pIHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQllcnJvciA9IHRydWU7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgcmVzb2x2ZXIgc2hvdWxkIHJ1biBpbiB0aGUgY3VycmVudCBzY2VuYXJpbyBnaXZlbgotCSAqIHRoZSBwcm9qZWN0IG5hdHVyZSBJRCwgcmVzb3VyY2UgdHlwZSwgYW5kIHN0YWdlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0TmF0dXJlSWQgVGhlIHByb2plY3QgbmF0dXJlIElEIHRvIGNoZWNrIGFnYWluc3QuCi0JICogQHBhcmFtIHJlc291cmNlVHlwZSBUaGUgcmVzb3VyY2UgdHlwZSB0byBjaGVjayBhZ2FpbnN0LgotCSAqIEBwYXJhbSBzdGFnZSBUaGUgc3RhZ2UgdG8gY2hlY2sgYWdhaW5zdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlc29sdmVyIHNob3VsZCBydW4sIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBwcm9qZWN0TmF0dXJlSWQsIFN0cmluZyByZXNvdXJjZVR5cGUsIGludCBzdGFnZSkKLQl7Ci0JCWlmIChwcm9qZWN0TmF0dXJlSWRzLmNvbnRhaW5zKHByb2plY3ROYXR1cmVJZCkpCi0JCXsKLQkJCXJldHVybiBtYXRjaGVzKHRoaXMucmVzb3VyY2VUeXBlLCByZXNvdXJjZVR5cGUpICYmIHRoaXMuc3RhZ2UgPT0gc3RhZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgc3RyaW5nIGEgbWF0Y2hlcyBzdHJpbmcgYi4KLQkgKiBUT0RPOiBXaHkgaXMgdGhpcyByZXF1aXJlZCBpbnN0ZWFkIG9mIGp1c3QgdXNpbmcgU3RyaW5nLmVxdWFscz8KLQkgKiAKLQkgKiBAcGFyYW0gYSBTdHJpbmcgZm9yIGNvbXBhcmlzb24uCi0JICogQHBhcmFtIGIgU3RyaW5nIGZvciBjb21wYXJpc29uLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5ncyBtYXRjaCwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhLCBTdHJpbmcgYikKLQl7Ci0JCXJldHVybiAoYSAhPSBudWxsKSA/IGEuZXF1YWxzKGIpIDogYSA9PSBiOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAzMDcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgVVJJIHJlc29sdmVyIGV4dGVuc2lvbiByZWdpc3RyeSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAotICogYWxsIG9mIHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVycy4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkKLXsKLQlwcm90ZWN0ZWQgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBR0VfUFJFTk9STUFMSVpBVElPTiA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFHRV9QT1NUTk9STUFMSVpBVElPTiA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFHRV9QSFlTSUNBTCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9MT1cgPSAibG93IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX01FRElVTSA9ICJtZWRpdW0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfSElHSCA9ICJoaWdoIjsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTExfUFJPSkVDVF9OQVRVUkVfSUQgPSAiIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSBpbnN0YW5jZTsKLQotCXByaXZhdGUgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSgpCi0JewotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0SW50YW5jZSgpCi0JewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJewotCQkJaW5zdGFuY2UgPSBuZXcgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJbmV3IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoaW5zdGFuY2UpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW4gZXh0ZW5zaW9uIHJlc29sdmVyIHRvIHRoZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyIGNsYXNzLgotCSAqIEBwYXJhbSBwbHVnaW5JZCBUaGUgSUQgb2YgdGhlIHBsdWdpbiB0aGF0IGNvbnRhaW5zIHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyIGNsYXNzLgotCSAqIEBwYXJhbSBwcm9qZWN0TmF0dXJlSWRzIEEgbGlzdCBvZiBwcm9qZWN0IG5hdHVyZXMgSURzIGZvciB3aGljaCB0aGUgcmVzb2x2ZXIgc2hvdWxkIHJ1bi4KLQkgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSB0eXBlIG9mIHJlc291cmUgZm9yIHdoaWNoIGFuIGV4dGVuc2lvbiByZXNvdXJjZSBzaG91bGQgcnVuLgotCSAqIEBwYXJhbSBzdGFnZSBUaGUgc3RhZ2UgdG8gcnVuLiBFaXRoZXIgcHJlbm9ybWFsaXphdGlvbiBvciBwb3N0bm9ybWFsaXphdGlvbi4KLQkgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IG9mIHRoZSByZXNvbHZlci4gVmFsaWQgdmFsdWVzIGFyZSBoaWdoLCBtZWRpdW0sIGFuZCBsb3cuCi0JICovCi0JcHVibGljIHZvaWQgcHV0KFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBwbHVnaW5JZCwgTGlzdCBwcm9qZWN0TmF0dXJlSWRzLAotCQkJU3RyaW5nIHJlc291cmNlVHlwZSwgaW50IHN0YWdlLCBTdHJpbmcgcHJpb3JpdHkpCi0JewotCQlpZiAocHJvamVjdE5hdHVyZUlkcyA9PSBudWxsKQotCQkJcHJvamVjdE5hdHVyZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByb2plY3ROYXR1cmVJZHMuaXNFbXB0eSgpKQotCQl7Ci0JCQlwcm9qZWN0TmF0dXJlSWRzLmFkZChOVUxMX1BST0pFQ1RfTkFUVVJFX0lEKTsKLQkJfQotCQlVUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IgaW5mbyA9IG5ldyBVUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IoCi0JCQkJY2xhc3NOYW1lLCBwbHVnaW5JZCwgcHJvamVjdE5hdHVyZUlkcywgcmVzb3VyY2VUeXBlLCBzdGFnZSwgcHJpb3JpdHkpOwotCi0JCUl0ZXJhdG9yIGlkc0l0ZXIgPSBwcm9qZWN0TmF0dXJlSWRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpZHNJdGVyLmhhc05leHQoKSkKLQkJewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGlkc0l0ZXIubmV4dCgpOwotCi0JCQlIYXNoTWFwIHByaW9yaXR5TWFwID0gKEhhc2hNYXApIG1hcC5nZXQoa2V5KTsKLQkJCWlmIChwcmlvcml0eU1hcCA9PSBudWxsKQotCQkJewotCQkJCXByaW9yaXR5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQltYXAucHV0KGtleSwgcHJpb3JpdHlNYXApOwotCQkJCXByaW9yaXR5TWFwLnB1dChQUklPUklUWV9ISUdILCBuZXcgQXJyYXlMaXN0KCkpOwotCQkJCXByaW9yaXR5TWFwLnB1dChQUklPUklUWV9NRURJVU0sIG5ldyBBcnJheUxpc3QoKSk7Ci0JCQkJcHJpb3JpdHlNYXAucHV0KFBSSU9SSVRZX0xPVywgbmV3IEFycmF5TGlzdCgpKTsKLQkJCX0KLQkJCUxpc3QgbGlzdCA9IChMaXN0KSBwcmlvcml0eU1hcC5nZXQocHJpb3JpdHkpOwotCQkJbGlzdC5hZGQoaW5mbyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIFVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvciBvYmplY3RzIHRoYXQgYXBwbHkgdG8gdGhpcwotCSAqIHByb2plY3QuIFRoZSBsaXN0IGlzIGluIHRoZSBwcmlvcml0eSBvcmRlciBoaWdoLCBtZWRpdW0sIGxvdy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCBmb3Igd2hpY2ggeW91IGFyZSByZXF1ZXN0aW5nIHJlc29sdmVycy4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBVUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3Igb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25EZXNjcmlwdG9ycyhJUHJvamVjdCBwcm9qZWN0KQotCXsKLQkgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCSAgTGlzdCBsb3dQcmlvcml0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICBMaXN0IG1lZGl1bVByaW9yaXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIExpc3QgaGlnaFByaW9yaXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAgCi0JICBmb3IgKEl0ZXJhdG9yIGkgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCSAgewotCSAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgaWYgKGtleSA9PSBOVUxMX1BST0pFQ1RfTkFUVVJFX0lEIHx8IHByb2plY3QgPT0gbnVsbCB8fCBwcm9qZWN0Lmhhc05hdHVyZShrZXkpKQotCSAgICAgIHsKLQkgICAgICAgIGhpZ2hQcmlvcml0eUxpc3QuYWRkQWxsKChMaXN0KSAoKEhhc2hNYXApIG1hcC5nZXQoa2V5KSkuZ2V0KFBSSU9SSVRZX0hJR0gpKTsKLQkgICAgICAgIG1lZGl1bVByaW9yaXR5TGlzdC5hZGRBbGwoKExpc3QpICgoSGFzaE1hcCkgbWFwLmdldChrZXkpKS5nZXQoUFJJT1JJVFlfTUVESVVNKSk7Ci0JICAgICAgICBsb3dQcmlvcml0eUxpc3QuYWRkQWxsKChMaXN0KSAoKEhhc2hNYXApIG1hcC5nZXQoa2V5KSkuZ2V0KFBSSU9SSVRZX0xPVykpOwotCSAgICAgIH0KLQkgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCSAgICB7Ci0JICAgIH0KLQkgIH0KLQkgIHJlc3VsdC5hZGRBbGwoaGlnaFByaW9yaXR5TGlzdCk7Ci0JICByZXN1bHQuYWRkQWxsKG1lZGl1bVByaW9yaXR5TGlzdCk7Ci0JICByZXN1bHQuYWRkQWxsKGxvd1ByaW9yaXR5TGlzdCk7Ci0JICByZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgVVJJUmVzb2x2ZXIgb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBzdGFnZS4KLQkgKiBUT0RPOiBUaGlzIHNlZW1zIGxpa2UgYW4gb2RkIG1ldGhvZCB0byBob3VzZSBoZXJlLiBJdCBtYXkgbmVlZCB0byBiZSBtb3ZlZAotCSAqICAgICAgIG9yIHJlbW92ZWQgaWYgdGhlIHN0YWdlIGF0dHJpYnV0ZSBkaXNzYXBlYXJzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvbHZlckluZm9MaXN0IEEgbGlzdCBvZiByZXNvbHZlcnMgdG8gcHJ1bmUuCi0JICogQHBhcmFtIHN0YWdlIFRoZSBzdGFnZSByZXF1ZXN0ZWQuCi0JICogQHJldHVybiBBIGxpc3Qgb2YgVVJJUmVzb2x2ZXIgb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBzdGFnZS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNYXRjaGluZ1VSSVJlc29sdmVycyhMaXN0IHJlc29sdmVySW5mb0xpc3QsIGludCBzdGFnZSkKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlckluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yIGluZm8gPSAoVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yKSBpCi0JCQkJCS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5zdGFnZSA9PSBzdGFnZSkKLQkJCXsKLQkJCQlPYmplY3QgcmVzb2x2ZXIgPSBpbmZvLmdldFJlc29sdmVyKCk7Ci0JCQkJaWYgKHJlc29sdmVyICE9IG51bGwpCi0JCQkJewotCQkJCQlyZXN1bHQuYWRkKHJlc29sdmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3M2YyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBVUkkgcmVzb2x2ZXIgZXh0ZW5zaW9uIHBvaW50IGFuZCByZWdpc3RlcnMgZXh0ZW5zaW9uCi0gKiByZXNvbHZlcnMgd2l0aCB0aGUgVVJJIHJlc29sdmVyIHJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlcgotewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInJlc29sdmVyRXh0ZW5zaW9ucyI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJyZXNvbHZlckV4dGVuc2lvbiI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9QUk9KRUNUX05BVFVSRV9JRCA9ICJwcm9qZWN0TmF0dXJlIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9SRVNPVVJDRV9UWVBFID0gInJlc291cmNlVHlwZSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1NUQUdFID0gInN0YWdlIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTF9TVEFHRV9QUkUgPSAicHJlbm9ybWFsaXphdGlvbiI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxfU1RBR0VfUE9TVCA9ICJwb3N0bm9ybWFsaXphdGlvbiI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxfU1RBR0VfUEhZU0lDQUwgPSAicGh5c2ljYWwiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1ZBTFVFID0gInZhbHVlIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QUklPUklUWSA9ICJwcmlvcml0eSI7Ci0KLQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeTsKLQotCXB1YmxpYyBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpCi0JewotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLQl7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFVSSVJlc29sdmVyUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKQotCQl7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgd2l0aCBhbiBleHRlbnNpb24gbGlrZToKLQkgKiAKLQkgKiA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29udGVudG1vZGVsLnV0aWxfaW1wbGVtZW50YXRpb24iPgotCSAqIDx1dGlsX2ltcGxlbWVudGF0aW9uIGNsYXNzID0KLQkgKiBvcmcuZWNsaXBzZS53c3QuYmFzZXV0aWwuQ01VdGlsSW1wbGVtZW50YXRpb25JbXBsIC8+IDwvZXh0ZW5zaW9uPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpCi0JCXsKLQkJCS8vIFN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJCS8vIFN0cmluZyBwcm9qZWN0TmF0dXJlSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJPSkVDVF9OQVRVUkVfSUQpOwotCQkJU3RyaW5nIHJlc291cmNlVHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9SRVNPVVJDRV9UWVBFKTsKLQkJCVN0cmluZyBzdGFnZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TVEFHRSk7Ci0JCQlTdHJpbmcgcHJpb3JpdHkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJJT1JJVFkpOwotCQkJaWYgKHByaW9yaXR5ID09IG51bGwgfHwgcHJpb3JpdHkuZXF1YWxzKCIiKSkKLQkJCXsKLQkJCQlwcmlvcml0eSA9IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuUFJJT1JJVFlfTUVESVVNOwotCQkJfQotCQkJTGlzdCBwcm9qZWN0TmF0dXJlSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaWRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFTEVNX1BST0pFQ1RfTkFUVVJFX0lEKTsKLQkJCWludCBudW1pZHMgPSBpZHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1pZHM7IGkrKykKLQkJCXsKLQkJCQlTdHJpbmcgdGVtcGlkID0gaWRzW2ldLmdldEF0dHJpYnV0ZShBVFRfVkFMVUUpOwotCi0JCQkJaWYgKHRlbXBpZCAhPSBudWxsKQotCQkJCXsKLQkJCQkJcHJvamVjdE5hdHVyZUlkcy5hZGQodGVtcGlkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQotCQkJCQlpbnQgc3RhZ2VpbnQgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlNUQUdFX1BPU1ROT1JNQUxJWkFUSU9OOwotCQkJCQlpZiAoc3RhZ2UuZXF1YWxzSWdub3JlQ2FzZShWQUxfU1RBR0VfUFJFKSkKLQkJCQkJewotCQkJCQkJc3RhZ2VpbnQgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlNUQUdFX1BSRU5PUk1BTElaQVRJT047Ci0JCQkJCX0gZWxzZSBpZiAoc3RhZ2UuZXF1YWxzSWdub3JlQ2FzZShWQUxfU1RBR0VfUEhZU0lDQUwpKQotCQkJCQl7Ci0JCQkJCQlzdGFnZWludCA9IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUEhZU0lDQUw7Ci0JCQkJCX0KLQkJCQkJcmVnaXN0cnkucHV0KGNsYXNzTmFtZSwgcGx1Z2luSWQsIHByb2plY3ROYXR1cmVJZHMsIHJlc291cmNlVHlwZSwKLQkJCQkJCQlzdGFnZWludCwgcHJpb3JpdHkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJLy8gVE9ETzogTG9nIGV4Y2VwdGlvbiBhcyB0aGlzIHdpbGwgY2F1c2UgYW4gZXh0ZW5zaW9uIHJlc29sdmVyCi0JCQkJCS8vICAgICAgIGZyb20gbG9hZGluZy4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBhNGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIEEgVVJJUmVzb2x2ZXIgaXMgdXNlZCB0byByZXNvbHZlIFVSSSByZWZlcmVuY2VzIHRvIHJlc291cmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBVUklSZXNvbHZlciB7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbiAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgdXJpIAotCSAqIEBwYXJhbSBwdWJsaWNJZCAtIGFuIG9wdGlvbmFsIHB1YmxpYyBpZGVudGlmaWVyIChpLmUuIG5hbWVzcGFjZSBuYW1lKSwgb3IgbnVsbCBpZiBub25lCi0JICogQHBhcmFtIHN5c3RlbUlkIC0gYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJLCBvciBudWxsIGlmIG5vbmUgCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBVUkkgcmVwcmVzZW50aW9uIHRoZSAnbG9naWNhbCcgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYmFzZUxvY2F0aW9uIC0gdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSB0aGF0IGNvbnRhaW5zIHRoZSB1cmkgCi0gICAgICogQHBhcmFtIHB1YmxpY0lkIC0gYW4gb3B0aW9uYWwgcHVibGljIGlkZW50aWZpZXIgKGkuZS4gbmFtZXNwYWNlIG5hbWUpLCBvciBudWxsIGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQgLSBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkksIG9yIG51bGwgaWYgbm9uZSAKLSAgICAgKiBAcmV0dXJuIGFuIGFic29sdXRlIFVSSSByZXByZXNlbnRpb24gdGhlICdwaHlzaWNhbCcgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyByZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBsb2dpY2FsTG9jYXRpb24pOyAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDYxZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiBBbiBleHRlbnNpb24gdG8gYXVnbWVudCB0aGUgYmVoYXZpb3VyIG9mIGEgVVJJUmVzb2x2ZXIuICBFeHRlbnNpb25zIGFyZSBwcm9qZWN0IGF3YXJlCi0gKiBzbyB0aGF0IHRoZXkgY2FuIGFwcGx5IHNwZWNpYWxpemVkIHByb2plY3Qgc3BlY2lmaWMgcmVzb2x2aW5nIHJ1bGVzLiAKLSAqLwotcHVibGljIGludGVyZmFjZSBVUklSZXNvbHZlckV4dGVuc2lvbiB7Ci0JLyoqCi0JICogQHBhcmFtIGZpbGUgdGhlIGluLXdvcmtzcGFjZSBiYXNlIHJlc291cmNlLCBpZiBvbmUgZXhpc3RzCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbiAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgdXJpCi0JICogQHBhcmFtIHB1YmxpY0lkIC0gYW4gb3B0aW9uYWwgcHVibGljIGlkZW50aWZpZXIgKGkuZS4gbmFtZXNwYWNlIG5hbWUpLCBvciBudWxsIGlmIG5vbmUKLQkgKiBAcGFyYW0gc3lzdGVtSWQgLSBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkksIG9yIG51bGwgaWYgbm9uZSAKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIFVSSSBvciBudWxsIGlmIHRoaXMgZXh0ZW5zaW9uIGNhbiBub3QgcmVzb2x2ZSB0aGlzIHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShJRmlsZSBmaWxlLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXJQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjYzNjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5FeHRlbnNpYmxlVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5VUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBVUklSZXNvbHZlclBsdWdpbiBpbnN0YW5jZTsJCi0JcHJvdGVjdGVkIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgeG1sUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeTsKLQotCXB1YmxpYyBzdGF0aWMgVVJJUmVzb2x2ZXJQbHVnaW4gZ2V0SW5zdGFuY2UoKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLQlwdWJsaWMgVVJJUmVzb2x2ZXJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9CQotCQotCQkJCQkKLQlwdWJsaWMgc3RhdGljIFVSSVJlc29sdmVyIGNyZWF0ZVJlc29sdmVyKCkKLQl7Ci0JCXJldHVybiBjcmVhdGVSZXNvbHZlcihudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBVUklSZXNvbHZlciBjcmVhdGVSZXNvbHZlcihNYXAgcHJvcGVydGllcykKLQl7Ci0JCS8vIFRPRE8uLi4gdXRpbGl6ZSBwcm9wZXJ0aWVzCi0JCXJldHVybiBuZXcgRXh0ZW5zaWJsZVVSSVJlc29sdmVyKCk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC91dGlsL1VSSUVuY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC91dGlsL1VSSUVuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjN2M5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7Ci0KLS8qKgotICogIFRoaXMgY2xhc3MgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGphdmEubGFuZy5VUkxFbmNvZGVyLgotICovCi1wdWJsaWMgY2xhc3MgVVJJRW5jb2RlciAKLXsKLSAgc3RhdGljIEJpdFNldCBkb250TmVlZEVuY29kaW5nOwotICBzdGF0aWMgZmluYWwgaW50IGNhc2VEaWZmID0gKCdhJyAtICdBJyk7Ci0gIHN0YXRpYyBTdHJpbmcgZGZsdEVuY05hbWUgPSBudWxsOwotICAKLQotICBzdGF0aWMgCi0gIHsgICAgICAgICAgICAKLQkgIGRvbnROZWVkRW5jb2RpbmcgPSBuZXcgQml0U2V0KDI1Nik7Ci0JICBpbnQgaTsKLQkgIGZvciAoaSA9ICdhJzsgaSA8PSAneic7IGkrKykgCi0gICAgewotCSAgICBkb250TmVlZEVuY29kaW5nLnNldChpKTsKLQkgIH0KLQkgIGZvciAoaSA9ICdBJzsgaSA8PSAnWic7IGkrKykgCi0gICAgewotCSAgICBkb250TmVlZEVuY29kaW5nLnNldChpKTsKLQkgIH0KLQkgIGZvciAoaSA9ICcwJzsgaSA8PSAnOSc7IGkrKykgCi0gICAgewotCSAgICBkb250TmVlZEVuY29kaW5nLnNldChpKTsKLQkgIH0KLQotCSAgLy9kb250TmVlZEVuY29kaW5nLnNldCgnICcpOyAvLyBjcy4uIHJlbW92ZWQgc28gdGhhdCBzcGFjZSBjaGFyYWN0ZXIgd2lsbCBiZSByZXBsYWNlZCBieSAlMjAKLQkgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCctJyk7Ci0JICBkb250TmVlZEVuY29kaW5nLnNldCgnXycpOwotCSAgZG9udE5lZWRFbmNvZGluZy5zZXQoJy4nKTsKLQkgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCcqJyk7Ci0JICBkb250TmVlZEVuY29kaW5nLnNldCgnOicpOyAgIC8vIGNzLi4gYWRkZWQgCi0JICBkb250TmVlZEVuY29kaW5nLnNldCgnLycpOyAgIC8vIGNzLi4gYWRkZWQgc28gdGhhdCBzbGFzaGVzIGRvbid0IGdldCBlbmNvZGVkIGFzICUyRgotCi0gIAkvLyBkZmx0RW5jTmFtZSA9IChTdHJpbmcpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IEdldFByb3BlcnR5QWN0aW9uKCJmaWxlLmVuY29kaW5nIikpOwotICAJLy8gQXMgZGlzY3Vzc2VkIHdpdGggU2FuZHksIHdlIHNob3VsZCBlbmNvZGUgVVJJcyB3aXRoIFVURjgKLSAgIGRmbHRFbmNOYW1lID0gIlVURjgiOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJkZmx0RW5jTmFtZSAiICsgZGZsdEVuY05hbWUpOwotICAgfQotCi0gIC8qKgotICAgKiBZb3UgY2FuJ3QgY2FsbCB0aGUgY29uc3RydWN0b3IuCi0gICAqLwotICBwcml2YXRlIFVSSUVuY29kZXIoKSB7IH0KLQotICAvKioKLSAgICogVHJhbnNsYXRlcyBhIHN0cmluZyBpbnRvIDxjb2RlPngtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4KLSAgICogZm9ybWF0LiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgZW5jb2RpbmcKLSAgICogYXMgdGhlIGVuY29kaW5nIHNjaGVtZSB0byBvYnRhaW4gdGhlIGJ5dGVzIGZvciB1bnNhZmUgY2hhcmFjdGVycy4KLSAgICoKLSAgICogQHBhcmFtICAgcyAgIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgdHJhbnNsYXRlZC4KLSAgICogQGRlcHJlY2F0ZWQgVGhlIHJlc3VsdGluZyBzdHJpbmcgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSdzCi0gICAqICAgICAgICAgICAgIGRlZmF1bHQgZW5jb2RpbmcuIEluc3RlYWQsIHVzZSB0aGUgZW5jb2RlKFN0cmluZyxTdHJpbmcpCi0gICAqICAgICAgICAgICAgIG1ldGhvZCB0byBzcGVjaWZ5IHRoZSBlbmNvZGluZy4KLSAgICogQHJldHVybiAgdGhlIHRyYW5zbGF0ZWQgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgCi0gIHsKLQkgIFN0cmluZyBzdHIgPSBudWxsOwotCSAgdHJ5IAotICAgIHsKLQkgICAgc3RyID0gZW5jb2RlKHMsIGRmbHRFbmNOYW1lKTsKLQkgIH0gCi0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgCi0gICAgewotCSAgICAvLyBUaGUgc3lzdGVtIHNob3VsZCBhbHdheXMgaGF2ZSB0aGUgcGxhdGZvcm0gZGVmYXVsdAotCSAgfQotCSAgcmV0dXJuIHN0cjsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFuc2xhdGVzIGEgc3RyaW5nIGludG8gPGNvZGU+YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPgotICAgKiBmb3JtYXQgdXNpbmcgYSBzcGVjaWZpYyBlbmNvZGluZyBzY2hlbWUuIFRoaXMgbWV0aG9kIHVzZXMgdGhlCi0gICAqIHN1cHBsaWVkIGVuY29kaW5nIHNjaGVtZSB0byBvYnRhaW4gdGhlIGJ5dGVzIGZvciB1bnNhZmUKLSAgICogY2hhcmFjdGVycy4KLSAgICogPHA+Ci0gICAqIDxlbT48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSA8YSBocmVmPQotICAgKiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwL2FwcGVuZGl4L25vdGVzLmh0bWwjbm9uLWFzY2lpLWNoYXJzIj4KLSAgICogV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBSZWNvbW1lbmRhdGlvbjwvYT4gc3RhdGVzIHRoYXQKLSAgICogVVRGLTggc2hvdWxkIGJlIHVzZWQuIE5vdCBkb2luZyBzbyBtYXkgaW50cm9kdWNlCi0gICAqIGluY29tcGF0aWJpbGl0ZXMuPC9lbT4KLSAgICoKLSAgICogQHBhcmFtICAgcyAgIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgdHJhbnNsYXRlZC4KLSAgICogQHBhcmFtICAgZW5jICAgVGhlIG5hbWUgb2YgYSBzdXBwb3J0ZWQgCi0gICAqICAgIDxhIGhyZWY9Ii4uL2xhbmcvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjY2hhcmVuYyI+Y2hhcmFjdGVyCi0gICAqICAgIGVuY29kaW5nPC9hPi4KLSAgICogQHJldHVybiAgdGhlIHRyYW5zbGF0ZWQgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLSAgICogQGV4Y2VwdGlvbiAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgKiAgICAgICAgICAgICBJZiB0aGUgbmFtZWQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZAotICAgKiBAc2VlIGphdmEubmV0LlVSTERlY29kZXIjZGVjb2RlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMsIFN0cmluZyBlbmMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIAotICB7Ci0JICBib29sZWFuIG5lZWRUb0NoYW5nZSA9IGZhbHNlOwotCSAgYm9vbGVhbiB3cm90ZVVuZW5jb2RlZENoYXIgPSBmYWxzZTsgCi0JICBpbnQgbWF4Qnl0ZXNQZXJDaGFyID0gMTA7IC8vIHJhdGhlciBhcmJpdHJhcnkgbGltaXQsIGJ1dCBzYWZlIGZvciBub3cKLSAgICBTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKLQkgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKG1heEJ5dGVzUGVyQ2hhcik7Ci0JICBCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYsIGVuYykpOwotCi0JICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgCi0gICAgewotCSAgICBpbnQgYyA9IHMuY2hhckF0KGkpOwotCSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRXhhbWluaW5nIGNoYXJhY3RlcjogIiArIGMpOwotCSAgICBpZiAoZG9udE5lZWRFbmNvZGluZy5nZXQoYykpCi0gICAgICB7Ci0JCSAgIC8vaWYgKGMgPT0gJyAnKQotICAgICAgIC8vewotCQkgICAvLyAgYyA9ICcrJzsKLQkJICAgLy8gIG5lZWRUb0NoYW5nZSA9IHRydWU7Ci0JCSAgIC8vfQotCQkgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiU3RvcmluZzogIiArIGMpOwotCQkgICBvdXQuYXBwZW5kKChjaGFyKWMpOwotCQkgICB3cm90ZVVuZW5jb2RlZENoYXIgPSB0cnVlOwotCSAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JCSAgICAvLyBjb252ZXJ0IHRvIGV4dGVybmFsIGVuY29kaW5nIGJlZm9yZSBoZXggY29udmVyc2lvbgotCQkgICAgdHJ5Ci0gICAgICAgIHsKLQkJICAgICAgaWYgKHdyb3RlVW5lbmNvZGVkQ2hhcikgCi0gICAgICAgICAgeyAvLyBGaXggZm9yIDQ0MDc2MTAKLQkJICAgIAkgIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1ZiwgZW5jKSk7Ci0JCQkgICAgICB3cm90ZVVuZW5jb2RlZENoYXIgPSBmYWxzZTsKLQkJICAgICAgfQotCQkgICAgICB3cml0ZXIud3JpdGUoYyk7Ci0JCSAgICAgICAgCi0JCSAgICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIGEgVW5pY29kZQotCQkgICAgICAvLyBzdXJyb2dhdGUgcGFpciwgdGhlbiBwYXNzIGluIHR3byBjaGFyYWN0ZXJzLiBJdCdzIG5vdAotCQkgICAgICAvLyBjbGVhciB3aGF0IHNob3VsZCBiZSBkb25lIGlmIGEgYnl0ZXMgcmVzZXJ2ZWQgaW4gdGhlIAotCQkgICAgICAvLyBzdXJyb2dhdGUgcGFpcnMgcmFuZ2Ugb2NjdXJzIG91dHNpZGUgb2YgYSBsZWdhbAotCQkgICAgICAvLyBzdXJyb2dhdGUgcGFpci4gRm9yIG5vdywganVzdCB0cmVhdCBpdCBhcyBpZiBpdCB3ZXJlIAotCQkgICAgICAvLyBhbnkgb3RoZXIgY2hhcmFjdGVyLgotCQkgICAgICAvLyAKLQkJICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhEQkZGKSAKLSAgICAgICAgICB7Ci0JCQkgICAgICAvLyAgU3lzdGVtLm91dC5wcmludGxuKEludGVnZXIudG9IZXhTdHJpbmcoYykgKyAiIGlzIGhpZ2ggc3Vycm9nYXRlIik7CQkJICAgICAgCi0JCQkgICAgICBpZiAoIChpKzEpIDwgcy5sZW5ndGgoKSkgCi0gICAgICAgICAgICB7Ci0JCQkgICAgICAgIGludCBkID0gcy5jaGFyQXQoaSsxKTsKLQkJCSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdEV4YW1pbmluZyAiICsgSW50ZWdlci50b0hleFN0cmluZyhkKSk7CQkJICAgICAgCi0JCQkgICAgICAgIGlmIChkID49IDB4REMwMCAmJiBkIDw9IDB4REZGRikgCi0gICAgICAgICAgICAgIHsKLQkJCQkgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgSW50ZWdlci50b0hleFN0cmluZyhkKSArICIgaXMgbG93IHN1cnJvZ2F0ZSIpOwkJCQkKLQkJCQkgICAgICAgIHdyaXRlci53cml0ZShkKTsKLQkJCQkgICAgICAgIGkrKzsKLQkJCSAgICAgICAgfQotCQkJICAgICAgfQotCQkgICAgICB9Ci0JCSAgICAgIHdyaXRlci5mbHVzaCgpOwotCQkgICAgfSAKLSAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLQkJICAgICAgYnVmLnJlc2V0KCk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQkgICAgYnl0ZVtdIGJhID0gYnVmLnRvQnl0ZUFycmF5KCk7Ci0KLQkJICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmEubGVuZ3RoOyBqKyspIAotICAgICAgICB7Ci0JCSAgICAgIG91dC5hcHBlbmQoJyUnKTsKLQkJICAgICAgY2hhciBjaCA9IENoYXJhY3Rlci5mb3JEaWdpdCgoYmFbal0gPj4gNCkgJiAweEYsIDE2KTsKLQkJICAgICAgLy8gY29udmVydGluZyB0byB1c2UgdXBwZXJjYXNlIGxldHRlciBhcyBwYXJ0IG9mCi0JCSAgICAgIC8vIHRoZSBoZXggdmFsdWUgaWYgY2ggaXMgYSBsZXR0ZXIuCi0JCSAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY2gpKSAKLSAgICAgICAgICB7Ci0JCQkgICAgICBjaCAtPSBjYXNlRGlmZjsKLQkJICAgICAgfQotCQkgICAgICBvdXQuYXBwZW5kKGNoKTsKLQkJICAgICAgY2ggPSBDaGFyYWN0ZXIuZm9yRGlnaXQoYmFbal0gJiAweEYsIDE2KTsKLQkJICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjaCkpIAotICAgICAgICAgIHsKLQkJCSAgICAgIGNoIC09IGNhc2VEaWZmOwotCQkgICAgICB9Ci0JCSAgICAgIG91dC5hcHBlbmQoY2gpOwotCQkgICAgfQotCQkgICAgYnVmLnJlc2V0KCk7Ci0JCSAgICBuZWVkVG9DaGFuZ2UgPSB0cnVlOwotCSAgICB9Ci0JICB9Ci0JICByZXR1cm4gKG5lZWRUb0NoYW5nZT8gb3V0LnRvU3RyaW5nKCkgOiBzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3V0aWwvVVJJSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2NzQwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogMjAwNzEyMDUgICAyMTEyNjIgZXJpY2RwQGNhLmlibS5jb20gLSBFcmljIFBldGVycywgQ29weVdTRExUcmVlQ29tbWFuZCBmYWlscyB0byBjb3B5ID93c2RsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotCi1wdWJsaWMgY2xhc3MgVVJJSGVscGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MID0gInBsYXRmb3JtOi9yZXNvdXJjZS8iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9QQVRURVJOID0gIjoiOyAKLSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbnN1cmVVUklQcm90b2NvbEZvcm1hdChTdHJpbmcgdXJpKSB7Ci0JICBTdHJpbmcgcHJvdG9jb2wgPSBnZXRQcm90b2NvbCh1cmkpOwotCSAgaWYgKHByb3RvY29sICE9IG51bGwpIHsKLQkJICBpZiAocHJvdG9jb2wuZXF1YWxzKEZJTEVfUFJPVE9DT0wpKSB7Ci0JCQkgIHJldHVybiBlbnN1cmVGaWxlVVJJUHJvdG9jb2xGb3JtYXQodXJpKTsKLQkJICB9Ci0JICB9Ci0JIHJldHVybiB1cmk7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgdGFrZXMgYSBmaWxlIFVSSSBpbiBTdHJpbmcgZm9ybWF0IGFuZCBlbnN1cmVzIHRoZSBwcm90b2NvbCBpcyBmb2xsb3dlZCBieSB0aHJlZSBzbGFzaGVzLgotICAgKiBGb3IgZXhhbXBsZSwgZmlsZXMgImZpbGU6RDovWFhYIiwgImZpbGU6L0Q6L1hYWCIgYW5kICJmaWxlOi8vRDovWFhYIiBhcmUgY29ycmVjdGVkIHRvOgotICAgKiAiZmlsZTovLy9EOi9YWFgiLgotICAgKiBJZiB0aGUgaW5wdXQgaXMgbm90IGEgZmlsZSBVUkkgKGRvZXMgbm90IHN0YXJ0IHdpdGggImZpbGU6IiksIHRoZSBTdHJpbmcgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuc3VyZUZpbGVVUklQcm90b2NvbEZvcm1hdChTdHJpbmcgdXJpKSB7Ci0gICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkgJiYgIXVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wgKyAiLy8vIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgIAlpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCArICIvLyIpKSB7Ci0gICAgICAJCXVyaSA9IEZJTEVfUFJPVE9DT0wgKyAiLyIgKyB1cmkuc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAJfSBlbHNlIGlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MICsgIi8iKSkgewotICAgICAgCQl1cmkgPSBGSUxFX1BST1RPQ09MICsgIi8vIiArIHVyaS5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIAl9IGVsc2UgewotICAgICAgCQl1cmkgPSBGSUxFX1BST1RPQ09MICsgIi8vLyIgKyB1cmkuc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAJfQotICAgICAgfQotICAgICByZXR1cm4gdXJpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHByb3RvY29sID0gZ2V0UHJvdG9jb2wodXJpKTsKLSAgICAgIFN0cmluZyBmaWxlID0gdXJpOwotICAgICAgICAgICAKLSAgICAgIGlmIChwcm90b2NvbCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgeyAgIAotICAgICAgICAgIC8vIAotICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7IAotICAgICAgICAgIC8vIHdlIHVzZSBhICdQYXRoJyBvbiB0aGUgJ2ZpbGUnIHBhcnQgb2YgdGhlIHVybCBpbiBvcmRlciB0byBub3JtYWxpemUgdGhlICcuJyBhbmQgJy4uJyBzZWdtZW50cwotICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aCh1cmwuZ2V0RmlsZSgpKTsgCi0gICAgICAgICAgVVJMIHVybDIgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCBwYXRoLnRvU3RyaW5nKCkpOwotICAgICAgICAgIHVyaSA9IHVybDIudG9TdHJpbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7ICAKLSAgICAgICAgfQotICAgICAgfSAgIAotICAgICAgZWxzZQotICAgICAgeyAgICAgIAotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZSk7Ci0gICAgICAgIHVyaSA9IHBhdGgudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIGEgJ251bGwnIHJvb3RMb2NhdGlvbiBhcmd1bWVudCB3aWxsIGNhdXNlcyB1cmkgdGhhdCBiZWdpbnMgd2l0aCBhICcvJyB0byBiZSB0cmVhdGVkIGFzIGEgd29ya3NwYWNlIHJlbGF0aXZlIHJlc291cmNlCi0gICAqIChpLmUuIHRoZSBzdHJpbmcgInBsYXRmb3JtOi9yZXNvdXJjZSIgaXMgcHJlcGVuZGVkIGFuZCB0aGUgdXJpIGlzIHJlc29sdmVkIHZpYSB0aGUgUGxhdGZvcm0gb2JqZWN0KQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyB1cmksIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgcm9vdExvY2F0aW9uKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgeyAKLSAgICAgIC8vIGlzIHRoZSB1cmkgYSB1cmwKLSAgICAgIGlmIChoYXNQcm90b2NvbCh1cmkpKQotICAgICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoaXNQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHJlc29sdmVQbGF0Zm9ybVVybCh1cmkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHVyaTsKLSAgICAgICAgfQotICAgICAgfQotICAgCi0gICAgICAvLyBpcyB1cmkgYWJzb2x1dGUKLSAgICAgIC8vCi0gICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh1cmkuaW5kZXhPZigiOiIpICE9IC0xIHx8IHVyaS5zdGFydHNXaXRoKCIvIikgfHwgdXJpLnN0YXJ0c1dpdGgoIlxcIikpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgcmVzdWx0ID0gdXJpOwotICAgICAgICB9Ci0gICAgICB9Ci0gIAotICAgICAgLy8gaWYgdXJpIGlzIHJlbGF0aXZlIHRvIHRoZSByZXNvdXJjZUxvY2F0aW9uCi0gICAgICAvLwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIHJlc291cmNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgCi0gICAgICAgIGlmIChyZXNvdXJjZUxvY2F0aW9uLmVuZHNXaXRoKCIvIikpCi0gICAgICAgIHsKLQkJCSAgICByZXN1bHQgPSByZXNvdXJjZUxvY2F0aW9uICsgdXJpOwotICAgICAgICB9Ci0JCSAgICBlbHNlCi0gICAgICAgIHsKLQkJCSAgICByZXN1bHQgPSByZXNvdXJjZUxvY2F0aW9uICsgIi8uLi8iICsgdXJpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdXJpOwotICAgICAgfQotICAKLSAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZShyZXN1bHQpOwotICAgIH0KLQotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJub3JtYWxpemUoIiArIHVyaSArICIsICIgKyByZXNvdXJjZUxvY2F0aW9uICsgIiwgIiArIHJvb3RMb2NhdGlvbiArICIpID0gIiArIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVVJMKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gdXJpLmluZGV4T2YoIjovIikgPiAyOyAvLyB0ZXN0IHRoYXQgdGhlIGluZGV4IGlzID4gMiBzbyB0aGF0IEM6LyBpcyBub3QgY29uc2lkZXJlZCBhIHByb3RvY29sCi0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhc3RTZWdtZW50KFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gdXJpOwotICAgIGludCBpbmRleCA9IE1hdGgubWF4KHVyaS5sYXN0SW5kZXhPZigiLyIpLCB1cmkubGFzdEluZGV4T2YoIlxcIikpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGludCBkb3RJbmRleCA9IGdldEV4dGVuc2lvbkRvdEluZGV4KHVyaSk7Ci0gICAgICAgICAgICAgICAKLSAgICBpZiAoZG90SW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcmVzdWx0ID0gdXJpLnN1YnN0cmluZyhkb3RJbmRleCArIDEpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUZpbGVFeHRlbnNpb24oU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGludCBkb3RJbmRleCA9IGdldEV4dGVuc2lvbkRvdEluZGV4KHVyaSk7Ci0KLSAgICBpZiAoZG90SW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcmVzdWx0ID0gdXJpLnN1YnN0cmluZygwLCBkb3RJbmRleCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgIAotICAgICAgICAgICAgIAotCi0gIC8vIGhlcmUgd2UgdXNlIHRoZSBQbGF0Zm9ybSB0byByZXNvbHZlIGEgd29ya3NwYWNlIHJlbGF0aXZlIHBhdGggdG8gYW4gYWN0dWFsIHVybAotICAvLwotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyByZXNvbHZlUGxhdGZvcm1VcmwoU3RyaW5nIHVybHNwZWMpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB1cmxzcGVjID0gdXJsc3BlYy5yZXBsYWNlKCdcXCcsICcvJyk7IAotICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJsc3BlYyk7Ci0gICAgICBVUkwgcmVzb2x2ZWRVUkwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0gICAgICByZXN1bHQgPSByZXNvbHZlZFVSTC50b1N0cmluZygpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRFeHRlbnNpb25Eb3RJbmRleChTdHJpbmcgdXJpKQotICB7Ci0gICAgaW50IHJlc3VsdCA9IC0xOwotICAgIGludCBkb3RJbmRleCA9IHVyaS5sYXN0SW5kZXhPZigiLiIpOwotICAgIGludCBzbGFzaEluZGV4ID0gTWF0aC5tYXgodXJpLmxhc3RJbmRleE9mKCIvIiksIHVyaS5sYXN0SW5kZXhPZigiXFwiKSk7Ci0KLSAgICBpZiAoZG90SW5kZXggIT0gLTEgJiYgZG90SW5kZXggPiBzbGFzaEluZGV4KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRvdEluZGV4OwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiB1cmkgIT0gbnVsbCAmJiB1cmkuc3RhcnRzV2l0aChQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgCi0gICAgaWYgKHVyaSAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKSkKLSAgICB7Ci0gICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MLmxlbmd0aCgpKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiB1cmk7Ci0gIH0gICAgICAgICAgICAKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgCi0gICAgaWYgKHVyaSAhPSBudWxsICYmICF1cmkuc3RhcnRzV2l0aChQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCkpCi0gICAgewotICAgICAgdXJpID0gUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wgKyB1cmk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gdXJpOwotICB9IAotICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVwZW5kRmlsZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsgIAotICAgIGlmICh1cmkgIT0gbnVsbCAmJiAhdXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpCi0gICAgewotICAgICAgdXJpID0gRklMRV9QUk9UT0NPTCArIHVyaTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiB1cmk7Ci0gIH0gCi0gICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKFBST1RPQ09MX1BBVFRFUk4pOwotICAgICAgaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ID4gMikgLy8gYXNzdW1lIHByb3RvY29sIHdpdGggYmUgbGVuZ3RoIDMgc28gdGhhdCB0aGUnQycgaW4gJ0M6LycgaXMgbm90IGludGVycHJldGVkIGFzIGEgcHJvdG9jb2wKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWJzb2x1dGUoU3RyaW5nIHVyaSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7ICAgICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoUFJPVE9DT0xfUEFUVEVSTik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEgfHwgdXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aCgiXFwiKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkSW1wbGllZEZpbGVQcm90b2NvbChTdHJpbmcgdXJpKQotICB7ICAKLSAgICBpZiAoIWhhc1Byb3RvY29sKHVyaSkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHByZWZpeCA9IEZJTEVfUFJPVE9DT0w7Ci0gICAgICBwcmVmaXggKz0gdXJpLnN0YXJ0c1dpdGgoIi8iKSA/ICIvLyIgOiAiLy8vIjsKLSAgICAgIHVyaSA9IHByZWZpeCArIHVyaTsKLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAgICAgICAgICAgIAotICAvLyB0b2RvLi4uIG5lZWQgdG8gcmV2aXNpdCB0aGlzIGJlZm9yZSB3ZSBwdWJsaWNpemUgaXQKLSAgLy8gCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOyAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKFBST1RPQ09MX1BBVFRFUk4pOwotICAgICAgaWYgKGluZGV4ID4gMikgLy8gYXNzdW1lIHByb3RvY29sIHdpdGggYmUgbGVuZ3RoIDMgc28gdGhhdCB0aGUnQycgaW4gJ0M6LycgaXMgbm90IGludGVycHJldGVkIGFzIGEgcHJvdG9jb2wKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdXJpLnN1YnN0cmluZygwLCBpbmRleCArIFBST1RPQ09MX1BBVFRFUk4ubGVuZ3RoKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gdXJpOyAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKFBST1RPQ09MX1BBVFRFUk4pOwotICAgICAgaWYgKGluZGV4ID4gMikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZyhpbmRleCArIFBST1RPQ09MX1BBVFRFUk4ubGVuZ3RoKCkpOyAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNQcm90b2NvbEZpbGVPck51bGwoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBwcm90b2NvbCA9IGdldFByb3RvY29sKHVyaSk7ICAgCi0gICAgcmV0dXJuIHByb3RvY29sID09IG51bGwgfHwgcHJvdG9jb2wuZXF1YWxzKEZJTEVfUFJPVE9DT0wpOwotICB9ICAKLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm90b2NvbEZpbGUoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgcmV0dXJuIHVyaSAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wpOwotICB9ICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZ1Byb3RvY29sKFN0cmluZyB1cmkxLCBTdHJpbmcgdXJpMikKLSAgeyAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAgCi0KLSAgICBTdHJpbmcgcHJvdG9jb2wxID0gZ2V0UHJvdG9jb2wodXJpMSk7Ci0gICAgU3RyaW5nIHByb3RvY29sMiA9IGdldFByb3RvY29sKHVyaTIpOwotCi0gICAgaWYgKGlzUHJvdG9jb2xGaWxlT3JOdWxsKHByb3RvY29sMSkgJiYgaXNQcm90b2NvbEZpbGVPck51bGwocHJvdG9jb2wyKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICB9IAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBwcm90b2NvbDEgIT0gbnVsbCAmJiBwcm90b2NvbDIgIT0gbnVsbCAmJiBwcm90b2NvbDEuZXF1YWxzKHByb3RvY29sMik7Ci0gICAgfSAgICAgICAgICAgICAKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogd2FybmluZy4uLiB0aGlzIG1ldGhvZCBub3QgZnVsbHkgdGVzdGVkIHlldAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIHJlc291cmNlTG9jYXRpb24pCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSB1cmk7ICAKLSAgICBpZiAoaXNNYXRjaGluZ1Byb3RvY29sKHVyaSwgcmVzb3VyY2VMb2NhdGlvbikpIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldFJlbGF0aXZlVVJJKG5ldyBQYXRoKHJlbW92ZVByb3RvY29sKHVyaSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhdGgocmVtb3ZlUHJvdG9jb2wocmVzb3VyY2VMb2NhdGlvbikpKTsKLSAgICB9ICAgICAgICAgICAgCi0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIHdhcm5pbmcuLi4gdGhpcyBtZXRob2Qgbm90IGZ1bGx5IHRlc3RlZCB5ZXQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlVVJJKElQYXRoIHVyaSwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikKLSAgeyAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGludCBuTWF0Y2hpbmdTZWdtZW50cyA9IDA7ICAgICAgIAotICAgIHJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIGEgPSB1cmkuc2VnbWVudChuTWF0Y2hpbmdTZWdtZW50cyk7IAotICAgICAgU3RyaW5nIGIgPSByZXNvdXJjZUxvY2F0aW9uLnNlZ21lbnQobk1hdGNoaW5nU2VnbWVudHMpOyAKLSAgICAgIGlmIChhICE9IG51bGwgJiYgYiAhPSBudWxsICYmIGEuZXF1YWxzKGIpKQotICAgICAgewotICAgICAgICBuTWF0Y2hpbmdTZWdtZW50cysrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAKLQotICAgIGlmIChuTWF0Y2hpbmdTZWdtZW50cyA9PSAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHVyaS50b09TU3RyaW5nKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgIAotICAgICAgcmVzdWx0ID0gIiI7ICAgCi0gICAgICBib29sZWFuIGlzRmlyc3QgPSB0cnVlOwotICAgICAgU3RyaW5nW10gc2VnbWVudHMgPSByZXNvdXJjZUxvY2F0aW9uLnNlZ21lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gbk1hdGNoaW5nU2VnbWVudHM7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgKz0gaXNGaXJzdCA/ICIuLiIgOiAiLy4uIjsgICAgIAotICAgICAgICBpZiAoaXNGaXJzdCkKLSAgICAgICAgewotICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgICAvLyAKLSAgICAgIHNlZ21lbnRzID0gdXJpLnNlZ21lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gbk1hdGNoaW5nU2VnbWVudHM7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCArPSBpc0ZpcnN0ID8gc2VnbWVudHNbaV0gOiAoIi8iICsgc2VnbWVudHNbaV0pOyAgICAgCi0gICAgICAgIGlmIChpc0ZpcnN0KQotICAgICAgICB7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IAotICAgICAgfQotICAgIH0gICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybVVSSShJUmVzb3VyY2UgcmVzb3VyY2UpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIGZ1bGxQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgIGlmIChmdWxsUGF0aC5zdGFydHNXaXRoKCIvIikpCi0gICAgewotICAgICAgZnVsbFBhdGggPSBmdWxsUGF0aC5zdWJzdHJpbmcoMSk7Ci0gICAgfQotICAgIHJldHVybiBQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCArIGZ1bGxQYXRoOwotICB9Ci0gIAotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZHMgaXMgdXNlZCBhcyBhIHF1aWNrIHRlc3QgdG8gc2VlIGlmIGEgdXJpIGNhbiBiZSByZXNvbHZlZCB0byBhbiBleGlzdGluZyByZXNvdXJjZS4gICAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRhYmxlVVJJKFN0cmluZyB1cmksIGJvb2xlYW4gdGVzdFJlbW90ZVVSSSkKLSAgeyAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsgICAKLSAgICAgIHRyeQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdXJpID0gbm9ybWFsaXplKHVyaSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGlmIChpc1Byb3RvY29sRmlsZU9yTnVsbCh1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgdXJpID0gcmVtb3ZlUHJvdG9jb2wodXJpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5VUkkuZGVjb2RlKHVyaSkpOwotICAgICAgICAgIHJlc3VsdCA9IGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0ZpbGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1BsYXRmb3JtUmVzb3VyY2VQcm90b2NvbCh1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gTm90ZSAtIElmIHdlIGFyZSBoZXJlLCB1cmkgaGFzIGJlZW4gZmFpbGVkIHRvIHJlc29sdmUKLSAgICAgICAgICAvLyByZWxhdGl2ZSB0byB0aGUgUGxhdGZvcm0uIFNlZSBub3JtYWxpemUoKSB0byBmaW5kIHdoeS4KLSAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZXN0UmVtb3RlVVJJKQotICAgICAgICB7Ci0gICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLSAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAvLyB0aGUgdXJpIGlzIHJlYWRhYmxlIGlmIHdlIHJlYWNoIGhlcmUuCi0gICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvLyB1cmkgaXMgbnVsbAotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAKLQotICAvKioKLSAgICogcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIHVyaQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRVUkkoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICB0cnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHsKLSAgICAgIG5ldyBVUkkodXJpKTsKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfSAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogcmV0dXJucyBhbiBhY2NlcHRhYmxlIFVSSSBmb3IgYSBmaWxlIHBhdGgKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVSSUZvckZpbGVQYXRoKFN0cmluZyBmaWxlUGF0aCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBhZGRJbXBsaWVkRmlsZVByb3RvY29sKGZpbGVQYXRoKTsKLSAgICBpZiAoIWlzVmFsaWRVUkkocmVzdWx0KSkKLSAgICB7Ci0gICAgCXRyeQotICAgIAl7Ci0gICAgICAgIHJlc3VsdCA9IFVSSUVuY29kZXIuZW5jb2RlKHJlc3VsdCwgIlVURjgiKTsKLSAgICAJfQotICAgIAljYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpCi0gICAgCXsKLSAgICAJCS8vIERvIG5vdGhpbmcgYXMgbG9uZyBhcyBVVEY4IGlzIHVzZWQuIFRoaXMgaXMgc3VwcG9ydGVkLgotICAgIAl9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTUzMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1jYWNoZS5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTg4ZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2QxYTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNXZWQgTWFyIDE1IDE3OjI3OjMzIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwMjRiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jV2VkIE1hciAxNSAxNzoyNzozMyBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzE1Y2RlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJV9QTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMzAxLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlX1BMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cyIsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDRmNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBleHNkLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvZXhzZC9jYWNoZXJlc291cmNlLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9leHNkL2NhY2hlcmVzb3VyY2UuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwZGQxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9leHNkL2NhY2hlcmVzb3VyY2UuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSIgaWQ9ImNhY2hlcmVzb3VyY2UiIG5hbWU9IkNhY2hlIFJlc291cmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIERlcHJlY2F0ZWQuIE5vIGxvbmdlciB1c2VkIGluIFdUUCwgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gCi0KLVRoZSBjYWNoZSByZXNvdXJjZSBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gc3BlY2lmeSByZXNvdXJjZXMgdGhhdCBtYXkgYmUgY2FjaGVkIHRoYXQgcmVxdWlyZSBsaWNlbnNlcyB0byBiZSBhY2NlcHRlZCBwcmlvciB0byBjYWNoaW5nLgotCi1EZXByZWNhdGVkLiBObyBsb25nZXIgdXNlZCBpbiBXVFAsIGFuZCB3aWxsIGJlIHJlbW92ZWQuIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYWNoZXJlc291cmNlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYWNoZXJlc291cmNlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGNhY2hlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpY2Vuc2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGxpY2Vuc2Ugb2YgdGhlIHJlc291cmNlIHRvIGNhY2hlLiBUaGUgbGljZW5zZSBpcyBzcGVjaWZpZWQgYXMgYSBVUkwgdGhhdCByZXNvbHZlcyB0byBhIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbGljZW5zZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIGNhY2hlIHJlc291cmNlIGNvbnRyaWJ1dGlvbjoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuY2FjaGVyZXNvdXJjZSZxdW90OyZndDsKLSAgICAgICZsdDtjYWNoZXJlc291cmNlCi0gICAgICAgICAgICBsaWNlbnNlPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZS5odG1sJnF1b3Q7Ci0gICAgICAgICAgICB1cmw9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZyZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmNzJiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotX1BMVUdJTl9QUk9WSURFUiAgICAgICAgICAgICAgICAgICAgICAgPSBFY2xpcHNlLm9yZwotX1BMVUdJTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDYWNoZSBVUkkgUmVzb2x2ZXIgUGx1Zy1pbgotCi1jYWNoZVJlc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICA9IENhY2hlIFJlc291cmNlCi1fVUlfQ0FDSEVfUFJFRkVSRU5DRV9QQUdFX1RJVExFICAgICAgICA9IENhY2hlCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWNhZWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlY2FjaGVSZXNvdXJjZSIgaWQ9ImNhY2hlcmVzb3VyY2UiIHNjaGVtYT0iZXhzZC9jYWNoZXJlc291cmNlLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJV9VSV9DQUNIRV9QUkVGRVJFTkNFX1BBR0VfVElUTEUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzLkNhY2hlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzLkNhY2hlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkubmV0Lk5ldFByZWZlcmVuY2VzIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICA8aW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KLSAgICAgIDwvaW5pdGlhbGl6ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMiPgotICAgICAgPHJlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgICBzdGFnZT0icGh5c2ljYWwiCi0gICAgICAgICAgICBwcmlvcml0eT0ibG93IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uIj4KLSAgICAgIDwvcmVzb2x2ZXJFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTlmNDIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogVGhlIGNhY2hlIGhvbGRzIHJlZmVyZW5jZXMgdG8gcmVtb3RlIHJlc291cmNlcy4gVGhlIGNhY2hlIGNhbiBzdG9yZSByZXNvdXJjZXMsCi0gKiByZXRyaWV2ZSByZXNvdXJjZXMsIGFuZCBkZWxldGUgcmVzb3VyY2VzLgotICoKLSAqLwotcHVibGljIGNsYXNzIENhY2hlIAotewotICAvKioKLSAgICogU3RyaW5nIGluc3RhbmNlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkkgPSAidXJpIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OID0ibG9jYXRpb24iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5UUlkgPSAiZW50cnkiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEUgPSAiY2FjaGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9NT0RJRklFRCA9ICJsYXN0TW9kaWZpZWQiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQSVJBVElPTl9USU1FID0gImV4cGlyYXRpb25UaW1lIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfRklMRSA9ICJjYWNoZS54bWwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfRVhURU5TSU9OID0gIi5jYWNoZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9QUkVGSVggPSAid3RwY2FjaGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU1VGRklYID0gbnVsbDsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIGEgY2FjaGUgZW50cnkgaXMgMSBkYXkuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVQgPSA4NjQwMDAwMDsKLQkKLSAgLyoqCi0gICAqIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGNhY2hlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgQ2FjaGUgY2FjaGVJbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogVGhlIGNhY2hlIGlzIHN0b3JlZCBpbiBhIGhhc2h0YWJsZS4KLSAgICovCi0gIHByaXZhdGUgSGFzaHRhYmxlIGNhY2hlOwotICAKLSAgLyoqCi0gICAqIEEgc2V0IG9mIHVuY2FjaGVkIHJlc291cmNlcy4gVGhlIGNhY2hlIHdhcyBub3QgYWJsZSB0byBjYWNoZSByZXNvdXJjZXMKLSAgICogaW4gdGhpcyBsaXN0LiBUaGlzIGxpc3QgYWxsb3dzIHF1aWNrbHkgc2tpcHBpbmcgb3ZlciB0aGVzZSByZXNvdXJjZXMgaW4KLSAgICogZnV0dXJlIHJlcXVlc3RzLiAKLSAgICovCi0gIHByaXZhdGUgU2V0IHVuY2FjaGVkOwotICAKLSAgLyoqCi0gICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY2FjaGUKLSAgICovCi0gIHByaXZhdGUgRmlsZSBjYWNoZUxvY2F0aW9uID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIENhY2hlKElQYXRoIGNhY2hlTG9jYXRpb24pCi0gIHsKLQkgIHRoaXMuY2FjaGVMb2NhdGlvbiA9IGNhY2hlTG9jYXRpb24udG9GaWxlKCk7Ly9QbGF0Zm9ybS5nZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKENhY2hlUGx1Z2luLmdldERlZmF1bHQoKSkudG9GaWxlKCk7Ci0gICAgY2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdW5jYWNoZWQgPSBuZXcgSGFzaFNldCgpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGNhY2hlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBjYWNoZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ2FjaGUgZ2V0SW5zdGFuY2UoKQotICB7Ci0vLwkgIGlmKGNhY2hlSW5zdGFuY2UgPT0gbnVsbCkKLS8vCSAgewotLy8JCSAgY2FjaGVJbnN0YW5jZSA9IG5ldyBDYWNoZShjYWNoZUxvY2F0aW9uKTsKLS8vCQkgIGNhY2hlSW5zdGFuY2Uub3BlbihjYWNoZUxvY2F0aW9uKTsKLS8vCSAgfQotCSAgcmV0dXJuIGNhY2hlSW5zdGFuY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxvY2FsIHJlc291cmNlIGZvciB0aGUgc3BlY2lmaWVkIHVyaS4gSWYgdGhlcmUgaXMgbm8gcmVzb3VyY2UKLSAgICogdGhlIGNhY2hlIHdpbGwgYXR0ZW1wdCB0byBkb3dubG9hZCBhbmQgY2FjaGUgdGhlIHJlc291cmNlIGJlZm9yZSByZXR1cm5pbmcuCi0gICAqIElmIGEgcmVtb3RlIHJlc291cmNlIGNhbm5vdCBiZSBjYWNoZWQgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBmb3Igd2hpY2ggYSByZXNvdXJjZSBpcyByZXF1ZXN0ZWQuCi0gICAqIEByZXR1cm4gVGhlIGxvY2FsIHJlc291cmNlIGZvciB0aGUgc3BlY2lmaWVkIFVSSSBvciBudWxsIGlmIGEgcmVtb3RlIHJlc291cmNlIGNhbm5vdCBiZSBjYWNoZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKFN0cmluZyB1cmkpCi0gIHsKLQkgIGlmKHVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkgIENhY2hlRW50cnkgcmVzdWx0ID0gKENhY2hlRW50cnkpY2FjaGUuZ2V0KHVyaSk7Ci0JICAKLQkgIC8vIElmIG5vIHJlc3VsdCBpcyBpbiB0aGUgY2FjaGUgYW5kIHRoZSBVUkkgaXMgb2YgYW4gYWxsb3dlZCB0eXBlCi0JICAvLyByZXRyaWV2ZSBpdCBhbmQgc3RvcmUgaXQgaW4gdGhlIGNhY2hlLgotCSAgaWYocmVzdWx0ID09IG51bGwpCi0JICB7Ci0gICAgICAKLSAgICAgICAgaWYoIXVuY2FjaGVkLmNvbnRhaW5zKHVyaSkpCi0JICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBjYWNoZVJlc291cmNlKHVyaSk7IAotICAgICAgICB9Ci0JICB9Ci0JICAvLyBSZXRyZWl2ZSBhIGZyZXNoIGNvcHkgb2YgdGhlIHJlc3VsdCBpZiBpdCBoYXMgdGltZWQgb3V0LgotCSAgZWxzZSBpZihyZXN1bHQuaGFzRXhwaXJlZCgpKQotCSAgewotCQlyZXN1bHQgPSByZWZyZXNoQ2FjaGVFbnRyeShyZXN1bHQpOwotCSAgfQotCSAgaWYocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmdldExvY2FsRmlsZSgpID09IG51bGwpCi0JICB7Ci0JCXJldHVybiBudWxsOwotCSAgfQotCSAgcmV0dXJuIEZJTEVfUFJPVE9DT0wgKyBjYWNoZUxvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyByZXN1bHQuZ2V0TG9jYWxGaWxlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpc3Qgb2YgdW5jYWNoZWQgcmVzb3VyY2VzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiB1bmNhY2hlZCByZXNvdXJjZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VW5jYWNoZWRVUklzKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nW10pdW5jYWNoZWQudG9BcnJheShuZXcgU3RyaW5nW3VuY2FjaGVkLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogQ2xlYXIgdGhlIGxpc3Qgb2YgdW5jYWNoZWQgcmVzb3VyY2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY2xlYXJVbmNhY2hlZFVSSXMoKQotICB7Ci0gICAgdW5jYWNoZWQuY2xlYXIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhbiB1bmNhY2hlZCByZXNvdXJjZSB0byB0aGUgbGlzdCBhbmQgc3RhcnQgdGhlIAotICAgKiB1bmNhY2hlZCBqb2IgaWYgbm90IGFscmVhZHkgc3RhcnRlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFVuY2FjaGVkVVJJKFN0cmluZyB1cmkpCi0gIHsKLQlDYWNoZUpvYi5zdGFydEpvYigpOwotICAgIHVuY2FjaGVkLmFkZCh1cmkpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FjaGUgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4gVGhpcyBtZXRob2QgY3JlYXRlcyBhIGxvY2FsIHZlcnNpb24gb2YgdGhlCi0gICAqIHJlbW90ZSByZXNvdXJjZSBhbmQgYWRkcyB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHRoZSBjYWNoZS4gSWYgdGhlIHJlc291cmNlCi0gICAqIGNhbm5vdCBiZSBhY2Nlc3NlZCBpdCBpcyBub3QgYWRkZWQgYW5kIG51bGwgaXMgcmV0dXJuZWQuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSByZW1vdGUgVVJJIHRvIGNhY2hlLgotICAgKiBAcmV0dXJuIEEgbmV3IENhY2hlRW50cnkgcmVwcmVzZW50aW5nIHRoZSBjYWNoZWQgcmVzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgcmVtb3RlCi0gICAqICAgICAgICAgcmVzb3VyY2UgY291bGQgbm90IGJlIHJldHJpZXZlZC4KLSAgICovCi0gIHByb3RlY3RlZCBDYWNoZUVudHJ5IGNhY2hlUmVzb3VyY2UoU3RyaW5nIHVyaSkKLSAgewotCSAgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gbnVsbDsKLQkgIFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0JICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JICBPdXRwdXRTdHJlYW0gb3MgPSBudWxsOwotCSAgdHJ5Ci0JICB7Ci0JCSAgVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLQkJICBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCSAgY29ubi5jb25uZWN0KCk7Ci0JCSAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgcmVzb3VyY2UgY2FuIGJlIGNhY2hlZC4KLQkJICBpZihjb25uLmdldFVzZUNhY2hlcygpKQotCQkgIHsKLQkJICAgIGlzID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOy8vdXJsLm9wZW5TdHJlYW0oKTsKLQkJICAKLQkJICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOwotCQkJU3RyaW5nIGZpbGVOYW1lID0gcmFuZC5uZXh0SW50KCkgKyBDQUNIRV9FWFRFTlNJT047Ci0JCSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShjYWNoZUxvY2F0aW9uLCBmaWxlTmFtZSk7Ci0JCSAgICAvLyBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgZmlsZSBuYW1lLgotCQkgICAgd2hpbGUoIWZpbGUuY3JlYXRlTmV3RmlsZSgpKQotCQkgICAgewotCQkJICBmaWxlTmFtZSA9IHJhbmQubmV4dEludCgpICsgQ0FDSEVfRVhURU5TSU9OOwotCQkJICBmaWxlID0gbmV3IEZpbGUoY2FjaGVMb2NhdGlvbixmaWxlTmFtZSk7Ci0JCSAgICB9Ci0JCSAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTAyNF07Ci0JCSAgICBpbnQgYnl0ZWxlbmd0aDsKLQkJICAgIHdoaWxlKChieXRlbGVuZ3RoID0gaXMucmVhZChieXRlcykpICE9IC0xKQotCQkgICAgewotCQkJICBvcy53cml0ZShieXRlcywgMCwgYnl0ZWxlbmd0aCk7Ci0JCSAgICB9Ci0JCQlsb25nIGxhc3RNb2RpZmllZCA9IGNvbm4uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCSAgICBsb25nIGV4cGlyYXRpb24gPSBjb25uLmdldEV4cGlyYXRpb24oKTsKLQkJCWlmKGV4cGlyYXRpb24gPT0gMCkKLQkJCXsKLQkJCSAgZXhwaXJhdGlvbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgVElNRU9VVDsKLQkJCX0KLQkJICAgIGNhY2hlRW50cnkgPSBuZXcgQ2FjaGVFbnRyeSh1cmksIGZpbGVOYW1lLCBsYXN0TW9kaWZpZWQsIGV4cGlyYXRpb24pOwotCQkgICAgY2FjaGUucHV0KHVyaSxjYWNoZUVudHJ5KTsKLQkJICB9Ci0KLQkgIH0KLQkgIGNhdGNoKEV4Y2VwdGlvbiB0KQotCSAgewotCQkgIC8vIFB1dCB0aGUgZW50cnkgaW4gdGhlIHVuY2FjaGVkIGxpc3Qgc28gdGhlIHJlc29sdXRpb24gd29yayB3aWxsIG5vdCBiZSBwZXJmb3JtZWQgYWdhaW4uCi0gICAgICAvLyBUT0RPOiBBZGQgaW4gYSB0aW1lb3V0IGZvciB0aGUgbm9uLWxvY2F0ZWQgdXJpcy4KLSAgICAgIGFkZFVuY2FjaGVkVVJJKHVyaSk7Ci0JICB9Ci0JICBmaW5hbGx5Ci0JICB7Ci0JCSAgaWYoaXMgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIHRyeQotCQkJICB7Ci0JCQkgICAgaXMuY2xvc2UoKTsKLQkJCSAgfQotCQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkJICB7Ci0JCQkgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBjbG9zZWQuCi0JCQkgIH0KLQkJICB9Ci0JCSAgaWYob3MgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIHRyeQotCQkJICB7Ci0JCQkgICAgb3MuY2xvc2UoKTsKLQkJCSAgfQotCQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkJICB7Ci0JCQkJLy8gRG8gbm90aGluZyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBjbG9zZWQuIAotCQkJICB9Ci0JCSAgfQotCSAgfQotCSAgcmV0dXJuIGNhY2hlRW50cnk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWZyZXNoIHRoZSBjYWNoZSBlbnRyeSBpZiBuZWNlc3NhcnkuIFRoZSBjYWNoZSBlbnRyeSB3aWxsIGJlIHJlZnJlc2hlZAotICAgKiBpZiB0aGUgcmVtb3RlIHJlc291cmNlIGlzIGFjY2Vzc2libGUgYW5kIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgdGhlCi0gICAqIHJlbW90ZSByZXNvdXJjZSBpcyBncmVhdGVyIHRoYW4gdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUgY2FjaGVkCi0gICAqIHJlc291cmNlLgotICAgKiAKLSAgICogQHBhcmFtIGNhY2hlRW50cnkgVGhlIGNhY2hlIGVudHJ5IHRvIHJlZnJlc2guCi0gICAqIEByZXR1cm4gVGhlIHJlZnJlc2hlZCBjYWNoZSBlbnRyeS4KLSAgICovCi0gIHByb3RlY3RlZCBDYWNoZUVudHJ5IHJlZnJlc2hDYWNoZUVudHJ5KENhY2hlRW50cnkgY2FjaGVFbnRyeSkKLSAgewotCSAgVVJMQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKLQkgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7Ci0JICB0cnkKLQkgIHsKLQkJICBVUkwgdXJsID0gbmV3IFVSTChjYWNoZUVudHJ5LmdldFVSSSgpKTsKLQkJICBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCSAgY29ubi5jb25uZWN0KCk7Ci0JCSAgCi0JCSAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjb25uLmdldExhc3RNb2RpZmllZCgpOwotCSAgICAgIGlmKGxhc3RNb2RpZmllZCA+IGNhY2hlRW50cnkuZ2V0TGFzdE1vZGlmaWVkKCkpCi0JCSAgewotCQkJbG9uZyBleHBpcmF0aW9uID0gY29ubi5nZXRFeHBpcmF0aW9uKCk7Ci0JCSAgICBpZihleHBpcmF0aW9uID09IDApCi0JCQl7Ci0JCQkgIGV4cGlyYXRpb24gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFRJTUVPVVQ7Ci0JCQl9Ci0JCQkKLQkJICAgIGlzID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCi0JCQlTdHJpbmcgbG9jYWxGaWxlID0gY2FjaGVFbnRyeS5nZXRMb2NhbEZpbGUoKTsKLSAgCi0JCSAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShDQUNIRV9QUkVGSVgsIENBQ0hFX1NVRkZJWCk7Ci0JCQl0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKLQotCQkgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0JCSAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJICAgIGludCBieXRlbGVuZ3RoOwotCQkgICAgd2hpbGUoKGJ5dGVsZW5ndGggPSBpcy5yZWFkKGJ5dGVzKSkgIT0gLTEpCi0JCSAgICB7Ci0JCQkgIG9zLndyaXRlKGJ5dGVzLCAwLCBieXRlbGVuZ3RoKTsKLQkJICAgIH0KLQkJCWlzLmNsb3NlKCk7Ci0JCQlvcy5jbG9zZSgpOwotCQkJZGVsZXRlRmlsZShjYWNoZUVudHJ5LmdldFVSSSgpKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKGNhY2hlTG9jYXRpb24sIGxvY2FsRmlsZSk7Ci0JCQl0ZW1wRmlsZS5yZW5hbWVUbyhmKTsKLQkJCWNhY2hlRW50cnkuc2V0RXhwaXJhdGlvbihleHBpcmF0aW9uKTsKLQkJCWNhY2hlRW50cnkuc2V0TGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7Ci0JCSAgfQotCQkgIC8vIFRoZSBjYWNoZSBlbnRyeSBoYXNuJ3QgY2hhbmdlZC4gSnVzdCB1cGRhdGUgdGhlIGV4cGlyYXRpb24gdGltZS4KLQkgICAgICBlbHNlCi0JCSAgewotCQkJbG9uZyBleHBpcmF0aW9uID0gY29ubi5nZXRFeHBpcmF0aW9uKCk7Ci0JCQlpZihleHBpcmF0aW9uID09IDApCi0JCQl7Ci0JCQkgIGV4cGlyYXRpb24gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFRJTUVPVVQ7Ci0JCQl9Ci0JCQljYWNoZUVudHJ5LnNldEV4cGlyYXRpb24oZXhwaXJhdGlvbik7Ci0JCSAgfQotCi0JICB9Ci0JICBjYXRjaChFeGNlcHRpb24gZSkKLQkgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcuCi0JICB9Ci0JICBmaW5hbGx5Ci0JICB7Ci0JCSAgaWYoaXMgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIHRyeQotCQkJICB7Ci0JCQkgICAgaXMuY2xvc2UoKTsKLQkJCSAgfQotCQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkJICB7Ci0JCQkgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBjbG9zZWQuCi0JCQkgIH0KLQkJICB9Ci0JCSAgaWYob3MgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIHRyeQotCQkJICB7Ci0JCQkgICAgb3MuY2xvc2UoKTsKLQkJCSAgfQotCQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkJICB7Ci0JCQkJLy8gRG8gbm90aGluZyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBjbG9zZWQuIAotCQkJICB9Ci0JCSAgfQotCSAgfQotCSAgcmV0dXJuIGNhY2hlRW50cnk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIGNhY2hlZCBVUklzLgotICAgKiAKLSAgICogQHJldHVybiBBbiBhcnJheSBvZiB0aGUgY2FjaGVkIFVSSXMuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2FjaGVkVVJJcygpCi0gIHsKLQlTZXQga2V5c2V0ID0gY2FjaGUua2V5U2V0KCk7Ci0JcmV0dXJuIChTdHJpbmdbXSlrZXlzZXQudG9BcnJheShuZXcgU3RyaW5nW2tleXNldC5zaXplKCldKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENsb3NlIHRoZSBjYWNoZS4gQ2xvc2luZyB0aGUgY2FjaGUgaW52b2x2ZXMgc2VyaWFsaXppbmcgdGhlIGRhdGEgdG8gYW4gWE1MIGZpbGUKLSAgICogaW4gdGhlIHBsdWdpbiBzdGF0ZSBsb2NhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNsb3NlKCkKLSAgewotCSAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgdHJ5IHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICBEb2N1bWVudCBjYWNoZWRvYyA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLQkJRWxlbWVudCByb290ZWxlbSA9IGNhY2hlZG9jLmNyZWF0ZUVsZW1lbnQoQ0FDSEUpOwotCQljYWNoZWRvYy5hcHBlbmRDaGlsZChyb290ZWxlbSk7Ci0JCQotCSAgRW51bWVyYXRpb24gdXJpcyA9IGNhY2hlLmtleXMoKTsKLQkgIHdoaWxlKHVyaXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JICB7Ci0JCSAgU3RyaW5nIGtleSA9IChTdHJpbmcpdXJpcy5uZXh0RWxlbWVudCgpOwotCQkgIENhY2hlRW50cnkgY2FjaGVFbnRyeSA9IChDYWNoZUVudHJ5KWNhY2hlLmdldChrZXkpOwotCQkgIGlmKGNhY2hlRW50cnkgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIEVsZW1lbnQgZW50cnkgPSBjYWNoZWRvYy5jcmVhdGVFbGVtZW50KEVOVFJZKTsKLQkJCSAgZW50cnkuc2V0QXR0cmlidXRlKFVSSSwga2V5KTsKLQkJCSAgZW50cnkuc2V0QXR0cmlidXRlKExPQ0FUSU9OLCBjYWNoZUVudHJ5LmdldExvY2FsRmlsZSgpKTsKLQkJCSAgZW50cnkuc2V0QXR0cmlidXRlKEVYUElSQVRJT05fVElNRSwgU3RyaW5nLnZhbHVlT2YoY2FjaGVFbnRyeS5nZXRFeHBpcmF0aW9uVGltZSgpKSk7Ci0JCQkgIGVudHJ5LnNldEF0dHJpYnV0ZShMQVNUX01PRElGSUVELCBTdHJpbmcudmFsdWVPZihjYWNoZUVudHJ5LmdldExhc3RNb2RpZmllZCgpKSk7Ci0JCQkgIHJvb3RlbGVtLmFwcGVuZENoaWxkKGVudHJ5KTsKLQkJICB9Ci0JICB9Ci0JICAKLQkgIC8vIFdyaXRlIHRoZSBjYWNoZSBlbnRyeS4KLQkgIFRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSAgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgIFNvdXJjZSBpbnB1dCA9IG5ldyBET01Tb3VyY2UoY2FjaGVkb2MpOwotCSAgSVBhdGggc3RhdGVMb2NhdGlvbiA9IFBsYXRmb3JtLmdldFN0YXRlTG9jYXRpb24oQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpKTsKLSAgICAgIFJlc3VsdCBvdXRwdXQgPSBuZXcgU3RyZWFtUmVzdWx0KHN0YXRlTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIENBQ0hFX0ZJTEUpOwotICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGlucHV0LCBvdXRwdXQpOwotCi0gICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpCi0JICB7Ci0JCSAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gc3RvcmUgaW50ZXJuZXQgY2FjaGUuIik7Ci0JICB9Ci0JICBjYWNoZUluc3RhbmNlID0gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIE9wZW4gdGhlIGNhY2hlLiBPcGVuaW5nIHRoZSBjYWNoZSBpbnZvbHZlcyBwYXJzaW5nIHRoZSBjYWNoZSBYTUwgZmlsZSBpbgotICAgKiB0aGUgcGx1Z2luIHN0YXRlIGxvY2F0aW9uIGlmIGl0IGNhbiBiZSByZWFkLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIG9wZW4oSVBhdGggY2FjaGVMb2NhdGlvbikKLSAgewotICAgIGNhY2hlSW5zdGFuY2UgPSBuZXcgQ2FjaGUoY2FjaGVMb2NhdGlvbik7Ci0JICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICB0cnkgewotCQkgIAotCQlJUGF0aCBzdGF0ZUxvY2F0aW9uID0gY2FjaGVMb2NhdGlvbjsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICBEb2N1bWVudCBjYWNoZWRvYyA9IGJ1aWxkZXIucGFyc2Uoc3RhdGVMb2NhdGlvbi50b1N0cmluZygpICsgIi8iICsgQ0FDSEVfRklMRSk7Ci0JCUVsZW1lbnQgcm9vdGVsZW0gPSBjYWNoZWRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJTm9kZUxpc3QgZW50cmllcyA9IHJvb3RlbGVtLmdldENoaWxkTm9kZXMoKTsKLQkJaW50IG51bUVudHJpZXMgPSBlbnRyaWVzLmdldExlbmd0aCgpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSsrKQotCQl7Ci0JCQlOb2RlIGVudHJ5ID0gZW50cmllcy5pdGVtKGkpOwotCQkJaWYoZW50cnkgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJewotCQkJCUVsZW1lbnQgZSA9IChFbGVtZW50KWVudHJ5OwotCQkJCWlmKGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoRU5UUlkpKQotCQkJCXsKLQkJCQkJU3RyaW5nIHVyaSA9IGUuZ2V0QXR0cmlidXRlKFVSSSk7Ci0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IGUuZ2V0QXR0cmlidXRlKExPQ0FUSU9OKTsKLQkJCQkJU3RyaW5nIGxtID0gZS5nZXRBdHRyaWJ1dGUoTEFTVF9NT0RJRklFRCk7Ci0JCQkJCVN0cmluZyBldCA9IGUuZ2V0QXR0cmlidXRlKEVYUElSQVRJT05fVElNRSk7Ci0JCQkJCWxvbmcgbGFzdE1vZGlmaWVkID0gLTE7Ci0JCQkJCWxvbmcgZXhwaXJhdGlvblRpbWUgPSAtMTsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCWxhc3RNb2RpZmllZCA9IExvbmcucGFyc2VMb25nKGxtKTsKLQkJCQkJfQotCQkJCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotCQkJCQl7Ci0JCQkJCX0KLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCWV4cGlyYXRpb25UaW1lID0gTG9uZy5wYXJzZUxvbmcoZXQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpCi0JCQkJCXsKLQkJCQkJfQotCQkJCQlpZih1cmkgIT0gbnVsbCAmJiBsb2NhdGlvbiAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCSAgY2FjaGVJbnN0YW5jZS5jYWNoZS5wdXQodXJpLCBuZXcgQ2FjaGVFbnRyeSh1cmksIGxvY2F0aW9uLCBsYXN0TW9kaWZpZWQsIGV4cGlyYXRpb25UaW1lKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICAgIH0KLQkgIGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotCSAgewotCQkvLyBJZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uIHRoZXJlIGlzIG5vdGhpbmcgdG8gbG9hZC4gRG8gbm90aGluZy4KLQkgIH0KLQkgIGNhdGNoKEV4Y2VwdGlvbiBlKQotCSAgewotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGxvYWQgY2FjaGUuIik7Ci0JICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDbGVhciBhbGwgb2YgdGhlIGVudHJpZXMgZnJvbSB0aGUgY2FjaGUuIFRoaXMgbWV0aG9kIGFsc28gZGVsZXRlcyB0aGUgY2FjaGUgZmlsZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gIHsKLQlFbnVtZXJhdGlvbiBrZXlzID0gY2FjaGUua2V5cygpOwotCXdoaWxlKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JewotCSAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOwotCSAgCi0JICBkZWxldGVGaWxlKGtleSk7Ci0JfQotCWNhY2hlLmNsZWFyKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZWxldGUgdGhlIGNhY2hlIGVudHJ5IHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gVVJJLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgZW50cnkgdG8gcmVtb3ZlIGZyb20gdGhlIGNhdGFsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkZWxldGVFbnRyeShTdHJpbmcgdXJpKQotICB7Ci0JICBpZih1cmkgPT0gbnVsbCkgcmV0dXJuOwotCSAgCi0JICBkZWxldGVGaWxlKHVyaSk7Ci0JICBjYWNoZS5yZW1vdmUodXJpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIERlbGV0ZSB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIFVSSS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byBkZWxldGUuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVGaWxlKFN0cmluZyB1cmkpCi0gIHsKLQkgIENhY2hlRW50cnkgY2FjaGVFbnRyeSA9IChDYWNoZUVudHJ5KWNhY2hlLmdldCh1cmkpOwotCSAgaWYoY2FjaGVFbnRyeSAhPSBudWxsKQotCSAgewotCQlTdHJpbmcgbG9jYXRpb24gPSBjYWNoZUxvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBjYWNoZUVudHJ5LmdldExvY2FsRmlsZSgpOwotCSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbik7Ci0JICAgIGlmKCFmaWxlLmRlbGV0ZSgpKQotCSAgICB7Ci0JICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgIiArIGxvY2F0aW9uICsgIiBmcm9tIGNhY2hlLiIpOwotCSAgICB9IAotCSAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3ZWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi0vKioKLSAqIEEgY2FjaGUgZW50cnkgY29udGFpbnMgYSBVUkksIGEgbG9jYWwgZmlsZSwgYW5kIGEgdGltZW91dC4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlRW50cnkgCi17Ci0gIHByaXZhdGUgU3RyaW5nIHVyaTsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxGaWxlOwotICBwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkOwotICBwcml2YXRlIGxvbmcgZXhwaXJhdGlvblRpbWU7Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGNhY2hlIGVudHJ5LgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgcmVtb3RlIFVSSSBvZiB0aGUgY2FjaGUgZW50cnkuCi0gICAqIEBwYXJhbSBsb2NhbEZpbGUgVGhlIGxvY2FsIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2FjaGVkIGVudHJ5LgotICAgKiBAcGFyYW0gbGFzdE1vZGlmaWUgVGhlIHRpbWUgdGhpcyByZXNvdXJjZSB3YXMgbGFzdCBtb2RpZmllZC4KLSAgICogQHBhcmFtIGV4cGlyYXRpb25UaW1lIFRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgdGhpcyBjYWNoZSBlbnRyeSB3aWxsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBleHBpcmUuCi0gICAqLwotICBwdWJsaWMgQ2FjaGVFbnRyeShTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxGaWxlLCBsb25nIGxhc3RNb2RpZmllZCwgbG9uZyBleHBpcmF0aW9uVGltZSkKLSAgewotCXRoaXMudXJpID0gdXJpOwotCXRoaXMubG9jYWxGaWxlID0gbG9jYWxGaWxlOwotCXRoaXMubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotCXRoaXMuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoZSBjYWNoZSBlbnRyeSBpcyBleHBpcmVkIGlmIGl0cyBleHBpcmF0aW9uIHRpbWUgaXMgbGVzcyB0aGVuIHRoZQotICAgKiBjdXJyZW50IHN5c3RlbSB0aW1lIGFuZCBub3QgZXF1YWwgdG8gLTEuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBjYWNoZWQgZW50cnkgaGFzIGV4cGlyZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0V4cGlyZWQoKQotICB7Ci0JIGlmKGV4cGlyYXRpb25UaW1lICE9IC0xICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpID4gZXhwaXJhdGlvblRpbWUpCi0JIHsKLQkgICByZXR1cm4gdHJ1ZTsKLQkgfQotCSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCB0aGlzIGNhY2hlIGVudHJ5IHdpbGwgZXhwaXJlLgotICAgKiAKLSAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCB0aGlzIGNhY2hlIGVudHJ5IHdpbGwgZXhwaXJlLgotICAgKiAgICAgICAgICAgICAgICAtMSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGVudHJ5IHdpbGwgbm90IGV4cGlyZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4cGlyYXRpb24obG9uZyBleHBpcmF0aW9uVGltZSkKLSAgewotCXRoaXMuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgdGltZSBhdCB3aGljaCB0aGlzIGNhY2hlIGVudHJ5IHdpbGwgZXhwaXJlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgdGltZSBhdCB3aGljaCB0aGlzIGNhY2hlIGVudHJ5IHdpbGwgZXhwaXJlLgotICAgKi8KLSAgcHVibGljIGxvbmcgZ2V0RXhwaXJhdGlvblRpbWUoKQotICB7Ci0JcmV0dXJuIGV4cGlyYXRpb25UaW1lOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSByZW1vdGUgVVJJIGZvciB0aGlzIGNhY2hlIGVudHJ5LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgcmVtb3RlIFVSSSBmb3IgdGhpcyBjYWNoZSBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotCXJldHVybiB1cmk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxvY2FsIGZpbGUgZm9yIHRoaXMgY2FjaGUgZW50cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsb2NhbCBmaWxlIGZvciB0aGlzIGNhY2hlIGVudHJ5LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhbEZpbGUoKQotICB7Ci0JcmV0dXJuIGxvY2FsRmlsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGFzdCB0aW1lIHRoaXMgY2FjaGUgZW50cnkgd2FzIG1vZGlmaWVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGFzdCB0aW1lIHRoaXMgY2FjaGUgZW50cnkgd2FzIG1vZGlmaWVkLgotICAgKi8KLSAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkKLSAgewotCXJldHVybiBsYXN0TW9kaWZpZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIGxhc3QgdGltZSB0aGlzIGNhY2hlIGVudHJ5IHdhcyBtb2RpZmllZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChsb25nIGxhc3RNb2RpZmllZCkKLSAgewotCXRoaXMubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlSm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YzM5NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotCi0vKioKLSAqIEEgY2FjaGUgam9iIHJ1bnMgb25jZSBhbiBob3VyIHRvIGNhY2hlIGFueSBwcmVzcGVjaWZpZWQgcmVzb3VyY2VzIHdoaWNoCi0gKiBzaG91bGQgYmUgY2FjaGVkIGFuZCBhbnkgcmVzb3VyY2VzIGZvciB3aGljaCBhbiBhdHRlbXB0IHdhcyBwcmV2aW91c2x5IAotICogbWFkZSB0byBjYWNoZSB0aGVtIGJ1dCB0aGV5IHdlcmUgdW5hYmxlIHRvIGJlIGNhY2hlZC4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlSm9iIGV4dGVuZHMgSm9iCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0NIRURVTEVfVElNRSA9IDM2MDAwMDA7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgQ2FjaGVKb2Igam9iID0gbnVsbDsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIENhY2hlSm9iKCkKLSAgewotICAgIHN1cGVyKENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX01PTklUT1JfTkFNRSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgKi8KLSAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgewotCWJvb2xlYW4gYWxsU3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgQ2FjaGUgY2FjaGUgPSBDYWNoZS5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZ1tdIHVuY2FjaGVkVVJJcyA9IGNhY2hlLmdldFVuY2FjaGVkVVJJcygpOwotICAgIGludCBudW1VbmNhY2hlZFVSSXMgPSB1bmNhY2hlZFVSSXMubGVuZ3RoOwotCi0gICAgY2FjaGUuY2xlYXJVbmNhY2hlZFVSSXMoKTsKLSAgICBtb25pdG9yLmJlZ2luVGFzayhDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9NT05JVE9SX05BTUUsIG51bVVuY2FjaGVkVVJJcyk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bVVuY2FjaGVkVVJJczsgaSsrKQotICAgICAgewotICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IoaW50IGogPSBpOyBqIDwgbnVtVW5jYWNoZWRVUklzOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgY2FjaGUuYWRkVW5jYWNoZWRVUkkodW5jYWNoZWRVUklzW2pdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB1cmkgPSB1bmNhY2hlZFVSSXNbaV07Ci0gICAgICAgIG1vbml0b3Iuc2V0VGFza05hbWUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfTU9OSVRPUl9DQUNISU5HLCBuZXcgT2JqZWN0W117dXJpfSkpOwotICAgICAgIAotICAgICAgICBTdHJpbmcgY2FjaGVkVVJJID0gY2FjaGUuZ2V0UmVzb3VyY2UodXJpKTsKLSAgICAgICAgaWYoY2FjaGVkVVJJID09IG51bGwpCi0gICAgCXsKLSAgICAJICBhbGxTdWNjZXNzZnVsID0gZmFsc2U7Ci0gICAgCX0KLSAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICB9Ci0gICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0gCi0gICAgZmluYWxseQotICAgIHsKLSAgICAgIC8vIElmIGFsbCB0aGUgdW5jYWNoZWQgVVJJcyBjb3VsZCBub3QgYmUgY2FjaGVkIAotICAgICAgLy8gc2NoZWR1bGUgdGhlIG5leHQgdGltZSB0aGUgam9iIHNob3VsZCBydW4uCi0gICAgICBpZighYWxsU3VjY2Vzc2Z1bCkKLSAgICAgIHsKLSAgICAJICBzdGFydEpvYihTQ0hFRFVMRV9USU1FKTsgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogU3RhcnQgdGhlIGNhY2hlIGpvYi4gVGhlIGNhY2hlIGpvYiBjYWNoZXMgcmVzb3VyY2VzIHRoYXQgd2VyZSBub3QgYWJsZSB0byBiZSBwcmV2aW91c2x5Ci0gICAqIGRvd25sb2FkZWQuIE9ubHkgb25lIGpvYiBpcyBydW4gYXQgYSB0aW1lLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHN0YXJ0Sm9iKCkgCi0gIHsKLQlpZihqb2IgPT0gbnVsbCkKLQl7Ci0JICBzdGFydEpvYigwKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTdGFydCBhIG5ldyBjYWNoZSBqb2Igd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGF5LgotICAgKiAKLSAgICogQHBhcmFtIGRlbGF5Ci0gICAqIAkJVGhlIHN0YXJ0IGRlbGF5IGZvciB0aGUgY2FjaGUgam9iLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzdGFydEpvYihsb25nIGRlbGF5KQotICB7Ci0Jam9iID0gbmV3IENhY2hlSm9iKCk7Ci0Jam9iLnNldFByaW9yaXR5KENhY2hlSm9iLkRFQ09SQVRFKTsKLQlqb2Iuc2NoZWR1bGUoZGVsYXkpOyAvLyBzdGFydCBhcyBzb29uIGFzIHBvc3NpYmxlCi0gIH0KLQotICAvKioKLSAgICogU3RvcCB0aGUgY3VycmVudCBjYWNoZSBqb2IuIFRoZSBjYWNoZSBqb2IgY2FjaGVzIHJlc291cmNlcyB0aGF0IHdlcmUgbm90IGFibGUgdG8gYmUgcHJldmlvdXNseQotICAgKiBkb3dubG9hZGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHN0b3BKb2IoKSAKLSAgewotCWlmIChqb2IgIT0gbnVsbCkgCi0JewotCSAgam9iLmNhbmNlbCgpOwotCX0KLQlqb2IgPSBudWxsOwotICB9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZlZTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSB0aGUgY2FjaGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ09ORklSTV9DTEVBUl9DQUNIRV9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ09ORklSTV9ERUxFVEVfQ0FDSEVfRU5UUllfRElBTE9HX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9DTEVBUl9DQUNIRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQlVUVE9OX0RFTEVURV9FTlRSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9DQUNIRV9FTlRSSUVTX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUkVGX0NBQ0hFX0NBQ0hFX09QVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9DQUNIRV9BQk9VVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9QUk9NUFRfRk9SX0RJU0FHUkVFRF9MSUNFTlNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfTU9OSVRPUl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9NT05JVE9SX0NBQ0hJTkc7Ci0KLQkvLyBDYWNoZSBsaWNlbnNlIGRpYWxvZwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyX05PX0lOVEVSTkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyX05PX0JST1dTRVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX0RJQUxPR19BR1JFRV9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX0RJQUxPR19ESVNBR1JFRV9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTE9BRElOR19MSUNFTlNFOwotCi0JLy8gQ2FjaGUgbG9nZ2luZyBtZXNzYWdlcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9MT0dfSU5GT19XVFBfTk9fVVNFUl9JTlRFUkFDVElPTjsKLQotCS8vIFdUUCB0ZXN0IG5vIHVzZXIgaW50ZXJhY3Rpb24gc3lzdGVtIHByb3BlcnR5Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQX05PX1VTRVJfSU5URVJBQ1RJT05fU1lTVEVNX1BST1A7ICAgCi0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ2FjaGVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoZU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0ZjBlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gCi17Ci0gIC8qKgotICAgKiBUaGUgSUQgb2YgdGhpcyBwbHVnaW4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlIjsKLQotICAvKioKLSAgICogVGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIENhY2hlUGx1Z2luIHBsdWdpbjsKLQotICAvKioKLSAgICogVGhlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIENhY2hlUGx1Z2luKCkgCi0gIHsKLQlzdXBlcigpOwotCXBsdWdpbiA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0Jc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyLmdldEluc3RhbmNlKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JQ2FjaGUub3BlbihQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKGdldEJ1bmRsZSgpKSk7Ci0JaWYgKGdldFBsdWdpblByZWZlcmVuY2VzKCkuY29udGFpbnMoUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVEKSkgCi0JewotCSAgc2V0Q2FjaGVFbmFibGVkKGdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQpKTsKLQl9IAotCWVsc2UgCi0JewotCSAgLy8gVGhlIGNhY2hlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0JICBzZXRDYWNoZUVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQkvLyBSZXN0b3JlIGxpY2Vuc2UgcHJlZmVyZW5jZXMKLQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JTGljZW5zZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTGljZW5zZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JU3RyaW5nW10gbGljZW5zZXMgPSByZWdpc3RyeS5nZXRMaWNlbnNlcygpOwotCWludCBudW1MaWNlbnNlcyA9IGxpY2Vuc2VzLmxlbmd0aDsKLQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtTGljZW5zZXM7IGkrKykKLQl7Ci0JICBpbnQgc3RhdGUgPSBwcmVmcy5nZXRJbnQobGljZW5zZXNbaV0pOwotCSAgaWYoc3RhdGUgPT0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfQUdSRUUuaW50VmFsdWUoKSkKLQkgIHsKLQkJcmVnaXN0cnkuYWdyZWVMaWNlbnNlKGxpY2Vuc2VzW2ldKTsKLQkgIH0KLQkgIGVsc2UgaWYoc3RhdGUgPT0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfRElTQUdSRUUuaW50VmFsdWUoKSkKLQkgIHsKLQkJcmVnaXN0cnkuZGlzYWdyZWVMaWNlbnNlKGxpY2Vuc2VzW2ldKTsKLQkgIH0KLQl9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotCS8vIFNhdmUgdGhlIGxpY2Vuc2Ugc3RhdGUgaW5mb3JtYXRpb24uCi0JUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCUxpY2Vuc2VSZWdpc3RyeSByZWdpc3RyeSA9IExpY2Vuc2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCVN0cmluZ1tdIGxpY2Vuc2VzID0gcmVnaXN0cnkuZ2V0TGljZW5zZXMoKTsKLQlpbnQgbnVtTGljZW5zZXMgPSBsaWNlbnNlcy5sZW5ndGg7Ci0JZm9yKGludCBpID0gMDsgaSA8IG51bUxpY2Vuc2VzOyBpKyspCi0JewotCSAgSW50ZWdlciBzdGF0ZSA9IHJlZ2lzdHJ5LmdldExpY2Vuc2VTdGF0ZShsaWNlbnNlc1tpXSk7Ci0gICAgICAvLyBGb3Igc3RhdGVzIHRoYXQgaGF2ZSBiZWVuIGRpc2FncmVlZCB0byB0aGlzIHNlc3Npb24gc3RvcmUKLQkgIC8vIHRoZW0gYXMgZGlzYWdyZWUuCi0JICBpZihzdGF0ZSA9PSBMaWNlbnNlUmVnaXN0cnkuTElDRU5TRV9ESVNBR1JFRV9USElTX1NFU1NJT04pCi0JICB7Ci0JCXN0YXRlID0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfRElTQUdSRUU7Ci0JICB9Ci0JICBwcmVmcy5zZXRWYWx1ZShsaWNlbnNlc1tpXSwgc3RhdGUuaW50VmFsdWUoKSk7Ci0JfQotCQotCUNhY2hlLmdldEluc3RhbmNlKCkuY2xvc2UoKTsKLQlDYWNoZUpvYi5zdG9wSm9iKCk7Ci0Jc3VwZXIuc3RvcChjb250ZXh0KTsKLQlwbHVnaW4gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ2FjaGVQbHVnaW4gZ2V0RGVmYXVsdCgpIAotICB7Ci0JcmV0dXJuIHBsdWdpbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBvciBub3QgdGhlIGNhY2hlIGlzIGVuYWJsZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZW5hYmxlZCBJZiB0cnVlIHRoZSBjYWNoZSBpcyBlbmFibGVkLCBpZiBmYWxzZSBpdCBpcyBub3QgZW5hYmxlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENhY2hlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIAotICB7Ci0JZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQsIGVuYWJsZWQpOwotCUNhY2hlSm9iLnN0b3BKb2IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNhY2hlIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2FjaGUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDYWNoZUVuYWJsZWQoKSAKLSAgewotCWlmIChnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmNvbnRhaW5zKFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCkpCi0JICByZXR1cm4gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCk7Ci0JcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBvciBub3QgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIGZvciBsaWNlbnNlcyB0byB3aGljaCB0aGV5IAotICAgKiBoYXZlIHByZXZpb3VzbHkgZGlzYWdyZWVkLgotICAgKiAKLSAgICogQHBhcmFtIHByb21wdCBJZiB0cnVlIHRoZSB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQsIGlmIGZhbHNlIHRoZSB1c2VyIHNob3VsZCBub3QgYmUgcHJvbXB0ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9tcHREaXNhZ3JlZWRMaWNlbnNlcyhib29sZWFuIHByb21wdCkgCi0gIHsKLQlnZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFByZWZlcmVuY2VDb25zdGFudHMuUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUywgcHJvbXB0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCBmb3IgbGljZW5zZXMgdG8gd2hpY2ggdGhleQotICAgKiBoYXZlIHByZXZpb3VzbHkgZGlzYWdyZWVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRQcm9tcHQoKSAKLSAgewotCWlmIChnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmNvbnRhaW5zKFByZWZlcmVuY2VDb25zdGFudHMuUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUykpCi0JICByZXR1cm4gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUyk7Ci0JcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjODgxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ2FjaGUgcHJlZmVyZW5jZSBwYWdlIHN0cmluZ3MuCi1fVUlfQ09ORklSTV9DTEVBUl9DQUNIRV9ESUFMT0dfVElUTEUgICAgICAgICAgICAgPSBSZW1vdmUgQWxsPwotX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX01FU1NBR0UgICAgICAgICAgID0gUmVtb3ZlIGFsbCBjYWNoZSBlbnRyaWVzPwotX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19USVRMRSAgICAgID0gUmVtb3ZlIEVudHJpZXM/Ci1fVUlfQ09ORklSTV9ERUxFVEVfQ0FDSEVfRU5UUllfRElBTE9HX01FU1NBR0UgICAgPSBSZW1vdmUgYWxsIHNlbGVjdGVkIGNhY2hlIGVudHJpZXM/Ci1fVUlfQlVUVE9OX0NMRUFSX0NBQ0hFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBSZW1vdmUgJkFsbAotX1VJX0JVVFRPTl9ERUxFVEVfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgID0gJlJlbW92ZQotX1VJX1BSRUZfQ0FDSEVfRU5UUklFU19USVRMRSAgICAgICAgICAgICAgICAgICAgID0gJkNhY2hlIGVudHJpZXM6Ci1fVUlfUFJFRl9DQUNIRV9DQUNIRV9PUFRJT04gICAgICAgICAgICAgICAgICAgICAgPSAmRGlzYWJsZSBjYWNoaW5nCi1fVUlfUFJFRl9DQUNIRV9BQk9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBNYW5hZ2UgdGhlIGNhY2hlIG9mIHJlbW90ZSByZXNvdXJjZXMsIHN1Y2ggYXMgdGhvc2UgZG93bmxvYWRlZCBmcm9tIHRoZSBpbnRlcm5ldC4KLV9VSV9QUkVGX1BST01QVF9GT1JfRElTQUdSRUVEX0xJQ0VOU0VTICAgICAgICAgICA9ICZQcm9tcHQgbWUgZm9yIGFncmVlbWVudCBmb3IgbGljZW5zZXMgZm9yIHdob3NlIHRlcm1zIEkgaGF2ZSBhbHJlYWR5IGRpc2FncmVlZAotCi0jIENhY2hlIG1vbml0b3Igc3RyaW5ncy4KLV9VSV9DQUNIRV9NT05JVE9SX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IENhY2hpbmcgUmVtb3RlIFJlc291cmNlcwotX1VJX0NBQ0hFX01PTklUT1JfQ0FDSElORyAgICAgICAgICAgICAgICAgICAgICAgID0gQ2FjaGluZyB7MH0KLQotIyBDYWNoZSBsaWNlbnNlIGRpYWxvZwotX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDEgICAgICAgICAgICAgID0gQSByZXF1ZXN0IGhhcyBiZWVuIG1hZGUgdG8gY2FjaGUgdGhlIHJlc291cmNlOgotX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDIgICAgICAgICAgICAgID0gSW4gb3JkZXIgdG8gY2FjaGUgdGhlIHJlc291cmNlIHlvdSBtdXN0IGFncmVlIHRvIHRoZSBsaWNlbnNlIGJlbG93OgotX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDJfTk9fSU5URVJOQUwgID0gSW4gb3JkZXIgdG8gY2FjaGUgdGhlIHJlc291cmNlIHlvdSBtdXN0IGFncmVlIHRvIHRoZSBsaWNlbnNlIHdoaWNoIGhhcyBiZWVuIG9wZW5lZCBpbiB5b3VyIGJyb3dzZXIuCi1fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19CUk9XU0VSICAgPSBUaGUgbGljZW5zZSBjYW5ub3QgYmUgZGlzcGxheWVkIGluIHRoaXMgZGlhbG9nLiBJbiBvcmRlciB0byBjYWNoZSB0aGUgcmVzb3VyY2UgeW91IG11c3QgYWdyZWUgdG8gdGhlIGxpY2Vuc2UgbG9jYXRlZCBhdCB7MH0uCi1fVUlfQ0FDSEVfRElBTE9HX0FHUkVFX0JVVFRPTiAgICAgICAgICAgICAgICAgICAgPSBJIEFncmVlCi1fVUlfQ0FDSEVfRElBTE9HX0RJU0FHUkVFX0JVVFRPTiAgICAgICAgICAgICAgICAgPSBJIERpc2FncmVlCi1fVUlfQ0FDSEVfRElBTE9HX1RJVExFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMaWNlbnNlIEFncmVlbWVudAotX1VJX0xPQURJTkdfTElDRU5TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTG9hZGluZyBsaWNlbnNlCi0KLSMgQ2FjaGUgbG9nZ2luZyBtZXNzYWdlcwotX0xPR19JTkZPX1dUUF9OT19VU0VSX0lOVEVSQUNUSU9OICAgICAgICAgICAgICAgID0gezB9IGlzIHNldC4gTGljZW5zZXMgZGlhbG9ncyB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQuCi0KLSMgV1RQIHRlc3Qgbm8gdXNlciBpbnRlcmFjdGlvbiBzeXN0ZW0gcHJvcGVydHkKLSMgVGhpcyBwcm9wZXJ0eSBpcyBjaGVja2VkIGJ5IHRoZSBjYWNoZS4gVGhpcyBzdGluZyBpcyBub3Qgc2hvd24gdG8gdGhlIHVzZXIuCi1XVFBfTk9fVVNFUl9JTlRFUkFDVElPTl9TWVNURU1fUFJPUCAgICAgICAgICAgICAgPSB3dHAuYXV0b3Rlc3Qubm9uaW50ZXJhY3RpdmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjUxOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLQotLyoqCi0gKiBBIGNhY2hlIFVSSSByZXNvbHZlci4gVGhpcyByZXNvbHZlciB3aWxsIGNhY2hlIHJlbW90ZSByZXNvdXJjZXMgYW5kIHJldHVybgotICogdGhlIGxvY2FsIGNvcHkgaWYgdGhleSBjYW4gYmUgY2FjaGVkLiBJZiBhIHJlc291cmNlIGNhbm5vdCBiZSBjYWNoZWQgdGhlCi0gKiByZXNvdXJjZSByZXR1cm5zIG51bGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uIGltcGxlbWVudHMgVVJJUmVzb2x2ZXJFeHRlbnNpb24gCi17Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uI3Jlc29sdmUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlKElGaWxlIGZpbGUsIFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotCXsgCi0gICAgICBpZihDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuaXNDYWNoZUVuYWJsZWQoKSkKLSAgICAgIHsKLQkJICBTdHJpbmcgcmVzb3VyY2UgPSBudWxsOwotCQkgIGlmKHN5c3RlbUlkICE9IG51bGwpCi0JCSAgewotCQkgICAgcmVzb3VyY2UgPSBVUklIZWxwZXIubm9ybWFsaXplKHN5c3RlbUlkLCBiYXNlTG9jYXRpb24sIG51bGwpOwotCQkgIH0gCi0JCSAgCi0JCSAgaWYocmVzb3VyY2UgIT0gbnVsbCAmJiAocmVzb3VyY2Uuc3RhcnRzV2l0aCgiaHR0cDoiKSB8fCByZXNvdXJjZS5zdGFydHNXaXRoKCJmdHA6IikpKQotCQkgIHsKLQkJICAgIC8vIEhhbmRsZSByZXNvdXJjZXMgcHJlc3BlY2lmaWVkIHRvIGNhY2hlLgotCQkgICAgVG9DYWNoZVJlc291cmNlIHRvQ2FjaGVSZXNvdXJjZSA9IFRvQ2FjaGVSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlVG9DYWNoZShyZXNvdXJjZSk7Ci0JCSAgICBpZih0b0NhY2hlUmVzb3VyY2UgPT0gbnVsbCB8fCBMaWNlbnNlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5oYXNMaWNlbnNlQmVlbkFjY2VwdGVkKHJlc291cmNlLCB0b0NhY2hlUmVzb3VyY2UuZ2V0TGljZW5zZSgpKSkKLQkJICAgIHsgCQotCQkgICAgICByZXR1cm4gQ2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCSAgICB9Ci0JCSAgfQotICAgICAgfQotCSAgcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWJjM2MxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEEgZGlhbG9nIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBhY2NlcHQgYSBsaWNlbnNlIGFncmVlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nIGV4dGVuZHMgSWNvbkFuZE1lc3NhZ2VEaWFsb2cgCi17Ci0gIC8qKgotICAgKiBIb2xkcyBhbGwgdGhlIGRpYWxvZ3MgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXllZCBrZXllZCBieSB0aGUgbGljZW5zZSBVUkwuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgZGlhbG9nc0luVXNlID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgLyoqCi0gICAqIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdXJsOwotCi0gIC8qKgotICAgKiBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgbGljZW5zZVVSTDsKLSAgCi0gIC8qKgotICAgKiBUaGUgYWdyZWUgYnV0dG9uIGZvciB0aGUgZGlhbG9nLgotICAgKi8KLSAgcHJpdmF0ZSBCdXR0b24gYWdyZWVCdXR0b24gPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoaXMgZGlhbG9nLgotICAgKiBAcGFyYW0gdXJsIFRoZSBsaWNlbnNlIFVSTC4KLSAgICovCi0gIHByb3RlY3RlZCBMaWNlbnNlQWNjZXB0YW5jZURpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB1cmwsIFN0cmluZyBsaWNlbnNlVVJMKSAKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0JdGhpcy51cmwgPSB1cmw7Ci0JdGhpcy5saWNlbnNlVVJMID0gbGljZW5zZVVSTDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSAKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICBzaGVsbC5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19USVRMRSk7Ci0gICAgc2hlbGwuc2V0SW1hZ2UobnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b25CYXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0JQ29tcG9zaXRlIGJ1dHRvbkJhciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMDsKLQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQlidXR0b25CYXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCWJ1dHRvbkJhci5zZXRMYXlvdXREYXRhKGdkKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGFncmVlIGJ1dHRvbi4KLQlhZ3JlZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihidXR0b25CYXIsIExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLk9LLCAKLQkJCUNhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19BR1JFRV9CVVRUT04sIGZhbHNlKTsKLQlhZ3JlZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGRpc2FncmVlIGJ1dHRvbi4KLQljcmVhdGVCdXR0b24oYnV0dG9uQmFyLCBMaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5DQU5DRUwsIAotCQkJQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0RJU0FHUkVFX0JVVFRPTiwgZmFsc2UpOwotCQotCXJldHVybiBidXR0b25CYXI7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCk7Ci0JZ2Qud2lkdGhIaW50ID0gNTAwOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCS8vIERpc3BsYXkgYSBzdGF0ZW1lbnQgYWJvdXQgdGhlIGxpY2Vuc2UuCi0JTGFiZWwgbGljZW5zZVRleHQxID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxpY2Vuc2VUZXh0MS5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDEpOwotCUxhYmVsIHVybFRleHQgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKTsKLQl1cmxUZXh0LnNldExheW91dERhdGEoZ2QpOwotCXVybFRleHQuc2V0VGV4dCh1cmwpOwotCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsgLy8gU3BhY2luZyBsYWJlbC4KLQlMYWJlbCBsaWNlbnNlVGV4dDIgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKTsKLQlsaWNlbnNlVGV4dDIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCi0JLy8gRGlzcGxheSB0aGUgbGljZW5zZSBpbiBhIGJyb3dzZXIuCi0JdHJ5Ci0JewotCSAgZmluYWwgQ29tcG9zaXRlIGxpY2Vuc2VUZXh0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkgIGZpbmFsIFN0YWNrTGF5b3V0IHN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0JICBsaWNlbnNlVGV4dENvbXBvc2l0ZS5zZXRMYXlvdXQoc3RhY2tMYXlvdXQpOwotCSAgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkgIGdkLmhlaWdodEhpbnQgPSA0MDA7Ci0JICBsaWNlbnNlVGV4dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkgIC8vIENyZWF0ZSB0aGUgbG9hZGluZyBwcm9ncmVzcyBtb25pdG9yIGNvbXBvc2l0ZSBhbmQgcGFydC4KLQkgIENvbXBvc2l0ZSBtb25pdG9yQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShsaWNlbnNlVGV4dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCSAgbW9uaXRvckNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JICBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCSAgZ2QuaGVpZ2h0SGludCA9IDQwMDsKLQkgIG1vbml0b3JDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICBmaW5hbCBQcm9ncmVzc01vbml0b3JQYXJ0IG1vbml0b3IgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yUGFydChtb25pdG9yQ29tcG9zaXRlLCBuZXcgR3JpZExheW91dCgpKTsKLQkgIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlKTsKLQkgIG1vbml0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICBtb25pdG9yLmJlZ2luVGFzayhDYWNoZU1lc3NhZ2VzLl9VSV9MT0FESU5HX0xJQ0VOU0UsIDEwMCk7Ci0JICBzdGFja0xheW91dC50b3BDb250cm9sID0gbW9uaXRvckNvbXBvc2l0ZTsKLQkgIC8vIENyZWF0ZSB0aGUgYnJvd3Nlci4KLQkgIGZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKGxpY2Vuc2VUZXh0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkgIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JICAvL2dkLmhlaWdodEhpbnQgPSA0MDA7Ci0JICAKLQkgIC8vIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIGxpY2Vuc2UgVVJMIGlzIHNldCBldmVuIGlmIHdlIHJlYWQgCi0JICAvLyB0aGUgY29udGVudHMgb2YgdGhlIGxpY2Vuc2UgZmlsZSBvdXJzZWx2ZXMgKHNlZSBiZWxvdykgYXMKLQkgIC8vIG90aGVyd2lzZSB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB3aWxsIG5vdCBiZSBjYWxsZWQgb24gY2VydGFpbgotCSAgLy8gbGludXggc3lzdGVtcyB3aXRoIGNlcnRhaW4gYnJvd3NlcnMuCi0JICBicm93c2VyLnNldFVybChsaWNlbnNlVVJMKTsKLQkgIAotCSAgLy8gVGhlIGJyb3dzZXIgd2lkZ2V0IGhhcyBwcm9ibGVtcyBsb2FkaW5nIGZpbGVzIHN0b3JlZCBpbiBqYXJzCi0JICAvLyBzbyB3ZSByZWFkIGZyb20gdGhlIGphciBhbmQgc2V0IHRoZSBicm93c2VyIHRleHQgb3Vyc2VsdmVzLgotCSAgLy8gU2VlIGJ1ZyAxNTQ3MjEuCi0JICBpZihsaWNlbnNlVVJMLnN0YXJ0c1dpdGgoImphcjoiKSkKLQkgIHsKLQkJICBJbnB1dFN0cmVhbSBsaWNlbnNlU3RyZWFtID0gbnVsbDsKLQkJICBJbnB1dFN0cmVhbVJlYWRlciBpc3JlYWRlciA9IG51bGw7Ci0JCSAgQnVmZmVyZWRSZWFkZXIgYnJlYWRlciA9IG51bGw7Ci0JCSAgdHJ5Ci0JCSAgewotCQkgIFVSTCBicm93c2VyVVJMID0gbmV3IFVSTChsaWNlbnNlVVJMKTsKLQkJICBsaWNlbnNlU3RyZWFtID0gYnJvd3NlclVSTC5vcGVuU3RyZWFtKCk7Ci0JCSAgaXNyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobGljZW5zZVN0cmVhbSk7Ci0JCSAgYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3JlYWRlcik7Ci0JCSAgU3RyaW5nIHN0cjsKLQkJICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCSAgd2hpbGUoKHN0ciA9IGJyZWFkZXIucmVhZExpbmUoKSkhPW51bGwpewotCQkgICAgICBzYi5hcHBlbmQoc3RyKTsKLQkJICB9Ci0JCSAgYnJvd3Nlci5zZXRUZXh0KHNiLnRvU3RyaW5nKCkpOwotCQkgIH0KLQkJICBmaW5hbGx5Ci0JCSAgewotCQkJICBpZihsaWNlbnNlU3RyZWFtICE9IG51bGwpCi0JCQkgIHsKLQkJCQkgIGxpY2Vuc2VTdHJlYW0uY2xvc2UoKTsKLQkJCSAgfQotCQkJICBpZihpc3JlYWRlciAhPSBudWxsKQotCQkJICB7Ci0JCQkJICBpc3JlYWRlci5jbG9zZSgpOwotCQkJICB9Ci0JCQkgIGlmKGJyZWFkZXIgIT0gbnVsbCkKLQkJCSAgewotCQkJCSAgYnJlYWRlci5jbG9zZSgpOwotCQkJICB9Ci0JCSAgfQotCSAgfQotCSAgCi0JICBicm93c2VyLnNldExheW91dERhdGEoZ2QpOwotCSAgYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCl7Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXIjY2hhbmdlZChvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0V2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSAKLQkJewotCQkgIGlmIChldmVudC50b3RhbCAhPSAwKQotCQkgIHsKLQkJICAgIG1vbml0b3IuaW50ZXJuYWxXb3JrZWQoZXZlbnQuY3VycmVudCAqIDEwMCAvIGV2ZW50LnRvdGFsKTsKLQkJICB9Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NMaXN0ZW5lciNjb21wbGV0ZWQob3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSAKLQkJewotCQkgIG1vbml0b3IuZG9uZSgpOwotCQkJCi0JCSAgc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGJyb3dzZXI7Ci0JCSAgYWdyZWVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJICBsaWNlbnNlVGV4dENvbXBvc2l0ZS5sYXlvdXQoKTsKLQkJfQotCSAgfSk7Ci0JICAKLQkgIGxpY2Vuc2VUZXh0Mi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDIpOwotCX0KLQljYXRjaChFeGNlcHRpb24gZSkKLQl7Ci0JICAvLyBUaGUgYnJvd3NlciB0aHJvd3MgYW4gZXhjZXB0aW9uIG9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGl0LiAKLQkgIC8vIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBleHRlcm5hbCBicm93c2VyLgotCSAgdHJ5Ci0JICB7Ci0JICAgIENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRCcm93c2VyU3VwcG9ydCgpLmdldEV4dGVybmFsQnJvd3NlcigpLm9wZW5VUkwobmV3IFVSTChsaWNlbnNlVVJMKSk7Ci0JICAgIGxpY2Vuc2VUZXh0Mi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDJfTk9fSU5URVJOQUwpOwotCSAgfQotCSAgY2F0Y2goRXhjZXB0aW9uIGV4KQotCSAgewotCQkvLyBJbiB0aGlzIGNhc2UgdGhlIGxpY2Vuc2UgY2Fubm90IGJlIGRpc3BsYXkuIEluZm9ybSB0aGUgdXNlciBvZiB0aGlzIGFuZCBnaXZlIHRoZW0gdGhlIGxpY2Vuc2UgbG9jYXRpb24uCi0JCWxpY2Vuc2VUZXh0Mi5zZXRUZXh0KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDJfTk9fQlJPV1NFUiwgbmV3IE9iamVjdFtde2xpY2Vuc2VVUkx9KSk7Ci0JICB9Ci0JfQotCi0JY3JlYXRlQnV0dG9uQmFyKGNvbXBvc2l0ZSk7Ci0JCQotCXJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nI2dldEltYWdlKCkKLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIAotICB7Ci0JcmV0dXJuIGdldEluZm9JbWFnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb21wdCB0aGUgdXNlciB0byBhY2NlcHQgdGhlIHNwZWNpZmllZCBsaWNlbnNlLiBUaGlzIG1ldGhvZCBjcmVhdGVzIHRoZQotICAgKiBkaWFsb2cgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBvZiB0aGlzIGRpYWxvZy4KLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggdGhlIGxpY2Vuc2UgbXVzdCBiZSBhY2NlcHRlZC4KLSAgICogQHBhcmFtIGxpY2Vuc2VVUkwgVGhlIGxpY2Vuc2UgVVJMLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxpY2Vuc2UgaXMgYWNjZXB0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRGb3JMaWNlbnNlKFNoZWxsIHBhcmVudCwgU3RyaW5nIHVybCwgU3RyaW5nIGxpY2Vuc2VVUkwpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JYm9vbGVhbiBhZ3JlZWRUb0xpY2Vuc2UgPSBmYWxzZTsKLQlib29sZWFuIG5ld0RpYWxvZyA9IHRydWU7Ci0JTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cgZGlhbG9nID0gbnVsbDsKLQkvLyBJZiB0aGUgZGlhbG9nIGlzIGFscmVhZHkgZGlzcGxheWVkIGZvciB0aGlzIGxpY2Vuc2UgdXNlIGl0IGluc3RlYWQgb2YgCi0JLy8gZGlzcGxheWluZyBhbm90aGVyIGRpYWxvZy4KLQlpZihkaWFsb2dzSW5Vc2UuY29udGFpbnNLZXkobGljZW5zZVVSTCkpCi0JewotCSAgbmV3RGlhbG9nID0gZmFsc2U7Ci0JICBkaWFsb2cgPSAoTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cpZGlhbG9nc0luVXNlLmdldChsaWNlbnNlVVJMKTsKLQl9Ci0JZWxzZQotCXsKLQkgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLQotCSAgdHJ5Ci0JICB7Ci0JICAgIFVSTCB1cmxPYmogPSBuZXcgVVJMKGxpY2Vuc2VVUkwpOwotCSAgICBpcyA9IHVybE9iai5vcGVuU3RyZWFtKCk7Ci0KLQkgICAgZGlhbG9nID0gbmV3IExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nKHBhcmVudCwgdXJsLCBsaWNlbnNlVVJMKTsKLQkgICAgZGlhbG9nc0luVXNlLnB1dChsaWNlbnNlVVJMLCBkaWFsb2cpOwotCSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JICB9Ci0JICBjYXRjaChFeGNlcHRpb24gZSkKLQkgIHsKLQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGUgbGljZW5zZSBjYW5ub3QgYmUgb3BlbmVkLiIpOwotCSAgfQotCSAgZmluYWxseQotCSAgewotCQlpZihpcyAhPSBudWxsKQotCQl7Ci0JCSAgdHJ5Ci0JCSAgewotCQkJaXMuY2xvc2UoKTsKLQkJICB9Ci0JCSAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLQkJICB7Ci0JCSAgICAvLyBEbyBub3RoaW5nLgotCQkgIH0KLQkJfQotCSAgfQotCX0KLQlpZihkaWFsb2cgIT0gbnVsbCkKLQl7Ci0JICBkaWFsb2cub3BlbigpOwotCSAgCi0JICBpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBMaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5PSykgCi0JICB7Ci0JCWFncmVlZFRvTGljZW5zZSA9IHRydWU7Ci0gICAgICB9Ci0JCQotCSAgaWYobmV3RGlhbG9nKQotCSAgewotICAgICAgIGRpYWxvZ3NJblVzZS5yZW1vdmUobGljZW5zZVVSTCk7Ci0JICB9Ci0JfQotCSAKLQlyZXR1cm4gYWdyZWVkVG9MaWNlbnNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2Nsb3NlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNsb3NlKCkgCi0gIHsKLQlpZihhZ3JlZUJ1dHRvbiAhPSBudWxsKQotCXsKLQkgIGFncmVlQnV0dG9uLmRpc3Bvc2UoKTsKLQkgIGFncmVlQnV0dG9uID0gbnVsbDsKLQl9Ci0JcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmYjI0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGUgbGljZW5zZSByZWdpc3RyeSBob2xkcyBhbGwgb2YgdGhlIHJlZ2lzdGVyZWQgbGljZW5zZXMgYW5kIHdoZXRoZXIgb3Igbm90IHRoZXkKLSAqIGhhdmUgYmVlbiBhY2NlcHRlZC4KLSAqLwotcHVibGljIGNsYXNzIExpY2Vuc2VSZWdpc3RyeSAKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBJbnRlZ2VyIExJQ0VOU0VfVU5TUEVDSUZJRUQgPSBuZXcgSW50ZWdlcigwKTsgLy8gVGhpcyBuZWVkcyB0byBiZSAwIGZvciB0aGUgcGx1Z2luIHByZWZzLgotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9BR1JFRSA9IG5ldyBJbnRlZ2VyKDEpOwotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9ESVNBR1JFRSA9IG5ldyBJbnRlZ2VyKDIpOwotICAvLyBTaWduaWZpZXMgYSBsaWNlbnNlIHRoYXQgaGFzIGJlZW4gZGlzYWdyZWVkIHRvIHRoaXMgc2Vzc2lvbi4KLSAgcHJvdGVjdGVkIHN0YXRpYyBJbnRlZ2VyIExJQ0VOU0VfRElTQUdSRUVfVEhJU19TRVNTSU9OID0gbmV3IEludGVnZXIoMyk7Ci0gIAotICAvKioKLSAgICogVGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGxpY2Vuc2UgcmVnaXN0cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIExpY2Vuc2VSZWdpc3RyeSBpbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogSWYgc2V0IHRvIHRydWUsIHRoZSBkbyBub3QgcHJvbXB0IGZsYWcgd2lsbCBwcmV2ZW50IHVzZXIgcHJvbXB0aW5nLiBVc2VkIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBET19OT1RfUFJPTVBUID0gZmFsc2U7Ci0gIAotICAvKioKLSAgICogVGhlIGxpY2Vuc2VzIGhhc2h0YWJsZSBjb250YWlucyBsaWNlbnNlcyBhbmQgd2hldGhlciBvciBub3QgdGhleSd2ZSBiZWVuIGFjY2VwdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBsaWNlbnNlczsKLSAgCi0gIHByb3RlY3RlZCBMaWNlbnNlUmVnaXN0cnkoKQotICB7Ci0JbGljZW5zZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCi0JLy8gSWYgdGhlIHd0cCBxdWlldCBzeXN0ZW0gcHJvcGVydHkgaXMgc2V0IHRoZSBET19OT1RfUFJPTVBUIGZsYWcgaXMgc2V0IHRvIHRydWUuCi0JLy8gVGhpcyBpcyB1c2VkIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KLQlpZihTeXN0ZW0uZ2V0UHJvcGVydHkoQ2FjaGVNZXNzYWdlcy5XVFBfTk9fVVNFUl9JTlRFUkFDVElPTl9TWVNURU1fUFJPUCwgImZhbHNlIikuZXF1YWxzKCJ0cnVlIikpCi0JewotCSAgQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQ2FjaGVQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChDYWNoZU1lc3NhZ2VzLl9MT0dfSU5GT19XVFBfTk9fVVNFUl9JTlRFUkFDVElPTiwgbmV3IE9iamVjdFtde0NhY2hlTWVzc2FnZXMuV1RQX05PX1VTRVJfSU5URVJBQ1RJT05fU1lTVEVNX1BST1B9KSwgbnVsbCkpOwotCSAgRE9fTk9UX1BST01QVCA9IHRydWU7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGxpY2Vuc2UgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGxpY2Vuc2UgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpY2Vuc2VSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLQlpZihpbnN0YW5jZSA9PSBudWxsKQotCXsKLQkgIGluc3RhbmNlID0gbmV3IExpY2Vuc2VSZWdpc3RyeSgpOwotCX0KLQlyZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgdGhlIHNwZWNpZmllZCBsaWNlbnNlIHRvIHRoZSBsaWNlbnNlIHJlZ2lzdHJ5LiBBIGxpY2Vuc2UgY2FuIG9ubHkgYmUgYWRkZWQgdG8gdGhlCi0gICAqIHJlZ2lzdHJ5IG9uY2UuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdG8gYWRkIHRvIHRoZSByZWdpc3RyeS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZExpY2Vuc2UoU3RyaW5nIHVybCkKLSAgewotCWlmKHVybCAhPSBudWxsICYmICFsaWNlbnNlcy5jb250YWluc0tleSh1cmwpKQotCXsKLQkgIGxpY2Vuc2VzLnB1dCh1cmwsIExJQ0VOU0VfVU5TUEVDSUZJRUQpOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIEFncmVlIHRvIHRoZSBzcGVjaWZpZWQgbGljZW5zZS4gVGhlIGxpY2Vuc2UgaXMgYWdyZWVkIHRvIG9ubHkgaWYgaXQgaGFzIGFscmVhZHkKLSAgICogYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlIHRvIGFjY2VwdC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFncmVlTGljZW5zZShTdHJpbmcgdXJsKQotICB7Ci0JaWYobGljZW5zZXMuY29udGFpbnNLZXkodXJsKSkKLQl7Ci0JICBsaWNlbnNlcy5wdXQodXJsLCBMSUNFTlNFX0FHUkVFKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEaXNhZ3JlZSB0byB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UuIFRoZSBsaWNlbnNlIGlzIGRpc2FncmVlZCB0byBvbmx5IGlmIGl0IGhhcyBhbHJlYWR5Ci0gICAqIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdpc3RyeS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0byBhY2NlcHQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkaXNhZ3JlZUxpY2Vuc2UoU3RyaW5nIHVybCkKLSAgewotCWlmKGxpY2Vuc2VzLmNvbnRhaW5zS2V5KHVybCkpCi0JewotCSAgbGljZW5zZXMucHV0KHVybCwgTElDRU5TRV9ESVNBR1JFRSk7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogRGlzYWdyZWUgdG8gdGhlIHNwZWNpZmllZCBsaWNlbnNlIGZvciB0aGlzIHNlc3Npb24uIFRoZSBsaWNlbnNlIGlzIGRpc2FncmVlZCB0byBvbmx5IGlmIGl0IGhhcyBhbHJlYWR5Ci0gICAqIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdpc3RyeS4gCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdG8gYWNjZXB0LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGRpc2FncmVlTGljZW5zZVRoaXNTZXNzaW9uKFN0cmluZyB1cmwpCi0gIHsKLQlpZihsaWNlbnNlcy5jb250YWluc0tleSh1cmwpKQotCXsKLQkgIGxpY2Vuc2VzLnB1dCh1cmwsIExJQ0VOU0VfRElTQUdSRUVfVEhJU19TRVNTSU9OKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhlIGxpY2Vuc2UgaGFzIGJlZW4gYWNjZXB0ZWQuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGxpY2Vuc2UKLSAgICogaGFzIGJlZW4gYWNjZXB0ZWQgb3IgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVnaXN0cnkgYW5kIGZhbHNlIGlmIGl0IGhhcyBub3QgYmVlbiBhY2NlcHRlZC4gCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIGZvciB3aGljaCB3ZSBhcmUgY2hlY2tpbmcgdGhlIGxpY2Vuc2UuCi0gICAqIEBwYXJhbSBsaWNlbnNlVVJMIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQgaGFzIGJlZW4gYWNjZXB0ZWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGljZW5zZSBoYXMgYmVlbiBhY2NlcHRlZCBvciBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdpc3RyeSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzTGljZW5zZUJlZW5BY2NlcHRlZChTdHJpbmcgdXJsLCBTdHJpbmcgbGljZW5zZVVSTCkKLSAgewotCWlmKERPX05PVF9QUk9NUFQpCi0JewotCSAgcmV0dXJuIHRydWU7Ci0JfQotCQotCWlmKGxpY2Vuc2VzLmNvbnRhaW5zS2V5KGxpY2Vuc2VVUkwpKQotCXsKLQkgIEludGVnZXIgYWdyZWVkID0gKEludGVnZXIpbGljZW5zZXMuZ2V0KGxpY2Vuc2VVUkwpOwotCSAgaWYoYWdyZWVkID09IExJQ0VOU0VfQUdSRUUpCi0JICB7Ci0JCXJldHVybiB0cnVlOwotCSAgfQotCSAgZWxzZSBpZihhZ3JlZWQgPT0gTElDRU5TRV9ESVNBR1JFRSkKLQkgIHsKLQkJaWYoIUNhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5zaG91bGRQcm9tcHQoKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWxpY2Vuc2VzLnB1dChsaWNlbnNlVVJMLCBMSUNFTlNFX0RJU0FHUkVFX1RISVNfU0VTU0lPTik7Ci0JICB9Ci0JICAvLyBUaGUgbGljZW5zZSBoYXMgYWxyZWFkeSBiZWVuIGRpc2FncmVlZCB0byB0aGlzIHNlc3Npb24uIERvIG5vdCBwcm9tcHQuCi0JICBlbHNlIGlmKGFncmVlZCA9PSBMSUNFTlNFX0RJU0FHUkVFX1RISVNfU0VTU0lPTikKLQkgIHsKLQkJcmV0dXJuIGZhbHNlOwotCSAgfQotCQkgIAotCSAgCi0JICAvLyBQcm9tcHQgdGhlIHVzZXIgdG8gYWNjZXB0IHRoZSBsaWNlbnNlLgotCSAgaW50IGxpY2Vuc2VBY2NlcHRhbmNlID0gcHJvbXB0VG9BY2NlcHRMaWNlbnNlKHVybCwgbGljZW5zZVVSTCk7Ci0JICBpZihsaWNlbnNlQWNjZXB0YW5jZSA9PSBBY2NlcHRlZC5BQ0NFUFRFRCkKLQkgIHsKLQkJYWdyZWVMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCQlyZXR1cm4gdHJ1ZTsKLQkgIH0KLQkgIGVsc2UgaWYobGljZW5zZUFjY2VwdGFuY2UgPT0gQWNjZXB0ZWQuTk9UX0FDQ0VQVEVEKQotCSAgewotCSAgICBkaXNhZ3JlZUxpY2Vuc2VUaGlzU2Vzc2lvbihsaWNlbnNlVVJMKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvLyBUaGUgbGljZW5zZSBpcyBub3QgcmVnaXN0cmVkIHdpdGggdGhlIHJlZ2lzdHJ5LgotCXJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogUHJvbXB0IHRoZSB1c2VyIHRvIGFjY2VwdCB0aGUgbGljZW5zZS4gVGhpcyBtZXRob2QgY3JlYXRlcyBhIExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggdGhlIGxpY2Vuc2UgbmVlZHMgdG8gYmUgYWNjZXB0ZWQuCi0gICAqIEBwYXJhbSBsaWNlbnNlVVJMIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdG8gYmUgYWNjZXB0ZWQuIAotICAgKiBAcmV0dXJuIDAgaWYgYWNjZXB0ZWQsIDEgaWYgbm90IGFjY2VwdGVkLCAyIGlmIG5vdCBhYmxlIHRvIGFjY2VwdC4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgcHJvbXB0VG9BY2NlcHRMaWNlbnNlKGZpbmFsIFN0cmluZyB1cmwsIGZpbmFsIFN0cmluZyBsaWNlbnNlVVJMKSAKLSAgewotCWZpbmFsIEFjY2VwdGVkIGFjY2VwdGVkID0gbmV3IEFjY2VwdGVkKCk7Ci0JICBEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCSAgaWYoTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cucHJvbXB0Rm9yTGljZW5zZShudWxsLCB1cmwsIGxpY2Vuc2VVUkwpKQotCQkJCSAgewotCQkJCQlhY2NlcHRlZC5hY2NlcHRlZCA9IEFjY2VwdGVkLkFDQ0VQVEVEOwotCQkJCSAgfQotCQkJCSAgZWxzZQotCQkJCSAgewotCQkJCQlhY2NlcHRlZC5hY2NlcHRlZCA9IEFjY2VwdGVkLk5PVF9BQ0NFUFRFRDsKLQkJCQkgIH0KLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCSAgYWNjZXB0ZWQuYWNjZXB0ZWQgPSBBY2NlcHRlZC5OT1RfREVURVJNSU5FRDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCXJldHVybiBhY2NlcHRlZC5hY2NlcHRlZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgbGljZW5zZXMgaW4gdGhlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHJldHVybiBBcyBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgbGljZW5zZXMgaW4gdGhlIHJlZ2lzdHJ5LiAKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRMaWNlbnNlcygpCi0gIHsKLQlyZXR1cm4gKFN0cmluZ1tdKWxpY2Vuc2VzLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tsaWNlbnNlcy5rZXlTZXQoKS5zaXplKCldKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIGxpY2Vuc2UuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UuCi0gICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBsaWNlbnNlLgotICAgKi8KLSAgcHJvdGVjdGVkIEludGVnZXIgZ2V0TGljZW5zZVN0YXRlKFN0cmluZyB1cmwpCi0gIHsKLQlyZXR1cm4gKEludGVnZXIpbGljZW5zZXMuZ2V0KHVybCk7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogQSBjbGFzcyB0byBob2xkIGFjY2VwdGFuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9tcHQgbWV0aG9kLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBBY2NlcHRlZAotICB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVBURUQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9BQ0NFUFRFRCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0RFVEVSTUlORUQgPSAyOwotCXB1YmxpYyBpbnQgYWNjZXB0ZWQgPSBOT1RfQUNDRVBURUQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTY1YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoZSBUb0NhY2hlUmVnaXN0cnlSZWFkZXJzIHJlYWRzIEVjbGlwc2UgZXh0ZW5zaW9ucyB3aGljaCBzcGVjaWZ5Ci0gKiByZXNvdXJjZXMgdG8gY2FjaGUuIEFuIGV4dGVuc2lvbiBwb2ludCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcuCi0gKiAKLSAqICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuY2FjaGVyZXNvdXJjZSI+Ci0gKiAgICA8Y2FjaGVyZXNvdXJjZSB1cmk9IlVSSV9UT19DQUNIRSIgbGljZW5zZT0iVVJJX09GX0xJQ0VOU0UiLz4KLSAqICA8L2V4dGVuc2lvbj4gCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY2FjaGVyZXNvdXJjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9VUkwgPSAidXJsIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xJQ0VOU0UgPSAibGljZW5zZSI7Ci0gCi0gIHByaXZhdGUgc3RhdGljIFRvQ2FjaGVSZWdpc3RyeVJlYWRlciByZWdpc3RyeVJlYWRlciA9IG51bGw7Ci0gIAotICBwcml2YXRlIEhhc2h0YWJsZSByZXNvdXJjZXNUb0NhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGlzIHJlZ2lzdHJ5IHJlYWRlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGlzIHJlZ2lzdHJ5IHJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmKHJlZ2lzdHJ5UmVhZGVyID09IG51bGwpCi0gICAgewotICAgICAgcmVnaXN0cnlSZWFkZXIgPSBuZXcgVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyKCk7Ci0gICAgfQotICAgIHJldHVybiByZWdpc3RyeVJlYWRlcjsKLSAgfQotICAvKioKLSAgICogUmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgaGFuZGxlIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnRzIHRoYXQgbWF0Y2gKLSAgICogdGhlIHNwZWRpZmllZCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgVG9DYWNoZVJlc291cmNlIHRvQ2FjaGVSZXNvdXJjZSA9IHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgICAgaWYodG9DYWNoZVJlc291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvdXJjZXNUb0NhY2hlLnB1dCh0b0NhY2hlUmVzb3VyY2UuZ2V0VVJMKCksIHRvQ2FjaGVSZXNvdXJjZSk7Ci0gICAgICAgICAgTGljZW5zZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuYWRkTGljZW5zZSh0b0NhY2hlUmVzb3VyY2UuZ2V0TGljZW5zZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhbmQgZGVhbCB3aXRoIHRoZSBleHRlbnNpb24gcG9pbnRzLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGV4dGVuc2lvbiBwb2ludCBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIFRvQ2FjaGVSZXNvdXJjZSByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotCQotICAgIGlmKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFWFRFTlNJT05fUE9JTlRfSUQpKQotICAgIHsKLSAgICAgIFN0cmluZyB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVVJMKTsKLSAgICAgIGlmKHVybCAhPSBudWxsKQotICAgICAgewotICAgIAlTdHJpbmcgbGljZW5zZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MSUNFTlNFKTsKLSAgICAJCi0gICAgCS8vIElmIHRoZSBsaWNlbnNlIGlzIHJlbGF0aXZlIHJlc29sdmUgcmVsYXRpdmUgdG8gdGhlCi0gICAgCS8vIHBsdWctaW4gdGhhdCBkZWNsYXJlcyBpdC4KLSAgICAJdHJ5Ci0gICAgCXsKLSAgICAJICBVUkkgbGljZW5zZVVSSSA9IG5ldyBVUkkobGljZW5zZSk7Ci0gICAgCSAgaWYoIWxpY2Vuc2VVUkkuaXNBYnNvbHV0ZSgpKQotICAgIAkgIHsKLSAgICAJCUJ1bmRsZSBwbHVnaW5CdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7Ci0gICAgCQlVUkwgbGljZW5zZVVSTCA9IHBsdWdpbkJ1bmRsZS5nZXRFbnRyeShsaWNlbnNlKTsKLSAgICAJCWlmKGxpY2Vuc2VVUkwgIT0gbnVsbCkKLSAgICAJCXsKLSAgICAJICAgICAgbGljZW5zZSA9IEZpbGVMb2NhdG9yLnJlc29sdmUobGljZW5zZVVSTCkudG9FeHRlcm5hbEZvcm0oKTsgIAotICAgIAkJfQotICAgIAkgIH0KLSAgICAJfQotICAgIAljYXRjaChVUklTeW50YXhFeGNlcHRpb24gZSkKLSAgICAJewotICAgIAkgIC8vIFVzZSB0aGUgbGljZW5zZSBhcyBzcGVjaWZpZWQuCi0gICAgCX0KLSAgICAJY2F0Y2goSU9FeGNlcHRpb24gZSkKLSAgICAJewotICAgIAkgIC8vIFVzZSB0aGUgbGljZW5zZSBhcyBzcGVjaWZpZWQuCi0gICAgCX0KLSAgICAJcmV0dXJuIG5ldyBUb0NhY2hlUmVzb3VyY2UodXJsLCBsaWNlbnNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpc3Qgb2YgVVJJcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgZm9yIGNhY2hpbmcuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFVSSXMgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkIGZvciBjYWNoaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFVSSXNUb0NhY2hlKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nW10pcmVzb3VyY2VzVG9DYWNoZS5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbcmVzb3VyY2VzVG9DYWNoZS5zaXplKCldKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgcmVzb3VyY2UgdG8gY2FjaGUgaWYgb25lIGhhcyBiZWVuIHNwZWNpZmllZC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gY2FjaGUuCi0gICAqIEByZXR1cm4gQSBUb0NhY2hlUmVzb3VyY2Ugb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgVVJMIG9yIG51bGwgaWYgbm9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gICAqLwotICBwdWJsaWMgVG9DYWNoZVJlc291cmNlIGdldFJlc291cmNlVG9DYWNoZShTdHJpbmcgdXJsKQotICB7Ci0JcmV0dXJuIChUb0NhY2hlUmVzb3VyY2UpcmVzb3VyY2VzVG9DYWNoZS5nZXQodXJsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvVG9DYWNoZVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjc3OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi0vKioKLSAqIEEgcmVzb3VyY2UgdGhhdCBpcyBzcGVjaWZpZWQgdG8gYmUgY2FjaGVkLiBUaGUgcmVzb3VyY2UgaGFzIGEgVVJMIGFuZCBhbiBvcHRpb25hbAotICogbGljZW5zZS4KLSAqLwotcHVibGljIGNsYXNzIFRvQ2FjaGVSZXNvdXJjZSAKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdXJsOwotICBwcml2YXRlIFN0cmluZyBsaWNlbnNlOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjYWNoZWQuCi0gICAqIEBwYXJhbSBsaWNlbnNlIFRoZSBVUkwgb2YgdGhlIG9wdGlvbmFsIGxpY2Vuc2UgZm9yIHRoaXMgcmVzb3VyY2UuCi0gICAqLwotICBwdWJsaWMgVG9DYWNoZVJlc291cmNlKFN0cmluZyB1cmwsIFN0cmluZyBsaWNlbnNlKQotICB7Ci0JdGhpcy51cmwgPSB1cmw7Ci0JdGhpcy5saWNlbnNlID0gbGljZW5zZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjYWNoZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGJlIGNhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkKLSAgewotCXJldHVybiB1cmw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpY2Vuc2UgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjYWNoZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaWNlbnNlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY2FjaGVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMaWNlbnNlKCkKLSAgewotCXJldHVybiBsaWNlbnNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NhY2hlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ2FjaGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM5NjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ2FjaGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHByZWZlcmVuY2UgcGFnZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIHRvIHRoZQotICogUHJlZmVyZW5jZXMgZGlhbG9nLiBUaGlzIHBhZ2UgY29udGFpbnMgb3B0aW9ucyBmb3IgdGhlIGNhY2hlLiBUaGUgY2FjaGUgY2FuCi0gKiBiZSBkaXNhYmxlZCwgdGhlIGxpc3Qgb2YgZW50cmllcyBpbiB0aGUgY2FjaGUgY2FuIGJlIHZpZXdlZCwgYW5kIGluZGl2aWR1YWwKLSAqIGVudHJpZXMgb3IgdGhlIGVudGlyZSBjYWNoZSBjYW4gYmUgZGVsZXRlZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ2FjaGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLSAgICBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBjbGVhckJ1dHRvbjsKLQotICBwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLQotICBwcm90ZWN0ZWQgQnV0dG9uIGVuYWJsZWRCdXR0b247Ci0gIAotICBwcm90ZWN0ZWQgQnV0dG9uIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uOwotCi0gIHByb3RlY3RlZCBMaXN0IGVudHJpZXM7Ci0KLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuZGlzcG9zZSgpOwotICAgIH0KLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgQ2FjaGVQcmVmZXJlbmNlUGFnZSgpCi0gIHsKLSAgICBzZXRQcmVmZXJlbmNlU3RvcmUoQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCi0gICAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotICAgIAotICAgIExhYmVsIGFib3V0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgYWJvdXRMYWJlbC5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX1BSRUZfQ0FDSEVfQUJPVVQpOwotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgYWJvdXRMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTm9uZSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQ3JlYXRlZCB0aGUgZGlzYWJsZSBjYWNoZSBvcHRpb24uCi0gICAgICBlbmFibGVkQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgIGVuYWJsZWRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICBlbmFibGVkQnV0dG9uLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfUFJFRl9DQUNIRV9DQUNIRV9PUFRJT04pOwotICAgICAgZW5hYmxlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oIUNhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotICAgICAgICAgIC5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCkpOwotICAgICAgZW5hYmxlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotICAgICAgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVkID0gZW5hYmxlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q2FjaGVFbmFibGVkKCFkaXNhYmxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgfSk7Ci0gICAgICAKLSAgICAgIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgZGlzYWdyZWVkTGljZW5zZXNCdXR0b24uc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9QUkVGX1BST01QVF9GT1JfRElTQUdSRUVEX0xJQ0VOU0VTKTsKLSAgICAgIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uLnNldFNlbGVjdGlvbihDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLSAgICAgICAgICAuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBST01QVF9ESVNBR1JFRURfTElDRU5TRVMpKTsKLSAgICAgIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gcHJvbXB0ID0gZGlzYWdyZWVkTGljZW5zZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldFByb21wdERpc2FncmVlZExpY2Vuc2VzKHByb21wdCk7Ci0gICAgICAgIH0KLQotICAgICAgfSk7Ci0KLSAgICAgIC8vIENyZWF0ZSB0aGUgZW50aXRpZXMgZ3JvdXAuCi0gICAgICBMYWJlbCBlbnRyaWVzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgICBlbnRyaWVzTGFiZWwuc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9QUkVGX0NBQ0hFX0VOVFJJRVNfVElUTEUpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgZW50cmllc0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICBlbnRyaWVzID0gbmV3IExpc3QoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZW50cmllcywKLSAgICAgICAgICBDb250ZXh0SWRzLlBSRUZfRU5UUklFUyk7Ci0gICAgICBTdHJpbmdbXSBjYWNoZUVudHJpZXMgPSBDYWNoZS5nZXRJbnN0YW5jZSgpLmdldENhY2hlZFVSSXMoKTsKLSAgICAgIEFycmF5cy5zb3J0KGNhY2hlRW50cmllcyk7Ci0gICAgICBlbnRyaWVzLnNldEl0ZW1zKGNhY2hlRW50cmllcyk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotICAgICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgICBlbnRyaWVzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgZW50cmllcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgc2V0UHJlZmVyZW5jZVdpZGdldHMoKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgIGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgICAgZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7Ci0gICAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgU1dULlRPUCk7Ci0gICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAvLyBDcmVhdGUgdGhlIERlbGV0ZSBidXR0b24KLSAgICAgIGRlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICBkZWxldGVCdXR0b24uc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9CVVRUT05fREVMRVRFX0VOVFJZKTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIGRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgLm9wZW5Db25maXJtKAotICAgICAgICAgICAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgIENhY2hlTWVzc2FnZXMuX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19USVRMRSwKLSAgICAgICAgICAgICAgICAgIENhY2hlTWVzc2FnZXMuX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19NRVNTQUdFKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3RlZEVudHJpZXMgPSBlbnRyaWVzLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgaW50IG51bVNlbGVjdGVkRW50cmllcyA9IHNlbGVjdGVkRW50cmllcy5sZW5ndGg7Ci0KLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VsZWN0ZWRFbnRyaWVzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhY2hlLmRlbGV0ZUVudHJ5KHNlbGVjdGVkRW50cmllc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBjYWNoZUVudHJpZXMgPSBjYWNoZS5nZXRDYWNoZWRVUklzKCk7Ci0gICAgICAgICAgICBBcnJheXMuc29ydChjYWNoZUVudHJpZXMpOwotICAgICAgICAgICAgZW50cmllcy5zZXRJdGVtcyhjYWNoZUVudHJpZXMpOwotICAgICAgICAgICAgc2V0UHJlZmVyZW5jZVdpZGdldHMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICAvLyBDcmVhdGUgdGhlIENsZWFyIENhY2hlIGJ1dHRvbgotICAgICAgY2xlYXJCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgY2xlYXJCdXR0b24uc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9CVVRUT05fQ0xFQVJfQ0FDSEUpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgY2xlYXJCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICBjbGVhckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLSAgICAgICAgICAgICAgQ2FjaGVNZXNzYWdlcy5fVUlfQ09ORklSTV9DTEVBUl9DQUNIRV9ESUFMT0dfVElUTEUsCi0gICAgICAgICAgICAgIENhY2hlTWVzc2FnZXMuX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX01FU1NBR0UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGNhY2hlLmNsZWFyKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjYWNoZUVudHJpZXMgPSBjYWNoZS5nZXRDYWNoZWRVUklzKCk7Ci0gICAgICAgICAgICBBcnJheXMuc29ydChjYWNoZUVudHJpZXMpOwotICAgICAgICAgICAgZW50cmllcy5zZXRJdGVtcyhjYWNoZUVudHJpZXMpOwotICAgICAgICAgICAgc2V0UHJlZmVyZW5jZVdpZGdldHMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgICAvL1RPRE86IExvZyBlcnJvcgotICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICBzZXRQcmVmZXJlbmNlV2lkZ2V0cygpOwotICAgIGFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHByZWZlcmVuY2UgcGFnZSB3aWRnZXRzLiBUaGVyZSBhcmUgYSBmZXcgcnVsZXMuIDEuIElmIGRpc2FibGVkLCBhbGwKLSAgICogb2YgdGhlIHdpZGdldHMgYXJlIGRpYWJsZWQgZXhjZXB0IGZvciB0aGUgZGlzYWJsZWQgY2hlY2sgYm94LiAyLiBJZgotICAgKiBlbmFibGVkLCBhbGwgd2lkZ2V0cyBhcmUgZW5hYmxlZCBleGNlcHQgYS4gVGhlIGRlbGV0ZSBidXR0b24gaXMgZW5hYmxlZAotICAgKiBvbmx5IGlmIHRoZXJlIGlzIGEgc2VsZWN0aW9uIGluIHRoZSBsaXN0LiBiLiBUaGUgY2xlYXIgYnV0dG9uIGlzIGVuYWJsZWQKLSAgICogb25seSBpZiB0aGVyZSBhcmUgaXRlbXMgaW4gdGhlIGxpc3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlV2lkZ2V0cygpCi0gIHsKLSAgICBpZiAoY29tcG9zaXRlICE9IG51bGwgJiYgY29tcG9zaXRlLmdldEVuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBpZiAoZW50cmllcy5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9IAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoZW50cmllcy5nZXRJdGVtQ291bnQoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGNsZWFyQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9IAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjbGVhckJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIENvbnRleHRJZHMuUFJFRik7IC8vJE5PTi1OTFMtMSQKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OWNhZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVBsdWdpbjsKLQotLyoqCi0gKiBDb25zdGFudCBpZHMgZm9yIGNvbnRleHQgaGVscC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0SWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGID0gQ2FjaGVQbHVnaW4uUExVR0lOX0lEICsgIi5jcHIwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOVFJJRVMgPSBDYWNoZVBsdWdpbi5QTFVHSU5fSUQgKyAiLmNwcjAwMDIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWM0YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbnN0YW50IGRlZmluaXRpb25zIGZvciBwbHVnLWluIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlQ29uc3RhbnRzIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9FTkFCTEVEID0gImNhY2hlRW5hYmxlZCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9NUFRfRElTQUdSRUVEX0xJQ0VOU0VTID0gInByb21wdERpc2FncmVlZExpY2Vuc2VzIjsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I0YWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVBsdWdpbjsKLQotLyoqCi0gKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIAotewotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgCi0gIHsKLQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgIHN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVELCB0cnVlKTsKLSAgICBzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUywgZmFsc2UpOwotICB9Ci19Cg==