ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjNWUzMQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYTdlYwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy8ucHJvamVjdApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQ5MzY5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDcgQEAKKyNXZWQgSnVsIDMwIDE2OjM4OjUxIEJTVCAyMDA4CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9KUkVEZWZhdWx0QXR0cmlidXRlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL0pSRURlZmF1bHRBdHRyaWJ1dGVzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyNDRkMgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9KUkVEZWZhdWx0QXR0cmlidXRlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL0pSRURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvSlJFRGVmYXVsdE91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDIzZTlkCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL0pSRURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworbWV0aG9kPW1ldGhvZAorbWV0aG9kLkRFU0M9InhtbCIgfCAiaHRtbCIgfCAidGV4dCIgfCBxbmFtZS1idXQtbm90LW5jbmFtZSAKKwordmVyc2lvbj12ZXJzaW9uCit2ZXJzaW9uLkRFU0M9c3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBvdXRwdXQgbWV0aG9kCisKK2luZGVudD1pbmRlbnQKK2luZGVudC5ERVNDPXNwZWNpZmllcyB3aGV0aGVyIHRoZSBYU0xUIHByb2Nlc3NvciBtYXkgYWRkIGFkZGl0aW9uYWwgd2hpdGVzcGFjZSB3aGVuIG91dHB1dHRpbmcgdGhlIHJlc3VsdCB0cmVlOyB0aGUgdmFsdWUgbXVzdCBiZSB5ZXMgb3Igbm8KKworZW5jb2Rpbmc9ZW5jb2RpbmcKK2VuY29kaW5nLkRFU0M9c3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQgY2hhcmFjdGVyIGVuY29kaW5nIHRoYXQgdGhlIFhTTFQgcHJvY2Vzc29yIHNob3VsZCB1c2UgdG8gZW5jb2RlIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIGFzIHNlcXVlbmNlcyBvZiBieXRlczsgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRyZWF0ZWQgY2FzZS1pbnNlbnNpdGl2ZWx5OyB0aGUgdmFsdWUgbXVzdCBjb250YWluIG9ubHkgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgI3gyMSB0byAjeDdFIChpLmUuIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzKTsgdGhlIHZhbHVlIHNob3VsZCBlaXRoZXIgYmUgYSBjaGFyc2V0IHJlZ2lzdGVyZWQgd2l0aCB0aGUgSW50ZXJuZXQgQXNzaWduZWQgTnVtYmVycyBBdXRob3JpdHkgW0lBTkFdLCBbUkZDMjI3OF0gb3Igc3RhcnQgd2l0aCBYLQorCittZWRpYS10eXBlPW1lZGlhLXR5cGUKK21lZGlhLXR5cGUuREVTQz1zcGVjaWZpZXMgdGhlIG1lZGlhIHR5cGUgKE1JTUUgY29udGVudCB0eXBlKSBvZiB0aGUgZGF0YSB0aGF0IHJlc3VsdHMgZnJvbSBvdXRwdXR0aW5nIHRoZSByZXN1bHQgdHJlZTsgdGhlIGNoYXJzZXQgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkIGV4cGxpY2l0bHk7IGluc3RlYWQsIHdoZW4gdGhlIHRvcC1sZXZlbCBtZWRpYSB0eXBlIGlzIHRleHQsIGEgY2hhcnNldCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGFkZGVkIGFjY29yZGluZyB0byB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGFjdHVhbGx5IHVzZWQgYnkgdGhlIG91dHB1dCBtZXRob2QKKworZG9jdHlwZS1zeXN0ZW09ZG9jdHlwZS1zeXN0ZW0KK2RvY3R5cGUtc3lzdGVtLkRFU0M9c3BlY2lmaWVzIHRoZSBzeXN0ZW0gaWRlbnRpZmllciB0byBiZSB1c2VkIGluIHRoZSBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uCisKK2RvY3R5cGUtcHVibGljPWRvY3R5cGUtcHVibGljCitkb2N0eXBlLXB1YmxpYy5ERVNDPXNwZWNpZmllcyB0aGUgcHVibGljIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBpbiB0aGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbgorCitvbWl0LXhtbC1kZWNsYXJhdGlvbj1vbWl0LXhtbC1kZWNsYXJhdGlvbgorb21pdC14bWwtZGVjbGFyYXRpb24uREVTQz1zcGVjaWZpZXMgd2hldGhlciB0aGUgWFNMVCBwcm9jZXNzb3Igc2hvdWxkIG91dHB1dCBhbiBYTUwgZGVjbGFyYXRpb247IHRoZSB2YWx1ZSBtdXN0IGJlIHllcyBvciBubworCitzdGFuZGFsb25lPXN0YW5kYWxvbmUKK3N0YW5kYWxvbmUuREVTQz1zcGVjaWZpZXMgd2hldGhlciB0aGUgWFNMVCBwcm9jZXNzb3Igc2hvdWxkIG91dHB1dCBhIHN0YW5kYWxvbmUgZG9jdW1lbnQgZGVjbGFyYXRpb247IHRoZSB2YWx1ZSBtdXN0IGJlIHllcyBvciBubworCitjZGF0YS1zZWN0aW9uLWVsZW1lbnRzPWNkYXRhLXNlY3Rpb24tZWxlbWVudHMKK2NkYXRhLXNlY3Rpb24tZWxlbWVudHMuREVTQz1zcGVjaWZpZXMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBlbGVtZW50cyB3aG9zZSB0ZXh0IG5vZGUgY2hpbGRyZW4gc2hvdWxkIGJlIG91dHB1dCB1c2luZyBDREFUQSBzZWN0aW9ucwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQzNWQzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTkgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDAuNS4wLnF1YWxpZmllcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5KQVhQTGF1bmNoaW5nUGx1Z2luCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzO2J1bmRsZS12ZXJzaW9uPSIzLjIuMTAwIiwKKyBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCisgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iMy40LjAiLAorIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCisgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCisgb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKKyBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iMy40LjAiCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CitCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZworQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzAwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvYWJvdXQuaHRtbApAQCAtMCwwICsxLDM0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8SFRNTD4KKworPGhlYWQ+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPC9oZWFkPgorCis8Qk9EWSBsYW5nPSJFTi1VUyI+CisKKzxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgorCis8UD5BdWd1c3QsIDIwMDg8L1A+CisKKzxIMz5MaWNlbnNlPC9IMz4KKworPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAorKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCit1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCisoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKKzxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+CisKKzxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAorQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAorQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCitsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Cis8QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I2NjNhCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMSBAQAorc291cmNlLi4gPSBzcmMvCitvdXRwdXQuLiA9IGJpbi8KK2Jpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCisgICAgICAgICAgICAgICBzY2hlbWEvLFwKKyAgICAgICAgICAgICAgIEpSRURlZmF1bHRBdHRyaWJ1dGVzLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgSlJFRGVmYXVsdE91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBsb2c0ai5kZWJ1Zy5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvbG9nNGouZGVidWcucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9sb2c0ai5kZWJ1Zy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGZiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvbG9nNGouZGVidWcucHJvcGVydGllcwpAQCAtMCwwICsxLDEwIEBACisjIFNldCByb290IGxvZ2dlciBsZXZlbCB0byBERUJVRyBhbmQgaXRzIGFwcGVuZGVycyBhcmUgQTEgYW5kIEEyCitsb2c0ai5yb290TG9nZ2VyPUVSUk9SLCBBMgorCisjIEEyIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuQTI9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKKworIyBBMiB1c2VzIFBhdHRlcm5MYXlvdXQuCitsb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Citsb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SEg6bW06c3MsU1NTfSAlLTVwIFsldF0gJWN7MX0gJXggLSAlbSVuCisKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTgxOWUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKK0J1bmRsZS1OYW1lLjAgPSBYU0wgSkFYUCBMYXVuY2hpbmcgKEluY3ViYXRpbmcpCitsYXVuY2hEZWxlZ2F0ZS5uYW1lLjAgPSBKQVhQCitwcm9jZXNzb3JUeXBlLmxhYmVsLjEgPSBKUkUgRGVmYXVsdAorcHJvY2Vzc29yLmxhYmVsLjEgPSBKUkUgSW5zdGFuY2UgRGVmYXVsdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMjY0MwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Cis8cGx1Z2luPgorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZGVidWdnZXIiIG5hbWU9ImRlYnVnZ2VyIiBzY2hlbWE9InNjaGVtYS9kZWJ1Z2dlci5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnZva2UiIG5hbWU9Imludm9rZSIgc2NoZW1hPSJzY2hlbWEvaW52b2tlLmV4c2QiLz4KKyAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByb2Nlc3NvciIgbmFtZT0icHJvY2Vzc29yIiBzY2hlbWE9InNjaGVtYS9wcm9jZXNzb3IuZXhzZCIvPgorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icHJvY2Vzc29yVHlwZSIgbmFtZT0icHJvY2Vzc29yVHlwZSIgc2NoZW1hPSJzY2hlbWEvcHJvY2Vzc29yVHlwZS5leHNkIi8+CisgPGV4dGVuc2lvbgorICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmxhdW5jaERlbGVnYXRlcyI+CisgICAgPGxhdW5jaERlbGVnYXRlCisgICAgICAgICAgZGVsZWdhdGU9Im9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuSkFYUEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUiCisgICAgICAgICAgZGVsZWdhdGVEZXNjcmlwdGlvbj0iVGhlIFhTTFQgTGF1bmNoZXIgZm9yIEpBWFAgc3VwcG9ydHMgcnVubmluZyBhbmQgZGVidWdnaW5nIHRyYW5zZm9ybWF0aW9ucyB1c2luZyBKQVhQLWNvbXBsaWFudCBYU0xUIHByb2Nlc3NvcnMiCisgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmludGVybmFsLmpheHAuSkFYUExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSIKKyAgICAgICAgICBtb2Rlcz0icnVuLCBkZWJ1ZyIKKyAgICAgICAgICBuYW1lPSIlbGF1bmNoRGVsZWdhdGUubmFtZS4wIgorICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KKyAgICA8L2xhdW5jaERlbGVnYXRlPiAgICAKKyA8L2V4dGVuc2lvbj4KKyAgICAgCQorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+CisJCTxpbml0aWFsaXplcgorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KKwkJPC9pbml0aWFsaXplcj4KKwk8L2V4dGVuc2lvbj4KKyAKKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludm9rZSI+CisJCTxpbnZva2VyIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwLmludm9rZSIKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlci5pbnRlcm5hbC5KQVhQU0FYUHJvY2Vzc29ySW52b2tlciIKKwkJCWNsYXNzcGF0aD0iJHtlY2xpcHNlX29yYml0Om9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Z307JHtlY2xpcHNlX29yYml0Om9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nfTske2VjbGlwc2Vfb3JiaXQ6b3JnLmFwYWNoZS5sb2c0an0iIC8+CisJPC9leHRlbnNpb24+CisKKyAgCTxleHRlbnNpb24KKwkgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcucHJvY2Vzc29yVHlwZSI+CisgICAgIDxwcm9jZXNzb3JUeXBlCisgICAgICAgICAgICBhdHRyaWJ1dGVQcm9wZXJ0aWVzPSJKUkVEZWZhdWx0QXR0cmlidXRlcy5wcm9wZXJ0aWVzIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUuanJlRGVmYXVsdCIKKyAgICAgICAgICAgIGxhYmVsPSIlcHJvY2Vzc29yVHlwZS5sYWJlbC4xIgorICAgICAgICAgICAgb3V0cHV0UHJvcGVydGllcz0iSlJFRGVmYXVsdE91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyIgLz4KKwkgPC9leHRlbnNpb24+CisKKwk8ZXh0ZW5zaW9uCisJICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcucHJvY2Vzc29yIj4KKyAgICAgICAgPHByb2Nlc3NvcgorICAgICAgICAgICAgICBjbGFzc3BhdGg9IiIKKyAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpyZS5kZWZhdWx0IgorICAgICAgICAgICAgICBsYWJlbD0iJXByb2Nlc3Nvci5sYWJlbC4xIgorICAgICAgICAgICAgICBwcm9jZXNzb3JUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUuanJlRGVmYXVsdCIKKyAgICAgICAgICAgICAgc3VwcG9ydHM9IjEuMCIvPgorCSA8L2V4dGVuc2lvbj4KKyAKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NjaGVtYS9kZWJ1Z2dlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NjaGVtYS9kZWJ1Z2dlci5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MmFmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc2NoZW1hL2RlYnVnZ2VyLmV4c2QKQEAgLTAsMCArMSwxMjUgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuamF4cCIgaWQ9ImRlYnVnZ2VyIiBuYW1lPSJYU0xUIERlYnVnZ2VyIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KKyAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVidWdnZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0iZGVidWdnZXIiPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9jZXNzb3JUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk6Ii8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisKKworCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayZxdW90OyZndDtodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayZsdDsvYSZndDsuJmx0O2JyJmd0OworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCitocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zY2hlbWEvaW52b2tlLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc2NoZW1hL2ludm9rZS5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDdlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc2NoZW1hL2ludm9rZS5leHNkCkBAIC0wLDAgKzEsMTAxIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAiIGlkPSJpbnZva2UiIG5hbWU9IlhTTFQgUHJvY2Vzc29yIEludm9rZXIiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxhcHBpbmZvPgorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgorICAgICAgICAgPC9hcHBpbmZvPgorICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnZva2VyIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9Imludm9rZXIiPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBVbmlxdWUgaWQgZm9yIHRoaXMgaW52b2tlcgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIEEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBJUHJvY2Vzc29ySW52b2tlciBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgQSBzZW1pLWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIGphcnMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGNvbnRyaWJ1dGluZyBwbHVnaW4uIE9uZSBvZiB0aGUgamFycyBtdXN0IGNvbnRhaW4gdGhlIEludm9rZXIgY2xhc3MgbmFtZWQgaW4gdGhlIGNsYXNzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKworCisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrJmx0Oy9hJmd0Oy4mbHQ7YnImZ3Q7CitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAorYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAordGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKK2hyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NjaGVtYS9wcm9jZXNzb3IuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zY2hlbWEvcHJvY2Vzc29yLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjMWUyZQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zY2hlbWEvcHJvY2Vzc29yLmV4c2QKQEAgLTAsMCArMSwxNDIgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuamF4cCIgaWQ9InByb2Nlc3NvciIgbmFtZT0iWFNMVCBQcm9jZXNzb3IiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgQ29udHJpYnV0ZSBhIEphdmEgWFNMVCBwcm9jZXNzb3IgaW5zdGFuY2UgKGUuZy4gWGFsYW4gMi43LjApLiBUaGUgZXh0ZW5zaW9uIHBvaW50IHByaW1hcmlseSBkZWZpbmVzIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIGxhdW5jaGluZyBhbiBYU0xUIHRyYW5zZm9ybWF0aW9uLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KKyAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvY2Vzc29yIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NvciI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxhcHBpbmZvPgorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibGFiZWwiLz4KKyAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9jZXNzb3JUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVnZ2VySWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VwcG9ydHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzdXBwb3J0ZWQgWFNMVCB2ZXJzaW9ucyBlLmcuIDEuMCwyLjAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAmbHQ7cHJlJmd0OworICAgJmx0O2V4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcucHJvY2Vzc29yJnF1b3Q7Jmd0OworICAgICAgJmx0O3Byb2Nlc3NvcgorICAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90O3hhbGFuMi43LjAuamFyO3NlcmlhbGl6ZXIyLjcuMC5qYXImcXVvdDsKKyAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnhhbGFuLjJfN18wJnF1b3Q7CisgICAgICAgICAgICBsYWJlbD0mcXVvdDtYYWxhbiAyLjcuMCZxdW90OworICAgICAgICAgICAgcHJvY2Vzc29yVHlwZUlkPSZxdW90O29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4ucHJvY2Vzc29yVHlwZSZxdW90OworICAgICAgICAgICAgZGVidWdnZXJJZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyJnF1b3Q7CisgICAgICAgICAgICBzdXBwb3J0cz0mcXVvdDsxLjAmcXVvdDsmZ3Q7CisgICAgICAmbHQ7L3Byb2Nlc3NvciZndDsKKyAgICZsdDsvZXh0ZW5zaW9uJmd0OworJmx0Oy9wcmUmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKworCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayZxdW90OyZndDtodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayZsdDsvYSZndDsuJmx0O2JyJmd0OworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCitocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zY2hlbWEvcHJvY2Vzc29yVHlwZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NjaGVtYS9wcm9jZXNzb3JUeXBlLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4ZWIyZAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zY2hlbWEvcHJvY2Vzc29yVHlwZS5leHNkCkBAIC0wLDAgKzEsMTYwIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAiIGlkPSJwcm9jZXNzb3JUeXBlIiBuYW1lPSJYU0xUIFByb2Nlc3NvciBUeXBlIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIENvbnRyaWJ1dGUgYSBKYXZhIFhTTFQgcHJvY2Vzc29yIHR5cGUgKGUuZy4gWGFsYW4sIFNheG9uKS4gVGhlIHByb2Nlc3NvciB0eXBlIGRlZmluZXMgd2hpY2ggSkFYUCBhdHRyaWJ1dGVzIGFuZCBvdXRwdXQgcHJvcGVyaWVzIGFyZSBzdXBwb3J0ZWQuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxhcHBpbmZvPgorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgorICAgICAgICAgPC9hcHBpbmZvPgorICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9jZXNzb3JUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NvclR5cGUiPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImxhYmVsIi8+CisgICAgICAgICA8L2FwcGluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InRyYW5zZm9ybWVyRmFjdG9yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgVW5pcXVlIGlkIGZvciB0aGUgcHJvY2Vzc29yIHR5cGUKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBOYW1lIGZvciBkaXNwbGF5IGluIHRoZSBVSQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0UHJvcGVydGllcyIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBMb2NhdGlvbiBvZiBhIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIHRoZSBwcm9jZXNzb3JzIG91dHB1dCBwcm9wZXJ0aWVzLiBNdXN0IGJlIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgYnVuZGxlLgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZVByb3BlcnRpZXMiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgTG9jYXRpb24gb2YgYSBwcm9wZXJ0aWVzIGZpbGUgY29udGFpbmluZyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBzdXBwb3J0ZWQgYnkgdGhpcyBwcm9jZXNzb3IuIE11c3QgYmUgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBidW5kbGUuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9InRyYW5zZm9ybWVyRmFjdG9yeSI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgQSBUcmFuc2Zvcm1lckZhY3RvcnkgZm9yIHRoaXMgdHlwZQorICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCB0cmFuc2Zvcm1lciBmYWN0b3J5IGNsYXNzCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeToiLz4KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgJmx0O3ByZSZndDsKKyAgICZsdDtleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUmcXVvdDsmZ3Q7CisgICAgICAmbHQ7cHJvY2Vzc29yVHlwZQorICAgICAgICAgICAgYXR0cmlidXRlUHJvcGVydGllcz0mcXVvdDtYYWxhbkF0dHJpYnV0ZXMucHJvcGVydGllcyZxdW90OworICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlJnF1b3Q7CisgICAgICAgICAgICBsYWJlbD0mcXVvdDtYYWxhbiZxdW90OworICAgICAgICAgICAgb3V0cHV0UHJvcGVydGllcz0mcXVvdDtYYWxhbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyZxdW90OworICAgICAgICAgICAgdHJhbnNmb3JtZXJGYWN0b3J5PSZxdW90O29yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwmcXVvdDsmZ3Q7CisgICAgICAmbHQ7L3Byb2Nlc3NvclR5cGUmZ3Q7CisgICAmbHQ7L2V4dGVuc2lvbiZndDsKKyZsdDsvcHJlJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisKKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmcXVvdDsmZ3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmbHQ7L2EmZ3Q7LiZsdDticiZndDsKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCit0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQoraHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSUF0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njc5MTRiCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisKKy8qKgorICogQSBhdHRyaWJ1dGUgc3VwcG9ydGVkIGJ5IGFuIFhTTFQgcHJvY2Vzc29yLiAKKyAqIAorICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAorICovCitwdWJsaWMgaW50ZXJmYWNlIElBdHRyaWJ1dGUKK3sKKwkvKioKKwkgKiBDb25zdGFudCBmb3IgYXR0cmlidXRlcyBvZiB0eXBlIDxjb2RlPnN0cmluZzwvY29kZT4KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKi8KKwlTdHJpbmcgVFlQRV9TVFJJTkcgPSAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvbnN0YW50IGZvciBhdHRyaWJ1dGVzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKi8KKwlTdHJpbmcgVFlQRV9CT09MRUFOID0gImJvb2xlYW4iOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQ29uc3RhbnQgZm9yIGF0dHJpYnV0ZXMgb2YgdHlwZSA8Y29kZT5pbnQ8L2NvZGU+CisJICogQHNlZSAjZ2V0VHlwZSgpCisJICovCisJU3RyaW5nIFRZUEVfSU5UID0gImludCI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBDb25zdGFudCBmb3IgYXR0cmlidXRlcyBvZiB0eXBlIDxjb2RlPmRvdWJsZTwvY29kZT4KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKi8KKwlTdHJpbmcgVFlQRV9ET1VCTEUgPSAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvbnN0YW50IGZvciBhdHRyaWJ1dGVzIG9mIHR5cGUgPGNvZGU+ZmxvYXQ8L2NvZGU+CisJICogQHNlZSAjZ2V0VHlwZSgpCisJICovCisJU3RyaW5nIFRZUEVfRkxPQVQgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQ29uc3RhbnQgZm9yIGF0dHJpYnV0ZXMgb2YgdHlwZSA8Y29kZT5jbGFzczwvY29kZT4KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKi8KKwlTdHJpbmcgVFlQRV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBDb25zdGFudCBmb3IgYXR0cmlidXRlcyBvZiB0eXBlIDxjb2RlPm9iamVjdDwvY29kZT4KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKi8KKwlTdHJpbmcgVFlQRV9PQkpFQ1QgPSAib2JqZWN0IjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogR2V0IHRoZSBVUkkgZm9yIHRoaXMgYXR0cmlidXRlCisJICogQHJldHVybiB0aGUgYXR0cmlidXRlIFVSSQorCSAqLworCVN0cmluZyBnZXRVUkkoKTsKKworCS8qKgorCSAqIEdldCBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIGF0dHJpYnV0ZQorCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbgorCSAqLworCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisJLyoqCisJICogR2V0IHRoZSB0eXBlIG9mIHRoaXMgYXR0cmlidXRlLiBXaWxsIG1hdGNoIG9uZSBvZiB0aGUgVFlQRSBjb25zdGFudHMgaW4gdGhpcyBpbnRlcmZhY2UuCisJICogQHJldHVybiB0aGUgYXR0cmlidXRlIHR5cGU6IG9uZSBvZiA8Y29kZT5UWVBFX1NUUklORzwvY29kZT4sIDxjb2RlPlRZUEVfQk9PTEVBTjwvY29kZT4sIAorCSAqIDxjb2RlPlRZUEVfSU5UPC9jb2RlPiwgPGNvZGU+VFlQRV9ET1VCTEU8L2NvZGU+LCA8Y29kZT5UWVBFX0ZMT0FUPC9jb2RlPiwgPGNvZGU+VFlQRV9DTEFTUzwvY29kZT4sIAorCSAqIG9yIDxjb2RlPlRZUEVfT0JKRUNUPC9jb2RlPgorCSAqLworCVN0cmluZyBnZXRUeXBlKCk7CisKKwkvKioKKwkgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWxpZCBvbmUgZm9yIHRoaXMgYXR0cmlidXRlLgorCSAqIEByZXR1cm4gYW4gPGNvZGU+SVN0YXR1czwvY29kZT4gd2l0aCBzZXZlcml0eSA8Y29kZT5PSzwvY29kZT4gaWYgdmFsaWQsIG9yIDxjb2RlPkVSUk9SPC9jb2RlPiBpZiBpbnZhbGlkLgorCSAqLworCUlTdGF0dXMgdmFsaWRhdGVWYWx1ZShTdHJpbmcgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lEZWJ1Z2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lEZWJ1Z2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MDJmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSURlYnVnZ2VyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKKworLyoqCisgKiBBbiBYU0xUIGRlYnVnZ2VyLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGhhdmUgYmVlbiAKKyAqIGNvbnRyaWJ1dGVkIHZpYSB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuZGVidWdnZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KKyAqIAorICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAorICovCitwdWJsaWMgaW50ZXJmYWNlIElEZWJ1Z2dlcgoreworCS8qKgorCSAqIEdldCB0aGUgdW5pcXVlIGlkIGZvciB0aGlzIGRlYnVnZ2VyLgorCSAqIEByZXR1cm4gZGVidWdnZXIgaWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIEdldCB0aGUgc2V0IG9mIGJ1bmRsZS1yZWxhdGl2ZSBqYXIgZmlsZXMgdG8gYWRkIHRvIHRoZSBjbGFzc3BhdGguIAorCSAqIEByZXR1cm4gYXJyYXkgb2YgYnVuZGxlLXJlbGF0aXZlIGphcnMKKwkgKi8KKwlTdHJpbmdbXSBnZXRDbGFzc1BhdGgoKTsKKworCS8qKgorCSAqIEdldCBhIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGRlYnVnZ2VyCisJICogQHJldHVybiB0aGUgbmFtZSBmb3IgdGhlIGRlYnVnZ2VyCisJICovCisJU3RyaW5nIGdldE5hbWUoKTsKKworCS8qKgorCSAqIEdldCB0aGUgcHJvY2Vzc29yIHR5cGUgdGhhdCB0aGlzIGRlYnVnZ2VyIGlzIGFzc29jaWF0ZWQgd2l0aAorCSAqIEByZXR1cm4gdGhlIHByb2Nlc3NvciB0eXBlCisJICovCisJSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZSgpOworCisJLyoqCisJICogR2V0IHRoZSBjbGFzcyBuYW1lIGZvciB0aGlzIGRlYnVnZ2VyCisJICogQHJldHVybiB0aGUgY2xhc3MgbmFtZQorCSAqLworCVN0cmluZyBnZXRDbGFzc05hbWUoKTsKKwkKKwkvKioKKwkgKiBHZXQgdGhlIHRyYW5zZm9ybWVyIGZhY3RvcnkgdGhpcyBkZWJ1Z2dlciBpcyBhc3NvY2lhdGVkIHdpdGgKKwkgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lciBmYWN0b3J5CisJICovCisJU3RyaW5nIGdldFRyYW5zZm9ybWVyRmFjdG9yeSgpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lPdXRwdXRQcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lPdXRwdXRQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDJjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSU91dHB1dFByb3BlcnR5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKKworLyoqCisgKiBBbiBvdXRwdXQgcHJvcGVydHkgc3VwcG9ydGVkIGJ5IGFuIFhTTFQgcHJvY2Vzc29yLiAKKyAqIAorICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAorICovCitwdWJsaWMgaW50ZXJmYWNlIElPdXRwdXRQcm9wZXJ0eQoreworCS8qKgorCSAqIEdldCB0aGUgVVJJIG9mIHRoaXMgb3V0cHV0IHByb3BlcnR5LiAKKwkgKiBAcmV0dXJuIGEgdW5pcXVlIFVSSQorCSAqLworCVN0cmluZyBnZXRVUkkoKTsKKworCS8qKgorCSAqIEdldCBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIG91dHB1dCBwcm9wZXJ0eS4gCisJICogQHJldHVybiBhIGRlc2NyaXB0aW9uCisJICovCisJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSVByb2Nlc3Nvckluc3RhbGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JUHJvY2Vzc29ySW5zdGFsbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYWIyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSVByb2Nlc3Nvckluc3RhbGwuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nOworCisvKioKKyAqIEFuIGluc3RhbmNlIG9mIGFuIFhTTFQgcHJvY2Vzc29yIChlLmcuIFhhbGFuIDIuNy4wKS4KKyAqIAorICogQHNlZSBJUHJvY2Vzc29ySW5zdGFsbAorICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAorICovCitwdWJsaWMgaW50ZXJmYWNlIElQcm9jZXNzb3JJbnN0YWxsCit7CisJLyoqCisJICogR2V0IHRoZSB1bnFpdWUgaWQgb2YgdGhpcyBpbnN0YWxsCisJICogQHJldHVybiB0aGUgdW5pcXVlIGlkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBpbnN0YWxsCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGluc3RhbGwKKwkgKi8KKwlTdHJpbmcgZ2V0TmFtZSgpOworCisJLyoqCisJICogR2V0IHRoZSB0aGUgcHJvY2Vzc29yIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFsbAorCSAqIEByZXR1cm4gdGhlIHByb2Nlc3NvciB0eXBlIGlkCisJICovCisJSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZSgpOworCisJLyoqCisJICogR2V0IHRoZSBqYXIgZmlsZXMgZm9yIHRoaXMgcHJvY2Vzc29yCisJICogQHJldHVybiBhIHNldCBvZiBqYXIgZmlsZXMKKwkgKi8KKwlJUHJvY2Vzc29ySmFyW10gZ2V0UHJvY2Vzc29ySmFycygpOworCisJLyoqCisJICogR2V0IHdoZXRoZXIgdGhpcyBpbnN0YWxsIGhhcyBiZWVuIGNvbnRyaWJ1dGVkIHZpYSB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcucHJvY2Vzc29yPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb250cmlidXRlZCB2aWEgdGhlIGV4dGVuc2lvbiBwb2ludCwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKwkgKi8KKwlib29sZWFuIGlzQ29udHJpYnV0ZWQoKTsKKworCS8qKgorCSAqIEdldCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgWFNMVCB2ZXJzaW9ucworCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbnN0YWxsIGhhcyBhIGRlYnVnZ2VyLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorCSAqLworCS8vIFRPRE8gZGVwcmVjYXRlIGFuZCB1c2UgYm9vbGVhbiBzdXBwb3J0cyBpbnN0YWVkCisJU3RyaW5nIGdldFN1cHBvcnRzKCk7CisKKwkvKioKKwkgKiBHZXQgd2hldGhlciB0aGlzIGluc3RhbGwgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCB4c2x0IHZlcnNpb24uCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGluc3RhbGwgc3VwcG9ydHMgdGhlIHZlcnNpb24sIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisJICovCisJYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgeHNsdFZlcnNpb24pOworCisJLyoqCisJICogR2V0IHRoZSBkZWJ1Z2dlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YWxsCisJICogQHJldHVybiB0aGUgZGVidWdnZXIsIG9yIG51bGwgaWYgbm8gZGVidWdnZXIgaGFzIGJlZW4gc2V0CisJICovCisJSURlYnVnZ2VyIGdldERlYnVnZ2VyKCk7Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSVByb2Nlc3Nvckludm9rZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JUHJvY2Vzc29ySW52b2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MDEwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSVByb2Nlc3Nvckludm9rZXIuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nOworCitwdWJsaWMgaW50ZXJmYWNlIElQcm9jZXNzb3JJbnZva2VyCit7CisJU3RyaW5nIGdldElkKCk7CisKKwlTdHJpbmcgZ2V0SW52b2tlckNsYXNzTmFtZSgpOworCisJU3RyaW5nW10gZ2V0Q2xhc3NwYXRoRW50cmllcygpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lQcm9jZXNzb3JKYXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JUHJvY2Vzc29ySmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwNTJiYgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JUHJvY2Vzc29ySmFyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKKworLyoqCisgKiBBIGphciBmaWxlIGZvciBhbiBYU0xUIHByb2Nlc3NvcgorICogCisgKiBAc2VlIElQcm9jZXNzb3JJbnN0YWxsCisgKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3NvckphcgoreworCS8qKgorCSAqIFRoZSBwYXRoIG1heSBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZTsgaW4gdGhlIHdvcmtzcGFjZSBvciBleHRlcm5hbC4KKwkgKiBAcmV0dXJuIHRoZSBwYXRoIHRvIHRoaXMgamFyCisJICovCisJSVBhdGggZ2V0UGF0aCgpOworCisJLyoqCisJICogVGhlIFVSTCB3aWxsIGFsd2F5cyBiZSBhYnNvbHV0ZSBhbmQgY2FuIGJlIG9wZW5lZC4KKwkgKiBAcmV0dXJuIGEgVVJMIHRvIHRoZSBqYXIKKwkgKi8KKwlVUkwgYXNVUkwoKTsKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JUHJvY2Vzc29yVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lQcm9jZXNzb3JUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzZTcwMAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JUHJvY2Vzc29yVHlwZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgcGFydGljdWxhciB0eXBlIG9mIFhTTFQgUHJvY2Vzc29yIChlLmcuIFhhbGFuKSBmb3Igd2hpY2ggdGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgaW5zdGFsbHMuCisgKiAKKyAqIEBzZWUgSVByb2Nlc3Nvckluc3RhbGwKKyAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKKyAqLworcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc29yVHlwZQoreworCVN0cmluZyBnZXRJZCgpOworCisJU3RyaW5nIGdldExhYmVsKCk7CisKKwlib29sZWFuIGlzSlJFRGVmYXVsdCgpOworCisJSVRyYW5zZm9ybWVyRmFjdG9yeVtdIGdldFRyYW5zZm9ybWVyRmFjdG9yaWVzKCk7CisKKwlJQXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpOworCisJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBdHRyaWJ1dGVWYWx1ZXMoKTsKKworCUlPdXRwdXRQcm9wZXJ0eVtdIGdldE91dHB1dFByb3BlcnRpZXMoKTsKKworCU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoKTsKKworCUlUcmFuc2Zvcm1lckZhY3RvcnkgZ2V0RGVmYXVsdFRyYW5zZm9ybWVyRmFjdG9yeSgpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3MTZhYgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmc7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVRyYW5zZm9ybWVyRmFjdG9yeQoreworCVN0cmluZyBnZXROYW1lKCk7CisJU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpOworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0pBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWNmODJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0pBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuSkFYUExhdW5jaGluZ1BsdWdpbjsKKworcHVibGljIGNsYXNzIEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WT0tFUl9ERVNDUklQVE9SID0gSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLklOVk9LRVJfREVTQ1JJUFRPUiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST0NFU1NPUiA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1BST0NFU1NPUiI7IC8vJE5PTi1OTFMtMSQJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9PVVRQVVRfUFJPUEVSVElFUyA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX09VVFBVVF9QUk9QRVJUSUVTIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVRUUklCVVRFUyA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX0FUVFJJQlVURVMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX0RFQlVHR0lOR19JTlNUQUxMX0lEID0gSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfREVGQVVMVF9ERUJVR0dJTkdfSU5TVEFMTF9JRCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9UUkFOU0ZPUk1FUl9GQUNUT1JZIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhBTEFOX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBWE9OX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi5wcm9jZXNzb3JUeXBlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBWE9OXzFfMF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wuc2F4b25fMV8wLnByb2Nlc3NvclR5cGUiOyAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSkFYUFJ1bnRpbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9KQVhQUnVudGltZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMWRkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSkFYUFJ1bnRpbWUuamF2YQpAQCAtMCwwICsxLDMzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuRmVhdHVyZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuSkFYUExhdW5jaGluZ1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLk91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5Qcm9jZXNzb3JKYXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5Qcm9jZXNzb3JQcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5LkRlYnVnZ2VyUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeS5JbnZva2VyUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeS5Qcm9jZXNzb3JSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5LlByb2Nlc3NvclR5cGVSZWdpc3RyeTsKKworcHVibGljIGNsYXNzIEpBWFBSdW50aW1lCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9QUk9DRVNTT1JfWE1MID0gIlBSRUZfUFJPQ0VTU09SX1hNTCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0ZFQVRVUkVfWE1MID0gIlBSRUZfRkVBVFVSRV9YTUwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9PVVRQVVRfUFJPUEVSVElFU19YTUwgPSAiUFJFRl9PVVRQVVRfUFJPUEVSVElFU19YTUwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlJFX0RFRkFVTFRfUFJPQ0VTU09SX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpyZS5kZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUuanJlRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBORVhUX0lEX0xPQ0sgPSBuZXcgYnl0ZVswXTsKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gUkVHSVNUUllfTE9DSyA9IG5ldyBieXRlWzBdOworCisJcHJpdmF0ZSBzdGF0aWMgaW50IGxhc3RTdGFuZGluSUQ7CisJcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5IHByb2Nlc3NvclR5cGVSZWdpc3RyeTsKKwlwcml2YXRlIHN0YXRpYyBQcm9jZXNzb3JSZWdpc3RyeSBwcm9jZXNzb3JSZWdpc3RyeTsKKwlwcml2YXRlIHN0YXRpYyBJbnZva2VyUmVnaXN0cnkgaW52b2tlclJlZ2lzdHJ5OworCXByaXZhdGUgc3RhdGljIERlYnVnZ2VyUmVnaXN0cnkgZGVidWdnZXJSZWdpc3RyeTsKKworCXByaXZhdGUgc3RhdGljIFByb2Nlc3NvclR5cGVSZWdpc3RyeSBnZXRQcm9jZXNzb3JUeXBlUmVnaXN0cnkoKQorCXsKKwkJc3luY2hyb25pemVkIChSRUdJU1RSWV9MT0NLKQorCQl7CisJCQlpZiAocHJvY2Vzc29yVHlwZVJlZ2lzdHJ5ID09IG51bGwpCisJCQkJcHJvY2Vzc29yVHlwZVJlZ2lzdHJ5ID0gbmV3IFByb2Nlc3NvclR5cGVSZWdpc3RyeSgpOworCQl9CisJCXJldHVybiBwcm9jZXNzb3JUeXBlUmVnaXN0cnk7CisJfQorCisJcHVibGljIHN0YXRpYyBQcm9jZXNzb3JSZWdpc3RyeSBnZXRQcm9jZXNzb3JSZWdpc3RyeSgpCisJeworCQlzeW5jaHJvbml6ZWQgKFJFR0lTVFJZX0xPQ0spCisJCXsKKwkJCWlmIChwcm9jZXNzb3JSZWdpc3RyeSA9PSBudWxsKQorCQkJCXByb2Nlc3NvclJlZ2lzdHJ5ID0gbmV3IFByb2Nlc3NvclJlZ2lzdHJ5KCk7CisJCX0KKwkJcmV0dXJuIHByb2Nlc3NvclJlZ2lzdHJ5OworCX0KKworCXByaXZhdGUgc3RhdGljIEludm9rZXJSZWdpc3RyeSBnZXRJbnZva2VyUmVnaXN0cnkoKQorCXsKKwkJc3luY2hyb25pemVkIChSRUdJU1RSWV9MT0NLKQorCQl7CisJCQlpZiAoaW52b2tlclJlZ2lzdHJ5ID09IG51bGwpCisJCQkJaW52b2tlclJlZ2lzdHJ5ID0gbmV3IEludm9rZXJSZWdpc3RyeSgpOworCQl9CisJCXJldHVybiBpbnZva2VyUmVnaXN0cnk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGVidWdnZXJSZWdpc3RyeSBnZXREZWJ1Z2dlclJlZ2lzdHJ5KCkKKwl7CisJCXN5bmNocm9uaXplZCAoUkVHSVNUUllfTE9DSykKKwkJeworCQkJaWYgKGRlYnVnZ2VyUmVnaXN0cnkgPT0gbnVsbCkKKwkJCQlkZWJ1Z2dlclJlZ2lzdHJ5ID0gbmV3IERlYnVnZ2VyUmVnaXN0cnkoKTsKKwkJfQorCQlyZXR1cm4gZGVidWdnZXJSZWdpc3RyeTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKQorCXsKKwkJSkFYUExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJCXN5bmNocm9uaXplZCAoUkVHSVNUUllfTE9DSykKKwkJeworCQkJLy8gZm9yY2UgdGhlIHJlZ2lzdHJpZXMgdG8gYmUgcmUtaW5pdGlhbGlzZWQgbmV4dCB0aW1lIGl0IGlzIHJlcXVpcmVkCisJCQlwcm9jZXNzb3JSZWdpc3RyeSA9IG51bGw7CisJCQlwcm9jZXNzb3JUeXBlUmVnaXN0cnkgPSBudWxsOworCQl9CisJfQorCisJLyoqCisJICogRmluZCBhIHVuaXF1ZSBwcm9jZXNzb3IgaW5zdGFsbCBpZC4gQ2hlY2sgZXhpc3RpbmcgJ3JlYWwnIHByb2Nlc3NvcnMsIGFzCisJICogd2VsbCBhcyB0aGUgbGFzdCBpZCB1c2VkIGZvciBhIHN0YW5kaW4uCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVW5pcXVlUHJvY2Vzc29ySWQoSVByb2Nlc3NvclR5cGUgdHlwZSkKKwl7CisJCUlQcm9jZXNzb3JJbnN0YWxsW10gaW5zdGFsbHMgPSBKQVhQUnVudGltZS5nZXRQcm9jZXNzb3JzKHR5cGUuZ2V0SWQoKSk7CisJCVN0cmluZyBpZCA9IG51bGw7CisJCXN5bmNocm9uaXplZCAoTkVYVF9JRF9MT0NLKQorCQl7CisJCQlkbworCQkJeworCQkJCWlkID0gU3RyaW5nLnZhbHVlT2YoKytsYXN0U3RhbmRpbklEKTsKKwkJCX0KKwkJCXdoaWxlIChpc1Rha2VuKGlkLCBpbnN0YWxscykpOworCQl9CisJCXJldHVybiBpZDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JKYXIgY3JlYXRlUHJvY2Vzc29ySmFyKElQYXRoIHBhdGgpCisJeworCQlyZXR1cm4gbmV3IFByb2Nlc3NvckphcihwYXRoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFrZW4oU3RyaW5nIGlkLCBJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzKQorCXsKKwkJZm9yIChJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsIDogaW5zdGFsbHMpCisJCXsKKwkJCWlmIChpbnN0YWxsLmdldElkKCkuZXF1YWxzKGlkKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBJRGVidWdnZXJbXSBnZXREZWJ1Z2dlcnMoKQorCXsKKwkJcmV0dXJuIGdldERlYnVnZ2VyUmVnaXN0cnkoKS5nZXREZWJ1Z2dlcnMoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElEZWJ1Z2dlciBnZXREZWJ1Z2dlcihTdHJpbmcgaWQpCisJeworCQlyZXR1cm4gZ2V0RGVidWdnZXJSZWdpc3RyeSgpLmdldERlYnVnZ2VyKGlkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JJbnN0YWxsW10gZ2V0UHJvY2Vzc29ycygpCisJeworCQlyZXR1cm4gZ2V0UHJvY2Vzc29yUmVnaXN0cnkoKS5nZXRQcm9jZXNzb3JzKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbFtdIGdldFByb2Nlc3NvcnMoU3RyaW5nIHR5cGVJZCkKKwl7CisJCXJldHVybiBnZXRQcm9jZXNzb3JSZWdpc3RyeSgpLmdldFByb2Nlc3NvcnModHlwZUlkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JJbnN0YWxsIGdldFByb2Nlc3NvcihTdHJpbmcgcHJvY2Vzc29ySWQpCisJeworCQlJUHJvY2Vzc29ySW5zdGFsbFtdIHByb2Nlc3NvcnMgPSBnZXRQcm9jZXNzb3JzKCk7CisJCWZvciAoSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA6IHByb2Nlc3NvcnMpCisJCXsKKwkJCWlmIChpbnN0YWxsLmdldElkKCkuZXF1YWxzKHByb2Nlc3NvcklkKSkKKwkJCQlyZXR1cm4gaW5zdGFsbDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JJbnN0YWxsIGdldERlZmF1bHRQcm9jZXNzb3IoKQorCXsKKwkJcmV0dXJuIGdldFByb2Nlc3NvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdFByb2Nlc3NvcigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckluc3RhbGwgZ2V0SlJFRGVmYXVsdFByb2Nlc3NvcigpCisJeworCQlyZXR1cm4gZ2V0UHJvY2Vzc29yUmVnaXN0cnkoKS5nZXRKUkVEZWZhdWx0UHJvY2Vzc29yKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBJUHJvY2Vzc29yVHlwZVtdIGdldFByb2Nlc3NvclR5cGVzKCkKKwl7CisJCXJldHVybiBnZXRQcm9jZXNzb3JUeXBlUmVnaXN0cnkoKS5nZXRQcm9jZXNzb3JUeXBlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3NvclR5cGVbXSBnZXRQcm9jZXNzb3JUeXBlc0V4Y2xKUkVEZWZhdWx0KCkKKwl7CisJCXJldHVybiBnZXRQcm9jZXNzb3JUeXBlUmVnaXN0cnkoKS5nZXRQcm9jZXNzb3JUeXBlc0V4Y2xKUkVEZWZhdWx0KCk7CisJfQorCisJcHVibGljIHN0YXRpYyBJUHJvY2Vzc29yVHlwZSBnZXRQcm9jZXNzb3JUeXBlKFN0cmluZyBpZCkKKwl7CisJCXJldHVybiBnZXRQcm9jZXNzb3JUeXBlUmVnaXN0cnkoKS5nZXRQcm9jZXNzb3JUeXBlKGlkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JJbnZva2VyIGdldFByb2Nlc3Nvckludm9rZXIoU3RyaW5nIGludm9rZXJJZCkKKwl7CisJCXJldHVybiBnZXRJbnZva2VyUmVnaXN0cnkoKS5nZXRQcm9jZXNzb3JJbnZva2VyKGludm9rZXJJZCk7CisJfQorCisJcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW52b2tlcltdIGdldFByb2Nlc3Nvckludm9rZXJzKCkKKwl7CisJCXJldHVybiBnZXRJbnZva2VyUmVnaXN0cnkoKS5nZXRQcm9jZXNzb3JJbnZva2VycygpOworCX0KKworCXByaXZhdGUgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkKKwl7CisJCXJldHVybiBKQVhQTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlRmVhdHVyZVByZWZlcmVuY2VzKE1hcDxJUHJvY2Vzc29yVHlwZSwgTWFwPFN0cmluZywgU3RyaW5nPj4gdHlwZUZlYXR1cmVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCisJeworCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQlyZXR1cm47CisJCXRyeQorCQl7CisJCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTFRSdW50aW1lLjUiKSwgMTAwKTsgLy8kTk9OLU5MUy0xJAorCQkJRmVhdHVyZVByZWZlcmVuY2VzIHByZWZzID0gbmV3IEZlYXR1cmVQcmVmZXJlbmNlcygpOworCQkJTWFwPFN0cmluZyxNYXA8U3RyaW5nLFN0cmluZz4+IHR5cGVJZEZlYXR1cmVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsU3RyaW5nPj4odHlwZUZlYXR1cmVzLnNpemUoKSk7CisJCQlmb3IgKElQcm9jZXNzb3JUeXBlIHR5cGUgOiB0eXBlRmVhdHVyZXMua2V5U2V0KCkpCisJCQl7CisJCQkJTWFwPFN0cmluZyxTdHJpbmc+IHZhbHVlcyA9IHR5cGVGZWF0dXJlcy5nZXQodHlwZSk7CisJCQkJdHlwZUlkRmVhdHVyZXMucHV0KHR5cGUuZ2V0SWQoKSwgdmFsdWVzKTsKKwkJCX0KKwkJCXByZWZzLnNldFR5cGVGZWF0dXJlcyh0eXBlSWRGZWF0dXJlcyk7CisJCQlTdHJpbmcgeG1sID0gcHJlZnMuZ2V0QXNYTUwoKTsKKwkJCW1vbml0b3Iud29ya2VkKDQwKTsKKwkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQlyZXR1cm47CisJCQlKQVhQUnVudGltZS5nZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKEpBWFBSdW50aW1lLlBSRUZfRkVBVFVSRV9YTUwsIHhtbCk7CisJCQltb25pdG9yLndvcmtlZCgzMCk7CisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuOworCQkJSkFYUFJ1bnRpbWUuc2F2ZVByZWZlcmVuY2VzKCk7CisJCQltb25pdG9yLndvcmtlZCgzMCk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQorCQl7CisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUUnVudGltZS42IiksZSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJZmluYWxseQorCQl7CisJCQltb25pdG9yLmRvbmUoKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyhNYXA8SVByb2Nlc3NvclR5cGUsIE1hcDxTdHJpbmcsU3RyaW5nPj4gdHlwZVByb3BlcnRpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCXJldHVybjsKKwkJdHJ5CisJCXsKKwkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVFJ1bnRpbWUuNyIpLCAxMDApOyAvLyROT04tTkxTLTEkCisJCQlPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzIHByZWZzID0gbmV3IE91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMoKTsKKwkJCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IHR5cGVQcm9wZXJ0aWVzLmtleVNldCgpKQorCQkJeworCQkJCXByZWZzLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKHR5cGUuZ2V0SWQoKSwgdHlwZVByb3BlcnRpZXMuZ2V0KHR5cGUpKTsKKwkJCX0KKwkJCVN0cmluZyB4bWwgPSBwcmVmcy5nZXRBc1hNTCgpOworCQkJbW9uaXRvci53b3JrZWQoNDApOworCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJCXJldHVybjsKKwkJCUpBWFBSdW50aW1lLmdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSkFYUFJ1bnRpbWUuUFJFRl9PVVRQVVRfUFJPUEVSVElFU19YTUwsIHhtbCk7CisJCQltb25pdG9yLndvcmtlZCgzMCk7CisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuOworCQkJSkFYUFJ1bnRpbWUuc2F2ZVByZWZlcmVuY2VzKCk7CisJCQltb25pdG9yLndvcmtlZCgzMCk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQorCQl7CisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUUnVudGltZS44IiksZSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJZmluYWxseQorCQl7CisJCQltb25pdG9yLmRvbmUoKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlUHJvY2Vzc29yUHJlZmVyZW5jZXMoSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscywgSVByb2Nlc3Nvckluc3RhbGwgZGVmYXVsdEluc3RhbGwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCXJldHVybjsKKwkJdHJ5CisJCXsKKwkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVFJ1bnRpbWUuOSIpLCAxMDApOyAvLyROT04tTkxTLTEkCisJCQlQcm9jZXNzb3JQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBQcm9jZXNzb3JQcmVmZXJlbmNlcygpOworCQkJaWYgKGRlZmF1bHRJbnN0YWxsICE9IG51bGwpCisJCQkJcHJlZnMuc2V0RGVmYXVsdFByb2Nlc3NvcklkKGRlZmF1bHRJbnN0YWxsLmdldElkKCkpOworCQkJcHJlZnMuc2V0UHJvY2Vzc29ycyhuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPihBcnJheXMuYXNMaXN0KGluc3RhbGxzKSkpOworCQkJU3RyaW5nIHhtbCA9IHByZWZzLmdldEFzWE1MKCk7CisJCQltb25pdG9yLndvcmtlZCg0MCk7CisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuOworCQkJSkFYUFJ1bnRpbWUuZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShKQVhQUnVudGltZS5QUkVGX1BST0NFU1NPUl9YTUwsIHhtbCk7CisJCQltb25pdG9yLndvcmtlZCgzMCk7CisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuOworCQkJSkFYUFJ1bnRpbWUuc2F2ZVByZWZlcmVuY2VzKCk7CisJCQltb25pdG9yLndvcmtlZCgzMCk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQorCQl7CisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUUnVudGltZS4xMCIpLGUpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWZpbmFsbHkKKwkJeworCQkJbW9uaXRvci5kb25lKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsU3RyaW5nPiBjcmVhdGVEZWZhdWx0T3V0cHV0UHJvcGVydGllcyhTdHJpbmcgdHlwZUlkKQorCXsKKwkJTWFwPFN0cmluZyxTdHJpbmc+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKKwkJaWYgKEpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lELmVxdWFscyh0eXBlSWQpKQorCQkJcHJvcHMucHV0KCJpbmRlbnQiLCAieWVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQllbHNlIGlmIChKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5YQUxBTl9UWVBFX0lELmVxdWFscyh0eXBlSWQpKQorCQl7CisJCQlwcm9wcy5wdXQoImluZGVudCIsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlwcm9wcy5wdXQoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwkJZWxzZSBpZiAoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FYT05fVFlQRV9JRC5lcXVhbHModHlwZUlkKSkKKwkJeworCQkJcHJvcHMucHV0KCJpbmRlbnQiLCAieWVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJcHJvcHMucHV0KCJ7aHR0cDovL3NheG9uLnNmLm5ldC99aW5kZW50LXNwYWNlcyIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJCWVsc2UgaWYgKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBWE9OXzFfMF9UWVBFX0lELmVxdWFscyh0eXBlSWQpKQorCQl7CisJCQlwcm9wcy5wdXQoImluZGVudCIsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlwcm9wcy5wdXQoIntodHRwOi8vc2F4b24uc2YubmV0L31pbmRlbnQtc3BhY2VzIiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwkJcmV0dXJuIHByb3BzOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9MYXVuY2hBdHRyaWJ1dGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvTGF1bmNoQXR0cmlidXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzMzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvTGF1bmNoQXR0cmlidXRlcy5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuUHJlZmVyZW5jZVV0aWw7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworcHVibGljIGNsYXNzIExhdW5jaEF0dHJpYnV0ZXMKK3sKKwlwcml2YXRlIGZpbmFsIFNldDxMYXVuY2hBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldDxMYXVuY2hBdHRyaWJ1dGU+KCk7CisKKwlwdWJsaWMgU2V0PExhdW5jaEF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlcygpCisJeworCQlyZXR1cm4gYXR0cmlidXRlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoTGF1bmNoQXR0cmlidXRlIGF0dHJpYnV0ZSkKKwl7CisJCWF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7CisJfQorCisJcHVibGljIExhdW5jaEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIHVyaSkKKwl7CisJCWZvciAoSXRlcmF0b3I8TGF1bmNoQXR0cmlidXRlPiBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCisJCXsKKwkJCUxhdW5jaEF0dHJpYnV0ZSB0diA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOworCQkJaWYgKHR2LnVyaS5lcXVhbHModXJpKSkKKwkJCQlyZXR1cm4gdHY7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQXRyaWJ1dGUoU3RyaW5nIHVyaSkKKwl7CisJCWZvciAoSXRlcmF0b3I8TGF1bmNoQXR0cmlidXRlPiBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCisJCXsKKwkJCUxhdW5jaEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoTGF1bmNoQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKKwkJCWlmIChhdHRyaWJ1dGUudXJpLmVxdWFscyh1cmkpKQorCQkJCWl0ZXIucmVtb3ZlKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvWE1MKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorCXsKKwkJRG9jdW1lbnQgZG9jID0gUHJlZmVyZW5jZVV0aWwuZ2V0RG9jdW1lbnQoKTsKKworCQlFbGVtZW50IGF0dHJpYnV0ZXNFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJBdHRyaWJ1dGVzIik7IC8vJE5PTi1OTFMtMSQKKwkJZG9jLmFwcGVuZENoaWxkKGF0dHJpYnV0ZXNFbCk7CisKKwkJZm9yIChJdGVyYXRvcjxMYXVuY2hBdHRyaWJ1dGU+IGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKKwkJeworCQkJTGF1bmNoQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOworCQkJRWxlbWVudCBhdHRyaWJ1dGVFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYXR0cmlidXRlRWwuc2V0QXR0cmlidXRlKCJuYW1lIiwgYXR0cmlidXRlLnVyaSk7IC8vJE5PTi1OTFMtMSQKKwkJCWF0dHJpYnV0ZUVsLnNldEF0dHJpYnV0ZSgidHlwZSIsIGF0dHJpYnV0ZS50eXBlKTsgLy8kTk9OLU5MUy0xJAorCQkJYXR0cmlidXRlRWwuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIGF0dHJpYnV0ZS52YWx1ZSk7IC8vJE5PTi1OTFMtMSQKKwkJCWF0dHJpYnV0ZXNFbC5hcHBlbmRDaGlsZChhdHRyaWJ1dGVFbCk7CisJCX0KKworCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuc2VyaWFsaXplRG9jdW1lbnQoZG9jKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExhdW5jaEF0dHJpYnV0ZXMgZnJvbVhNTChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KGlucHV0U3RyZWFtKTsKKworCQlMYXVuY2hBdHRyaWJ1dGVzIHBkZWYgPSBuZXcgTGF1bmNoQXR0cmlidXRlcygpOworCisJCUVsZW1lbnQgYXR0cmlidXRlc0VsID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworCisJCU5vZGVMaXN0IGF0dHJpYnV0ZUVscyA9IGF0dHJpYnV0ZXNFbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVFbHMuZ2V0TGVuZ3RoKCk7IGkrKykKKwkJeworCQkJRWxlbWVudCBhdHRyaWJ1dGVFbCA9IChFbGVtZW50KSBhdHRyaWJ1dGVFbHMuaXRlbShpKTsKKwkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlRWwuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyB0eXBlID0gYXR0cmlidXRlRWwuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyB2YWx1ZSA9IGF0dHJpYnV0ZUVsLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAorCQkJcGRlZi5hZGRBdHRyaWJ1dGUobmV3IExhdW5jaEF0dHJpYnV0ZShuYW1lLCB0eXBlLCB2YWx1ZSkpOworCQl9CisKKwkJcmV0dXJuIHBkZWY7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0xhdW5jaFByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9MYXVuY2hQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5OWViMQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9MYXVuY2hQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLlByZWZlcmVuY2VVdGlsOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBMYXVuY2hQcm9wZXJ0aWVzCit7CisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKQorCXsKKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKKwl7CisJCXByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKQorCXsKKwkJcmV0dXJuIChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KG5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBuYW1lKQorCXsKKwkJcHJvcGVydGllcy5yZW1vdmUobmFtZSk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KKwl7CisJCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7CisKKwkJRWxlbWVudCBwcm9wZXJ0eXNFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJQcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKKwkJZG9jLmFwcGVuZENoaWxkKHByb3BlcnR5c0VsKTsKKworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpCisJCXsKKwkJCVN0cmluZyBuYW1lID0gcHJvcGVydHkuZ2V0S2V5KCk7CisJCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOworCQkJRWxlbWVudCBwcm9wZXJ0eUVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXByb3BlcnR5RWwuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCXByb3BlcnR5RWwuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAorCQkJcHJvcGVydHlzRWwuYXBwZW5kQ2hpbGQocHJvcGVydHlFbCk7CisJCX0KKworCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuc2VyaWFsaXplRG9jdW1lbnQoZG9jKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExhdW5jaFByb3BlcnRpZXMgZnJvbVhNTChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KGlucHV0U3RyZWFtKTsKKworCQlMYXVuY2hQcm9wZXJ0aWVzIHBkZWYgPSBuZXcgTGF1bmNoUHJvcGVydGllcygpOworCisJCUVsZW1lbnQgcHJvcGVydHlzRWwgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisKKwkJTm9kZUxpc3QgcHJvcGVydHlFbHMgPSBwcm9wZXJ0eXNFbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiUHJvcGVydHkiKTsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RWxzLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCUVsZW1lbnQgcHJvcGVydHlFbCA9IChFbGVtZW50KSBwcm9wZXJ0eUVscy5pdGVtKGkpOworCQkJU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eUVsLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eUVsLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAorCQkJcGRlZi5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisJCX0KKworCQlyZXR1cm4gcGRlZjsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTRmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL1Byb2Nlc3Nvckluc3RhbGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9Qcm9jZXNzb3JJbnN0YWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlODcxNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9Qcm9jZXNzb3JJbnN0YWxsLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmc7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuSkFYUExhdW5jaGluZ1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLlBsdWdpblByb2Nlc3NvckphcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLlV0aWxzOworCitwdWJsaWMgY2xhc3MgUHJvY2Vzc29ySW5zdGFsbCBpbXBsZW1lbnRzIElQcm9jZXNzb3JJbnN0YWxsCit7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCXByaXZhdGUgSVByb2Nlc3NvckphcltdIGphcnM7CisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbnRyaWJ1dGVkOworCXByaXZhdGUgU3RyaW5nIGRlYnVnZ2VySWQ7CisJcHJpdmF0ZSBTdHJpbmcgc3VwcG9ydHM7CisKKwlwdWJsaWMgUHJvY2Vzc29ySW5zdGFsbChTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHR5cGVJZCwgSVByb2Nlc3NvckphcltdIGphcnMsIFN0cmluZyBkZWJ1Z2dlcklkLCBTdHJpbmcgc3VwcG9ydHMsIGJvb2xlYW4gY29udHJpYnV0ZWQpCisJeworCQl0aGlzLmlkID0gaWQ7CisJCW5hbWUgPSBsYWJlbDsKKwkJdHlwZSA9IHR5cGVJZDsKKwkJdGhpcy5kZWJ1Z2dlcklkID0gZGVidWdnZXJJZDsKKwkJdGhpcy5jb250cmlidXRlZCA9IGNvbnRyaWJ1dGVkOworCQl0aGlzLmphcnMgPSBqYXJzOworCQl0aGlzLnN1cHBvcnRzID0gc3VwcG9ydHM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJZCgpCisJeworCQlyZXR1cm4gaWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkKKwl7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCisJeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCXB1YmxpYyBJUHJvY2Vzc29ySmFyW10gZ2V0UHJvY2Vzc29ySmFycygpCisJeworCQlyZXR1cm4gamFyczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzb3JKYXJzKElQcm9jZXNzb3JKYXJbXSBqYXJzKQorCXsKKwkJdGhpcy5qYXJzID0gamFyczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3NvclR5cGVJZCgpCisJeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZSgpCisJeworCQlyZXR1cm4gSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZSh0eXBlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzb3JUeXBlSWQoU3RyaW5nIGlkKQorCXsKKwkJdHlwZSA9IGlkOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ29udHJpYnV0ZWQoKQorCXsKKwkJcmV0dXJuIGNvbnRyaWJ1dGVkOworCX0KKworCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3NvckphcltdIGNyZWF0ZUphcnMoU3RyaW5nIGJ1bmRsZUlkLCBTdHJpbmcgY2xhc3NwYXRoKQorCXsKKwkJSVByb2Nlc3NvckphcltdIGphcnM7CisJCWlmIChjbGFzc3BhdGggPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgSVByb2Nlc3NvckphclswXTsKKwkJU3RyaW5nW10gamFyc3RyaW5nID0gY2xhc3NwYXRoLnNwbGl0KCI7Iik7IC8vJE5PTi1OTFMtMSQKKwkJamFycyA9IG5ldyBJUHJvY2Vzc29ySmFyW2phcnN0cmluZy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGphcnN0cmluZy5sZW5ndGg7IGkrKykKKwkJeworCQkJU3RyaW5nIGphciA9IGphcnN0cmluZ1tpXTsKKwkJCXRyeQorCQkJeworCQkJCWlmIChqYXIuc3RhcnRzV2l0aCgiJHtlY2xpcHNlX29yYml0OiIpICYmIGphci5lbmRzV2l0aCgifSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl7CisJCQkJCWphciA9IGphci5zdWJzdHJpbmcoIiR7ZWNsaXBzZV9vcmJpdDoiLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlqYXIgPSBqYXIuc3Vic3RyaW5nKDAsamFyLmxlbmd0aCgpLTEpOworCQkJCQkvL2phciA9IFV0aWxzLmdldEZpbGVMb2NhdGlvbihqYXIsIiIpOworCQkJCQlqYXJzW2ldID0gbmV3IFBsdWdpblByb2Nlc3NvckphcihqYXIsIG51bGwpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlqYXIgPSBVdGlscy5nZXRGaWxlTG9jYXRpb24oYnVuZGxlSWQsamFyKTsKKwkJCQkJamFyc1tpXSA9IG5ldyBQbHVnaW5Qcm9jZXNzb3JKYXIoYnVuZGxlSWQsIG5ldyBQYXRoKGphcikpOworCQkJCX0KKwkJCX0KKwkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCisJCQl7CisJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGphcnM7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzRGVidWdnZXIoKQorCXsKKwkJcmV0dXJuIGRlYnVnZ2VySWQgIT0gbnVsbDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgeHNsdFZlcnNpb24pCisJeworCQlyZXR1cm4gc3VwcG9ydHMuaW5kZXhPZih4c2x0VmVyc2lvbikgPj0gMDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN1cHBvcnRzKCkKKwl7CisJCXJldHVybiBzdXBwb3J0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdXBwb3J0cyhTdHJpbmcgc3VwcG9ydHMpCisJeworCQl0aGlzLnN1cHBvcnRzID0gc3VwcG9ydHM7CisJfQorCisJcHVibGljIElEZWJ1Z2dlciBnZXREZWJ1Z2dlcigpCisJeworCQlyZXR1cm4gSkFYUFJ1bnRpbWUuZ2V0RGVidWdnZXIoZGVidWdnZXJJZCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVidWdnZXJJZChTdHJpbmcgZGVidWdnZXJJZCkKKwl7CisJCXRoaXMuZGVidWdnZXJJZCA9IGRlYnVnZ2VySWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0F0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0F0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTM1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSUF0dHJpYnV0ZTsKKworcHVibGljIGNsYXNzIEF0dHJpYnV0ZSBpbXBsZW1lbnRzIElBdHRyaWJ1dGUsIENvbXBhcmFibGU8T2JqZWN0PgoreworCXByaXZhdGUgZmluYWwgU3RyaW5nIHVyaTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlOworCisJcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgdXJpLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGRlc2NyaXB0aW9uKQorCXsKKwkJdGhpcy51cmkgPSB1cmk7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQorCXsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVUkkoKQorCXsKKwkJcmV0dXJuIHVyaTsKKwl9CisKKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVZhbHVlKFN0cmluZyB2YWx1ZSkKKwl7CisJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKKwkJaWYgKFRZUEVfQk9PTEVBTi5lcXVhbHModHlwZSkpCisJCXsKKwkJCWJvb2xlYW4gdmFsaWQgPSAidHJ1ZSIuZXF1YWxzKHZhbHVlKSB8fCAiZmFsc2UiLmVxdWFscyh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJaWYgKCF2YWxpZCkKKwkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkF0dHJpYnV0ZS4yIiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJZWxzZSBpZiAoVFlQRV9JTlQuZXF1YWxzKHR5cGUpKQorCQl7CisJCQl0cnkKKwkJCXsKKwkJCQlJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKwkJCX0KKwkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKKwkJCXsKKwkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkF0dHJpYnV0ZS4xIiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJZWxzZSBpZiAoVFlQRV9ET1VCTEUuZXF1YWxzKHR5cGUpKQorCQl7CisJCQl0cnkKKwkJCXsKKwkJCQlEb3VibGUucGFyc2VEb3VibGUodmFsdWUpOworCQkJfQorCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQorCQkJeworCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmdldFN0cmluZygiQXR0cmlidXRlLjAiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQllbHNlIGlmIChUWVBFX0ZMT0FULmVxdWFscyh0eXBlKSkKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJRmxvYXQucGFyc2VGbG9hdCh2YWx1ZSk7CisJCQl9CisJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCisJCQl7CisJCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJBdHRyaWJ1dGUuNSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWVsc2UgaWYgKFRZUEVfQ0xBU1MuZXF1YWxzKHR5cGUpIHx8IFRZUEVfT0JKRUNULmVxdWFscyh0eXBlKSkKKwkJeworCQkJLy9zdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUodmFsdWUpOworCQl9CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pCisJeworCQlpZiAobyBpbnN0YW5jZW9mIElBdHRyaWJ1dGUpCisJCXsKKwkJCUlBdHRyaWJ1dGUgZiA9IChJQXR0cmlidXRlKSBvOworCQkJcmV0dXJuIGYuZ2V0VVJJKCkuY29tcGFyZVRvKGdldFVSSSgpKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvRGVidWdnZXJEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvRGVidWdnZXJEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxZGM3MQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9EZWJ1Z2dlckRlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JRGVidWdnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOworCitwdWJsaWMgY2xhc3MgRGVidWdnZXJEZXNjcmlwdG9yIGltcGxlbWVudHMgSURlYnVnZ2VyCit7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBjbGFzc3BhdGg7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVuZGxlSWQ7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9jZXNzb3JUeXBlSWQ7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOworCXByaXZhdGUgZmluYWwgU3RyaW5nIHRyYW5zZm9ybWVyRmFjdG9yeTsKKworCXB1YmxpYyBEZWJ1Z2dlckRlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgYnVuZGxlSWQsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZ1tdIGNsYXNzcGF0aCwgU3RyaW5nIG5hbWUsIFN0cmluZyBwcm9jZXNzb3JUeXBlSWQsIFN0cmluZyB0cmFuc2Zvcm1lckZhY3RvcnkpCisJeworCQl0aGlzLmlkID0gaWQ7CisJCXRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOworCQl0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMucHJvY2Vzc29yVHlwZUlkID0gcHJvY2Vzc29yVHlwZUlkOworCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKwkJdGhpcy50cmFuc2Zvcm1lckZhY3RvcnkgPSB0cmFuc2Zvcm1lckZhY3Rvcnk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQorCXsKKwkJcmV0dXJuIGNsYXNzTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NQYXRoKCkKKwl7CisJCXJldHVybiBQcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvci5jcmVhdGVFbnRyaWVzKGJ1bmRsZUlkLCBjbGFzc3BhdGgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKQorCXsKKwkJcmV0dXJuIGlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisJeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZSgpCisJeworCQlyZXR1cm4gSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZShwcm9jZXNzb3JUeXBlSWQpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNmb3JtZXJGYWN0b3J5KCkKKwl7CisJCXJldHVybiB0cmFuc2Zvcm1lckZhY3Rvcnk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0ZlYXR1cmVQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0ZlYXR1cmVQcmVmZXJlbmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTdjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvRmVhdHVyZVByZWZlcmVuY2VzLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5QcmVmZXJlbmNlVXRpbDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCitwdWJsaWMgY2xhc3MgRmVhdHVyZVByZWZlcmVuY2VzCit7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiB0eXBlRmVhdHVyZXM7CisKKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRGZWF0dXJlc1ZhbHVlcyhTdHJpbmcgdHlwZUlkKQorCXsKKwkJcmV0dXJuIHR5cGVGZWF0dXJlcy5nZXQodHlwZUlkKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlRmVhdHVyZXMoTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gdHlwZUZlYXR1cmVzKQorCXsKKwkJdGhpcy50eXBlRmVhdHVyZXMgPSB0eXBlRmVhdHVyZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBc1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KKwl7CisJCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7CisJCUVsZW1lbnQgY29uZmlnID0gZG9jLmNyZWF0ZUVsZW1lbnQoImZlYXR1cmVQcmVmZXJlbmNlcyIpOyAgLy8kTk9OLU5MUy0xJAorCQlkb2MuYXBwZW5kQ2hpbGQoY29uZmlnKTsKKwkJCisJCWZvciAoU3RyaW5nIHR5cGVJZCA6IHR5cGVGZWF0dXJlcy5rZXlTZXQoKSkKKwkJeworCQkJRWxlbWVudCBwcm9jZXNzb3JUeXBlRWxlbWVudCA9IHR5cGVBc0VsZW1lbnQoZG9jLCB0eXBlSWQpOworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlVmFsdWVzID0gdHlwZUZlYXR1cmVzLmdldCh0eXBlSWQpOworCQkJZmVhdHVyZVZhbHVlc0FzRWxlbWVudChkb2MsIHByb2Nlc3NvclR5cGVFbGVtZW50LCBmZWF0dXJlVmFsdWVzKTsKKwkJCWNvbmZpZy5hcHBlbmRDaGlsZChwcm9jZXNzb3JUeXBlRWxlbWVudCk7CisJCX0KKworCQkvLyBTZXJpYWxpemUgdGhlIERvY3VtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBTdHJpbmcKKwkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLnNlcmlhbGl6ZURvY3VtZW50KGRvYyk7CisJfQorCisJcHVibGljIHN0YXRpYyBGZWF0dXJlUHJlZmVyZW5jZXMgZnJvbVhNTChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCUZlYXR1cmVQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBGZWF0dXJlUHJlZmVyZW5jZXMoKTsKKworCQkvLyBEbyB0aGUgcGFyc2luZyBhbmQgb2J0YWluIHRoZSB0b3AtbGV2ZWwgbm9kZQorCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudChpbnB1dFN0cmVhbSk7CisJCUVsZW1lbnQgY29uZmlnID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworCisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IHR5cGVGZWF0dXJlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4oKTsKKwkJRWxlbWVudFtdIHByb2Nlc3NvclR5cGVFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGNvbmZpZywgInByb2Nlc3NvclR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvclR5cGVFbHMubGVuZ3RoOyArK2kpCisJCXsKKwkJCUVsZW1lbnQgcHJvY2Vzc29yVHlwZUVsID0gcHJvY2Vzc29yVHlwZUVsc1tpXTsKKwkJCVN0cmluZyB0eXBlID0gZWxlbWVudEFzVHlwZShwcm9jZXNzb3JUeXBlRWwpOworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlVmFsdWVzID0gZWxlbWVudEFzRmVhdHVyZVZhbHVlcyhwcm9jZXNzb3JUeXBlRWwpOworCQkJdHlwZUZlYXR1cmVzLnB1dCh0eXBlLCBmZWF0dXJlVmFsdWVzKTsKKwkJfQorCisJCXByZWZzLnNldFR5cGVGZWF0dXJlcyh0eXBlRmVhdHVyZXMpOworCisJCXJldHVybiBwcmVmczsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZWxlbWVudEFzVHlwZShFbGVtZW50IHBhcmVudCkKKwl7CisJCVN0cmluZyBpZCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGlkOworCX0KKworCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgdHlwZUFzRWxlbWVudChEb2N1bWVudCBkb2MsIFN0cmluZyB0eXBlKQorCXsKKwkJRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb2Nlc3NvclR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQllbGVtZW50LnNldEF0dHJpYnV0ZSgiaWQiLCB0eXBlKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZWxlbWVudDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGVsZW1lbnRBc0ZlYXR1cmVWYWx1ZXMoRWxlbWVudCBlbGVtZW50KQorCXsKKwkJRWxlbWVudFtdIGZlYXR1cmVFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsICJmZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KGZlYXR1cmVFbHMubGVuZ3RoKTsKKwkJZm9yIChFbGVtZW50IGZlYXR1cmVFbCA6IGZlYXR1cmVFbHMpCisJCXsKKwkJCVN0cmluZyB1cmkgPSBmZWF0dXJlRWwuZ2V0QXR0cmlidXRlKCJ1cmkiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIHZhbHVlID0gZmVhdHVyZUVsLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAorCQkJZmVhdHVyZVZhbHVlcy5wdXQodXJpLCB2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIGZlYXR1cmVWYWx1ZXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBmZWF0dXJlVmFsdWVzQXNFbGVtZW50KERvY3VtZW50IGRvYywgRWxlbWVudCBmZWF0dXJlc0VsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXMpCisJeworCQlpZiAoZmVhdHVyZVZhbHVlcyAhPSBudWxsKQorCQl7CisJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsU3RyaW5nPiBlbnRyeTIgOiBmZWF0dXJlVmFsdWVzLmVudHJ5U2V0KCkpCisJCQl7CisJCQkJU3RyaW5nIHVyaSA9IChTdHJpbmcpIGVudHJ5Mi5nZXRLZXkoKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeTIuZ2V0VmFsdWUoKTsKKwkJCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkCisJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInVyaSIsIHVyaSk7IC8vJE5PTi1OTFMtMSQKKwkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlmZWF0dXJlc0VsLmFwcGVuZENoaWxkKGVsZW1lbnQpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0pBWFBKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvSkFYUEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGQ4OTBjCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0pBWFBKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKQEAgLTAsMCArMSw0NDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JRGVidWdFdmVudFNldExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1SdW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhTGF1bmNoRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JRGVidWdnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JJbnZva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3NvckphcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklUcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLklYU0xDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwuWFNMRGVidWdUYXJnZXQ7CisKK3B1YmxpYyBjbGFzcyBKQVhQSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSBleHRlbmRzIEphdmFMYXVuY2hEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIKK3sKKwlwcml2YXRlIFN0cmluZyBtb2RlOworCUxhdW5jaEhlbHBlciBsYXVuY2hIZWxwZXI7CisJCisJQE92ZXJyaWRlCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBmaW5hbCBTdHJpbmcgbW9kZSwgZmluYWwgSUxhdW5jaCBsYXVuY2gsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCXRoaXMubW9kZSA9IG1vZGU7CisJCWxhdW5jaEhlbHBlci5zYXZlKGdldExhdW5jaENvbmZpZ0ZpbGUoKSk7CisJCQorCQkvLyBzZXQgdGhlIGxhdW5jaCBuYW1lCisJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24sIG1vZGUpOworCQlTdHJpbmcgdGZhY3RvcnkgPSBnZXRUcmFuc2Zvcm1lckZhY3RvcnkoaW5zdGFsbCk7CisJCVN0cmluZyBuYW1lID0gaW5zdGFsbC5nZXROYW1lKCk7CisJCWlmICh0ZmFjdG9yeSAhPSBudWxsKQorCQkJbmFtZSArPSAiWyIgKyB0ZmFjdG9yeSArICJdIjsKKwkJbGF1bmNoLnNldEF0dHJpYnV0ZSgibGF1bmNoTmFtZSIsIG5hbWUpOworCisJCS8vIHRoZSBzdXBlci5sYXVuY2ggd2lsbCBhZGQgYSBKYXZhIHNvdXJjZSBkaXJlY3RvciBpZiB3ZSBzZXQgaXQgdG8gbnVsbCBoZXJlCisJCWZpbmFsIElTb3VyY2VMb2NhdG9yIGNvbmZpZ3VyZWRMb2NhdG9yID0gbGF1bmNoLmdldFNvdXJjZUxvY2F0b3IoKTsKKwkJbGF1bmNoLnNldFNvdXJjZUxvY2F0b3IobnVsbCk7CisKKwkJc3VwZXIubGF1bmNoKGNvbmZpZ3VyYXRpb24sIG1vZGUsIGxhdW5jaCwgbW9uaXRvcik7CisJCQorCQkvLyBub3cgZ2V0IHRoZSBqYXZhIHNvdXJjZSBsb2NhdG9yCisJCWZpbmFsIElTb3VyY2VMb2NhdG9yIGphdmFTb3VyY2VMb29rdXBEaXJlY3RvciA9IChJU291cmNlTG9jYXRvcilsYXVuY2guZ2V0U291cmNlTG9jYXRvcigpOworCQkvLyBub3cgYWRkIG91ciBvd24gcGFydGljaXBhbnQgdG8gdGhlIGphdmEgZGlyZWN0b3IKKwkJbGF1bmNoLnNldFNvdXJjZUxvY2F0b3IobmV3IElTb3VyY2VMb2NhdG9yKCl7CisKKwkJCXB1YmxpYyBPYmplY3QgZ2V0U291cmNlRWxlbWVudChJU3RhY2tGcmFtZSBzdGFja0ZyYW1lKSAKKwkJCXsKKwkJCQkvLyBzaW1wbHkgbG9vayBhdCBvbmUgYW5kIHRoZW4gdGhlIG90aGVyCisJCQkJT2JqZWN0IHNvdXJjZUVsZW1lbnQgPSBqYXZhU291cmNlTG9va3VwRGlyZWN0b3IuZ2V0U291cmNlRWxlbWVudChzdGFja0ZyYW1lKTsKKwkJCQlpZiAoc291cmNlRWxlbWVudCA9PSBudWxsKQorCQkJCQlzb3VyY2VFbGVtZW50ID0gY29uZmlndXJlZExvY2F0b3IuZ2V0U291cmNlRWxlbWVudChzdGFja0ZyYW1lKTsKKwkJCQlyZXR1cm4gc291cmNlRWxlbWVudDsKKwkJCX19KTsKKwkJCisvLwkJSUphdmFEZWJ1Z1RhcmdldCBqYXZhVGFyZ2V0ID0gKElKYXZhRGVidWdUYXJnZXQpbGF1bmNoLmdldERlYnVnVGFyZ2V0KCk7CisvLwkJbGF1bmNoLnJlbW92ZURlYnVnVGFyZ2V0KGphdmFUYXJnZXQpOworCQkKKwkJSURlYnVnVGFyZ2V0IGphdmFUYXJnZXQgPSBsYXVuY2guZ2V0RGVidWdUYXJnZXQoKTsKKwkJSURlYnVnVGFyZ2V0IHhzbFRhcmdldCA9IG5ldyBYU0xEZWJ1Z1RhcmdldChsYXVuY2gsIGxhdW5jaC5nZXRQcm9jZXNzZXMoKVswXSwgbGF1bmNoSGVscGVyKTsKKwkJCisJCS8vIHJlbW92ZSBqYXZhIGFzIHRoZSBwcmltYXJ5IHRhcmdldCBhbmQgbWFrZSB4c2wgdGhlIHByaW1hcnkgdGFyZ2V0CisJCWxhdW5jaC5yZW1vdmVEZWJ1Z1RhcmdldChqYXZhVGFyZ2V0KTsKKwkJbGF1bmNoLmFkZERlYnVnVGFyZ2V0KHhzbFRhcmdldCk7CisJCS8vIGFkZCB0aGlzIGhlcmUgdG8gbWFrZSBqYXZhIHRoZSBub24tcHJpbWFyeSB0YXJnZXQKKwkvLwlsYXVuY2guYWRkRGVidWdUYXJnZXQoamF2YVRhcmdldCk7CisJCQorCS8vCWxhdW5jaC5hZGREZWJ1Z1RhcmdldChuZXcgSmF2YVhTTERlYnVnVGFyZ2V0KGxhdW5jaCwgbGF1bmNoLmdldFByb2Nlc3NlcygpWzBdLCBsYXVuY2hIZWxwZXIsIGphdmFUYXJnZXQpKTsKKwkJCisKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIEphdmEgYnJlYWtwb2ludCBhbmQgdGhlIFhTTCBicmVha3BvaW50cworCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJQnJlYWtwb2ludFtdIGdldEJyZWFrcG9pbnRzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCisJeworCQlJQnJlYWtwb2ludE1hbmFnZXIgYnJlYWtwb2ludE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKKwkJaWYgKCFicmVha3BvaW50TWFuYWdlci5pc0VuYWJsZWQoKSkKKwkJCXJldHVybiBudWxsOworCQkKKwkJSUJyZWFrcG9pbnRbXSBqYXZhQnJlYWtwb2ludHMgPSBzdXBlci5nZXRCcmVha3BvaW50cyhjb25maWd1cmF0aW9uKTsKKwkJSUJyZWFrcG9pbnRbXSB4c2xCcmVha3BvaW50cyA9IGJyZWFrcG9pbnRNYW5hZ2VyLmdldEJyZWFrcG9pbnRzKElYU0xDb25zdGFudHMuSURfWFNMX0RFQlVHX01PREVMKTsKKwkJSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IG5ldyBJQnJlYWtwb2ludFtqYXZhQnJlYWtwb2ludHMubGVuZ3RoK3hzbEJyZWFrcG9pbnRzLmxlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkoamF2YUJyZWFrcG9pbnRzLCAwLCBicmVha3BvaW50cywgMCwgamF2YUJyZWFrcG9pbnRzLmxlbmd0aCk7CisJCVN5c3RlbS5hcnJheWNvcHkoeHNsQnJlYWtwb2ludHMsIDAsIGJyZWFrcG9pbnRzLCBqYXZhQnJlYWtwb2ludHMubGVuZ3RoLCB4c2xCcmVha3BvaW50cy5sZW5ndGgpOworCQkKKwkJcmV0dXJuIGJyZWFrcG9pbnRzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHByZUxhdW5jaENoZWNrKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCisJeworCQl0aGlzLmxhdW5jaEhlbHBlciA9IG5ldyBMYXVuY2hIZWxwZXIoY29uZmlndXJhdGlvbik7CisJCWlmIChtb2RlLmVxdWFscyhJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKSkKKwkJeworCQkJLy8gVE9ETyBkb24ndCBsaWtlIGhhdmluZyBVSSBjb2RlIGluIHRoZSBsYXVuY2hpbmcgcGx1Z2luLi4ud2hlcmUgZWxzZSBjYW4gaXQgZ28/CisJCQlmaW5hbCBJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gZ2V0UHJvY2Vzc29ySW5zdGFsbChjb25maWd1cmF0aW9uLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7CisJCQlpZiAoaW5zdGFsbC5nZXREZWJ1Z2dlcigpID09IG51bGwpCisJCQl7CisJCQkJZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuW10KKwkJCQl7IGZhbHNlIH07CisJCQkJLy8gb3BlbiBhIGRpYWxvZyBmb3IgY2hvb3NpbmcgYSBkaWZmZXJlbnQgaW5zdGFsbCB0aGF0IGRvZXMgaGF2ZQorCQkJCS8vIGFuIGFzc29jaWF0ZWQgZGVidWdnZXIKKwkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKQorCQkJCXsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCQkJeworCQkJCQkJU3RyaW5nIGRlYnVnZ2luZ0luc3RhbGxJZCA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9ERUJVR0dJTkdfSU5TVEFMTF9JRCk7CisJCQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBwcm9jZXNzb3IgPSBKQVhQUnVudGltZS5nZXRQcm9jZXNzb3IoZGVidWdnaW5nSW5zdGFsbElkKTsKKworCQkJCQkJSVdvcmtiZW5jaFdpbmRvdyBkdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisJCQkJCQkKKwkJCQkJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS4wIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjEiKSArIGluc3RhbGwuZ2V0TmFtZSgpICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuMyIpICsgcHJvY2Vzc29yLmdldE5hbWUoKSArIE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS40Iik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkKKwkJCQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZHcuZ2V0U2hlbGwoKSwgdGl0bGUsIG51bGwsIG1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sCisJCQkJCQkJCW5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOyAvLyB5ZXMgaXMgdGhlIGRlZmF1bHQKKwkJCQkJCQorCQkJCSAgICAgICAgcmVzdWx0WzBdID0gZGlhbG9nLm9wZW4oKSA9PSAwOworCQkJCQl9CisJCQkJfSk7CisJCQkJcmV0dXJuIHJlc3VsdFswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlTdHJpbmcgZGVidWdnZXJURiA9IGluc3RhbGwuZ2V0RGVidWdnZXIoKS5nZXRUcmFuc2Zvcm1lckZhY3RvcnkoKTsKKwkJCQlTdHJpbmcgaW5zdGFsbFRGID0gbGF1bmNoSGVscGVyLmdldFRyYW5zZm9ybWVyRmFjdG9yeSgpID09IG51bGwgPyBudWxsIDogbGF1bmNoSGVscGVyLmdldFRyYW5zZm9ybWVyRmFjdG9yeSgpLmdldEZhY3RvcnlDbGFzcygpOworCQkJCWlmICghZGVidWdnZXJURi5lcXVhbHMoaW5zdGFsbFRGKSkKKwkJCQl7CisJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCisJCQkJCXsKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQkJCQl7CisJCQkJCQkJSVdvcmtiZW5jaFdpbmRvdyBkdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisJCQkJCQkJCisJCQkJCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDaGFuZ2UgVHJhbnNmb3JtZXIgRmFjdG9yeSIpOworCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gaW5zdGFsbC5nZXROYW1lKCkgKyAiIG11c3QgdXNlIHRoZSAiICsgbGF1bmNoSGVscGVyLmdldFRyYW5zZm9ybWVyRmFjdG9yeSgpLmdldE5hbWUoKSArICIgdHJhbnNmb3JtZXIgZmFjdG9yeSB3aGVuIGRlYnVnZ2luZy5cbiIKKwkJCQkJCQkJCSsgIkJlIGF3YXJlIHRoYXQgdGhpcyBtYXkgZ2l2ZSBkaWZmZXJlbnQgcmVzdWx0cyB0byB0aGUgIiArIGxhdW5jaEhlbHBlci5nZXRUcmFuc2Zvcm1lckZhY3RvcnkoKS5nZXROYW1lKCkgKyAiIHRyYW5zZm9ybWVyIGZhY3RvcnkgY29uZmlndXJlZCBmb3IgdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbi4iOworCQkJCQkJCQorCQkJCQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZHcuZ2V0U2hlbGwoKSwgdGl0bGUsIG51bGwsIG1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuV0FSTklORywKKwkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOyAvLyB5ZXMgaXMgdGhlIGRlZmF1bHQKKwkJCQkJCQlkaWFsb2cub3BlbigpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLnByZUxhdW5jaENoZWNrKGNvbmZpZ3VyYXRpb24sIG1vZGUsIG1vbml0b3IpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJVk1SdW5uZXIgZ2V0Vk1SdW5uZXIoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCisJeworCQkvLyBjb21tZW50IHRoaXMgb3V0IGluIG9yZGVyIHRvIGdldCBqYXZhIGRlYnVnZ2luZyBhcyB3ZWxsIGFzIFhTTCBkZWJ1Z2dpbmcKKy8vCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCisvLwkJCXJldHVybiBzdXBlci5nZXRWTVJ1bm5lcihjb25maWd1cmF0aW9uLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7CisJCXJldHVybiBzdXBlci5nZXRWTVJ1bm5lcihjb25maWd1cmF0aW9uLCBtb2RlKTsKKwl9CisKKwlwcml2YXRlIEZpbGUgZ2V0TGF1bmNoQ29uZmlnRmlsZSgpCisJeworCQlJUGF0aCBsYXVuY2hQYXRoID0gUGxhdGZvcm0uZ2V0U3RhdGVMb2NhdGlvbihKQVhQTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSkuYXBwZW5kKCJsYXVuY2giKTsgLy8kTk9OLU5MUy0xJAorCQlGaWxlIGxhdW5jaERpciA9IGxhdW5jaFBhdGgudG9GaWxlKCk7CisJCWlmICghbGF1bmNoRGlyLmV4aXN0cygpKQorCQkJbGF1bmNoRGlyLm1rZGlyKCk7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxhdW5jaERpciwgImxhdW5jaC54bWwiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmlsZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVBhdGggZ2V0V29ya2luZ0RpcmVjdG9yeVBhdGgoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gY2hhbmdlcyBhcmUgYWZvb3Qgc28gdGhhdCB3b3JraW5nIGRpcmVjdG9yeSBjYW4gYmUgZ290dGVuIGZyb20gdGhlIENvbW1vbiBsYXVuY2ggdGFiCisJCQorLy8JCVN0cmluZyBwYXRoID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9DRVNTT1JfV09SS0lOR19ESVIsIChTdHJpbmcpIG51bGwpOworLy8JCWlmIChwYXRoICE9IG51bGwpCisvLwkJeworLy8JCQlwYXRoID0gVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKHBhdGgpOworLy8JCQlyZXR1cm4gbmV3IFBhdGgocGF0aCk7CisvLwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIElQcm9jZXNzb3JJbnZva2VyIGdldFByb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCisJeworCQlTdHJpbmcgaW52b2tlcklkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSU5WT0tFUl9ERVNDUklQVE9SLCAoU3RyaW5nKSBudWxsKTsKKwkJaWYgKGludm9rZXJJZCA9PSBudWxsKQorCQkJaW52b2tlcklkID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAuaW52b2tlIjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29ySW52b2tlcihpbnZva2VySWQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckluc3RhbGwgZ2V0UHJvY2Vzc29ySW5zdGFsbChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBMYXVuY2hIZWxwZXIuZ2V0UHJvY2Vzc29ySW5zdGFsbChjb25maWd1cmF0aW9uKTsKKwkJaWYgKG1vZGUuZXF1YWxzKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpICYmIGluc3RhbGwuZ2V0RGVidWdnZXIoKSA9PSBudWxsKQorCQl7CisJCQlTdHJpbmcgZGVidWdnaW5nSW5zdGFsbElkID0gSkFYUExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0RFQlVHR0lOR19JTlNUQUxMX0lEKTsKKwkJCWluc3RhbGwgPSBKQVhQUnVudGltZS5nZXRQcm9jZXNzb3IoZGVidWdnaW5nSW5zdGFsbElkKTsKKwkJfQorCQlyZXR1cm4gaW5zdGFsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1haW5UeXBlTmFtZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCXsKKwkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQorCQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuZGVidWdnZXIuRGVidWdSdW5uZXIiOyAvLyROT04tTkxTLTEkCisJCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIuaW50ZXJuYWwuTWFpbiI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFByb2dyYW1Bcmd1bWVudHMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCS8vIGNsYXNzbmFtZSwgc291cmNldXJsLCBvdXRwdXQgZmlsZQorCQlJUHJvY2Vzc29ySW52b2tlciBpbnZva2VyID0gZ2V0UHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IoY29uZmlndXJhdGlvbik7CisJCVN0cmluZyBjbGF6eiA9IGludm9rZXIuZ2V0SW52b2tlckNsYXNzTmFtZSgpOworCisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJc2IuYXBwZW5kKGNsYXp6KTsKKwkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJc2IuYXBwZW5kKCJcIiIgKyBnZXRMYXVuY2hDb25maWdGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCisJCXNiLmFwcGVuZCgiXCIiICsgbGF1bmNoSGVscGVyLmdldFNvdXJjZSgpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAorCQlzYi5hcHBlbmQoIlwiIiArIGxhdW5jaEhlbHBlci5nZXRUYXJnZXQoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQorCQl7CisJCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gZ2V0UHJvY2Vzc29ySW5zdGFsbChjb25maWd1cmF0aW9uLCBtb2RlKTsKKwkJCWlmIChpbnN0YWxsLmdldERlYnVnZ2VyKCkgIT0gbnVsbCkKKwkJCXsKKwkJCQlJRGVidWdnZXIgZGVidWdnZXIgPSBpbnN0YWxsLmdldERlYnVnZ2VyKCk7CisJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlYnVnZ2VyLmdldENsYXNzTmFtZSgpOworCQkJCXNiLmFwcGVuZCgiIC1kZWJ1ZyAiKS5hcHBlbmQoY2xhc3NOYW1lKS5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJc2IuYXBwZW5kKGxhdW5jaEhlbHBlci5nZXRSZXF1ZXN0UG9ydCgpKTsKKwkJCQlzYi5hcHBlbmQoIiAiKS5hcHBlbmQobGF1bmNoSGVscGVyLmdldEV2ZW50UG9ydCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXNiLmFwcGVuZCgiICIpLmFwcGVuZChsYXVuY2hIZWxwZXIuZ2V0R2VuZXJhdGVQb3J0KCkpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCisJeworCQkvLyBnZXQgdGhlIGNsYXNzcGF0aCBkZWZpbmVkIGJ5IHRoZSB1c2VyCisJCVN0cmluZ1tdIHVzZXJDbGFzc3BhdGggPSBzdXBlci5nZXRDbGFzc3BhdGgoY29uZmlndXJhdGlvbik7CisKKwkJLy8gZ2V0IHRoZSBjbGFzc3BhdGggcmVxdWlyZWQgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbgorCQlJUHJvY2Vzc29ySW52b2tlciBpbnZva2VyID0gZ2V0UHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IoY29uZmlndXJhdGlvbik7CisJCUxpc3Q8U3RyaW5nPiBpbnZva2VyQ1AgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZm9yIChTdHJpbmcgZW50cnkgOiBpbnZva2VyLmdldENsYXNzcGF0aEVudHJpZXMoKSkKKwkJeworCQkJaW52b2tlckNQLmFkZChlbnRyeSk7CisJCX0KKworCQkvLyBhZGQgdGhlIGRlYnVnZ2VyLi4uCisJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24sIG1vZGUpOworCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkgJiYgaW5zdGFsbC5nZXREZWJ1Z2dlcigpICE9IG51bGwpCisJCXsKKwkJCVN0cmluZ1tdIGphcnMgPSBpbnN0YWxsLmdldERlYnVnZ2VyKCkuZ2V0Q2xhc3NQYXRoKCk7CisJCQlmb3IgKFN0cmluZyBqYXIgOiBqYXJzKQorCQkJeworCQkJCWludm9rZXJDUC5hZGQoamFyKTsKKwkJCX0KKwkJfQorCisJCVN0cmluZ1tdIGludm9rZXJDbGFzc3BhdGggPSAoU3RyaW5nW10pIGludm9rZXJDUC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworCisJCS8vIGFkZCB0aGVtIHRvZ2V0aGVyCisJCVN0cmluZ1tdIGNsYXNzcGF0aCA9IG5ldyBTdHJpbmdbdXNlckNsYXNzcGF0aC5sZW5ndGggKyBpbnZva2VyQ2xhc3NwYXRoLmxlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkoaW52b2tlckNsYXNzcGF0aCwgMCwgY2xhc3NwYXRoLCAwLCBpbnZva2VyQ2xhc3NwYXRoLmxlbmd0aCk7CisJCVN5c3RlbS5hcnJheWNvcHkodXNlckNsYXNzcGF0aCwgMCwgY2xhc3NwYXRoLCBpbnZva2VyQ2xhc3NwYXRoLmxlbmd0aCwgdXNlckNsYXNzcGF0aC5sZW5ndGgpOworCisJCXJldHVybiBjbGFzc3BhdGg7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRWTUFyZ3VtZW50cyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHZtYXJncyA9IHN1cGVyLmdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOworCisJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24sIG1vZGUpOworCQlpZiAoaW5zdGFsbCAhPSBudWxsICYmICFpbnN0YWxsLmdldFByb2Nlc3NvclR5cGUoKS5pc0pSRURlZmF1bHQoKSkKKwkJeworCQkJLy8gY2xlYXIgdGhlIGVuZG9yc2VkIGRpcgorCQkJRmlsZSB0ZW1wRGlyID0gZ2V0RW5kb3JzZWREaXIoKTsKKwkJCWlmICh0ZW1wRGlyLmV4aXN0cygpKQorCQkJeworCQkJCUZpbGVbXSBjaGlsZHJlbiA9IHRlbXBEaXIubGlzdEZpbGVzKCk7CisJCQkJZm9yIChGaWxlIGNoaWxkIDogY2hpbGRyZW4pCisJCQkJeworCQkJCQljaGlsZC5kZWxldGUoKTsKKwkJCQl9CisJCQkJdGVtcERpci5kZWxldGUoKTsKKwkJCX0KKwkJCXRlbXBEaXIubWtkaXIoKTsKKworCQkJLy8gbW92ZSB0aGUgcmVxdWlyZWQgamFycyB0byB0aGUgZW5kb3JzZWQgZGlyCisJCQlJUHJvY2Vzc29ySmFyW10gamFycyA9IGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCVVSTCBlbnRyeSA9IGphcnNbaV0uYXNVUkwoKTsKKwkJCQlpZiAoZW50cnkgPT0gbnVsbCkKKwkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjIzIikgKyBqYXJzW2ldLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyLCAiRU5EXyIgKyBpICsgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJbW92ZUZpbGUoZW50cnksIGZpbGUpOworCQkJfQorCQkJLy8gYWRkIHRoZSBlbmRvcnNlZCBkaXIKKwkJCXZtYXJncyArPSAiIC1EamF2YS5lbmRvcnNlZC5kaXJzPVwiIiArIHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQorCQkJU3RyaW5nIHRmYWN0b3J5ID0gZ2V0VHJhbnNmb3JtZXJGYWN0b3J5KGluc3RhbGwpOworCQkJaWYgKHRmYWN0b3J5ICE9IG51bGwpCisJCQkJdm1hcmdzICs9ICIgLURqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeT0iICsgdGZhY3Rvcnk7IC8vJE5PTi1OTFMtMSQKKwkJCQorCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQorCQkJeworCQkJCS8vIGluIGRlYnVnIG1vZGUsIHNldCB0aGUgbG9nZ2luZyB0byBFUlJPUi4gVGhpcyBwcmV2ZW50cyB0aGUgY29uc29sZSBmcm9tIHBvcHBpbmcgdXAgb24gdG9wIG9mIHRoZSByZXN1bHQgdmlldyEKKwkJCQl0cnkKKwkJCQl7CisJCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKEZpbGVMb2NhdG9yLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEKSwgbmV3IFBhdGgoIi9sb2c0ai5kZWJ1Zy5wcm9wZXJ0aWVzIiksIG51bGwpKTsKKwkJCQkJdm1hcmdzICs9ICIgLURsb2c0ai5jb25maWd1cmF0aW9uPVwiIit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXCIiOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQorCQkJCXsKKwkJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB2bWFyZ3M7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGdldFRyYW5zZm9ybWVyRmFjdG9yeShJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQorCXsKKwkJU3RyaW5nIHRmYWN0b3J5ID0gbnVsbDsKKwkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQorCQkJdGZhY3RvcnkgPSBpbnN0YWxsLmdldERlYnVnZ2VyKCkuZ2V0VHJhbnNmb3JtZXJGYWN0b3J5KCk7CisJCWVsc2UKKwkJeworCQkJSVRyYW5zZm9ybWVyRmFjdG9yeSB0ID0gbGF1bmNoSGVscGVyLmdldFRyYW5zZm9ybWVyRmFjdG9yeSgpOworCQkJaWYgKHQgIT0gbnVsbCkKKwkJCQl0ZmFjdG9yeSA9IHQuZ2V0RmFjdG9yeUNsYXNzKCk7CisJCX0KKwkJcmV0dXJuIHRmYWN0b3J5OworCX0KKworCXByaXZhdGUgRmlsZSBnZXRFbmRvcnNlZERpcigpCisJeworCQlJUGF0aCB0ZW1wTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKEpBWFBMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpKS5hcHBlbmQoImVuZG9yc2VkIik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHRlbXBMb2NhdGlvbi50b0ZpbGUoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIG1vdmVGaWxlKFVSTCBzcmMsIEZpbGUgdGFyZ2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCXsKKwkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbnVsbDsKKwkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBudWxsOworCQl0cnkKKwkJeworCQkJYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldCkpOworCQkJYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3JjLm9wZW5TdHJlYW0oKSk7CisJCQl3aGlsZSAoYmlzLmF2YWlsYWJsZSgpID4gMCkKKwkJCXsKKwkJCQlpbnQgc2l6ZSA9IGJpcy5hdmFpbGFibGUoKTsKKwkJCQlpZiAoc2l6ZSA+IDEwMjQpCisJCQkJCXNpemUgPSAxMDI0OworCQkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbc2l6ZV07CisJCQkJYmlzLnJlYWQoYiwgMCwgYi5sZW5ndGgpOworCQkJCWJvcy53cml0ZShiKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKKwkJeworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjciKSArIHNyYyArIE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS4zMSIpICsgdGFyZ2V0LCBlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJCWZpbmFsbHkKKwkJeworCQkJaWYgKGJpcyAhPSBudWxsKQorCQkJeworCQkJCXRyeQorCQkJCXsKKwkJCQkJYmlzLmNsb3NlKCk7CisJCQkJfQorCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQorCQkJCXsKKwkJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7CisJCQkJfQorCQkJfQorCQkJaWYgKGJvcyAhPSBudWxsKQorCQkJeworCQkJCXRyeQorCQkJCXsKKwkJCQkJYm9zLmNsb3NlKCk7CisJCQkJfQorCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQorCQkJCXsKKwkJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0pBWFBMYXVuY2hpbmdQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9KQVhQTGF1bmNoaW5nUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkZGRhNwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9KQVhQTGF1bmNoaW5nUGx1Z2luLmphdmEKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQorICovCitwdWJsaWMgY2xhc3MgSkFYUExhdW5jaGluZ1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7CisKKwkvLyBUaGUgcGx1Zy1pbiBJRAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nIjsKKworCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKKwlwcml2YXRlIHN0YXRpYyBKQVhQTGF1bmNoaW5nUGx1Z2luIHBsdWdpbjsKKwkKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgSkFYUExhdW5jaGluZ1BsdWdpbigpIHsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXBsdWdpbiA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCisJICoKKwkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpBWFBMYXVuY2hpbmdQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKEV4Y2VwdGlvbiBlKQorCXsKKwkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coQ29yZUV4Y2VwdGlvbiBlKQorCXsKKwkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvTGF1bmNoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvTGF1bmNoSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhNjM5MgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9MYXVuY2hIZWxwZXIuamF2YQpAQCAtMCwwICsxLDI0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLlBpcGVsaW5lRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlci5UcmFuc2Zvcm1EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLlR5cGVkVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklUcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuTGF1bmNoQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkxhdW5jaFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkJhc2VMYXVuY2hIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuUHJlZmVyZW5jZVV0aWw7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBMYXVuY2hIZWxwZXIgZXh0ZW5kcyBCYXNlTGF1bmNoSGVscGVyCit7CisJcHJpdmF0ZSBmaW5hbCBMYXVuY2hBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisJcHJpdmF0ZSBmaW5hbCBMYXVuY2hQcm9wZXJ0aWVzIG91dHB1dFByb3BlcnRpZXM7CisJcHJpdmF0ZSBmaW5hbCBJVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeTsKKworCXB1YmxpYyBMYXVuY2hIZWxwZXIoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCXN1cGVyKGNvbmZpZ3VyYXRpb24pOworCQlhdHRyaWJ1dGVzID0gaHlkcmF0ZUF0dHJpYnV0ZXMoY29uZmlndXJhdGlvbik7CisJCW91dHB1dFByb3BlcnRpZXMgPSBoeWRyYXRlT3V0cHV0UHJvcGVydGllcyhjb25maWd1cmF0aW9uKTsKKwkJdHJhbnNmb3JtZXJGYWN0b3J5ID0gaHlkcmF0ZVRyYW5zZm9ybWVyRmFjdG9yeShjb25maWd1cmF0aW9uKTsKKwl9CisKKwlwdWJsaWMgTGF1bmNoUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkKKwl7CisJCXJldHVybiBvdXRwdXRQcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyBMYXVuY2hBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKQorCXsKKwkJcmV0dXJuIGF0dHJpYnV0ZXM7CisJfQorCisJcHVibGljIHZvaWQgc2F2ZShGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCisJeworCQlCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBudWxsOworCQl0cnkKKwkJeworCQkJLy8gZW5zdXJlIGl0IGV4aXN0cworCQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7CisJCQl3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZmlsZSkpOworCQkJUGlwZWxpbmVEZWZpbml0aW9uIHBkZWYgPSBuZXcgUGlwZWxpbmVEZWZpbml0aW9uKCk7CisJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCisJCQl7CisJCQkJTGF1bmNoQXR0cmlidXRlIGF0dCA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOworCQkJCXBkZWYuYWRkQXR0cmlidXRlKG5ldyBUeXBlZFZhbHVlKGF0dC51cmksIFR5cGVkVmFsdWUuVFlQRV9TVFJJTkcsIGF0dC52YWx1ZSkpOworCQkJfQorCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gcGlwZWxpbmUuZ2V0VHJhbnNmb3JtRGVmcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKKwkJCXsKKwkJCQlMYXVuY2hUcmFuc2Zvcm0gbHQgPSAoTGF1bmNoVHJhbnNmb3JtKSBpdGVyLm5leHQoKTsKKwkJCQlUcmFuc2Zvcm1EZWZpbml0aW9uIHRkZWYgPSBuZXcgVHJhbnNmb3JtRGVmaW5pdGlvbigpOworCQkJCVVSTCB1cmwgPSBwYXRoVG9VUkwobHQuZ2V0TG9jYXRpb24oKSk7CisJCQkJdGRlZi5zZXRTdHlsZXNoZWV0VVJMKHVybC50b0V4dGVybmFsRm9ybSgpKTsKKwkJCQl0ZGVmLnNldFJlc29sdmVyQ2xhc3MobHQuZ2V0UmVzb2x2ZXIoKSk7CisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IGx0LmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQorCQkJCXsKKwkJCQkJTGF1bmNoQXR0cmlidXRlIGF0dCA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJdGRlZi5hZGRQYXJhbWV0ZXIobmV3IFR5cGVkVmFsdWUoYXR0LnVyaSwgVHlwZWRWYWx1ZS5UWVBFX1NUUklORywgYXR0LmdldFJlc29sdmVkVmFsdWUoKSkpOworCQkJCX0KKwkJCQkvLyBzZXQgdGhlIG91dHB1dCBwcm9wcyBmb3IgdGhlIExBU1QgdHJhbnNmb3JtIG9ubHkKKwkJCQlpZiAoIWl0ZXIuaGFzTmV4dCgpKQorCQkJCXsKKwkJCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogb3V0cHV0UHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZW50cnlTZXQoKSkKKwkJCQkJeworCQkJCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQkJCVN0cmluZyB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJCQlpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpCisJCQkJCQkJdGRlZi5zZXRPdXRwdXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJcGRlZi5hZGRUcmFuc2Zvcm1EZWYodGRlZik7CisJCQl9CisKKwkJCURvY3VtZW50IGRvYyA9IHBkZWYudG9YTUwoKTsKKwkJCVN0cmluZyBzID0gUHJlZmVyZW5jZVV0aWwuc2VyaWFsaXplRG9jdW1lbnQoZG9jKTsKKwkJCXdyaXRlci53cml0ZShzKTsKKwkJfQorCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCisJCXsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLmdldFN0cmluZygiTGF1bmNoSGVscGVyLjAiKSwgZSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisJCXsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLmdldFN0cmluZygiTGF1bmNoSGVscGVyLjEiKSwgZSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKKwkJeworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLCBlKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQljYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKKwkJeworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIlRyYW5zZm9ybWVyRXhjZXB0aW9uIiwgZSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlpZiAod3JpdGVyICE9IG51bGwpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQl3cml0ZXIuY2xvc2UoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisJCQkJeworCQkJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIExhdW5jaFByb3BlcnRpZXMgaHlkcmF0ZU91dHB1dFByb3BlcnRpZXMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCUxhdW5jaFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG51bGw7CisJCWJvb2xlYW4gdXNlUHJlZmVyZW5jZVByb3BlcnRpZXMgPSBmYWxzZTsgLy9jb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9QUk9QRVJUSUVTX0ZST01fUFJFRkVSRU5DRVMsIHRydWUpOworCQlJUHJvY2Vzc29yVHlwZSBwdCA9IGdldFByb2Nlc3Nvckluc3RhbGwoY29uZmlndXJhdGlvbikuZ2V0UHJvY2Vzc29yVHlwZSgpOworCQlpZiAodXNlUHJlZmVyZW5jZVByb3BlcnRpZXMpCisJCXsKKwkJCXByb3BlcnRpZXMgPSBuZXcgTGF1bmNoUHJvcGVydGllcygpOworCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogcHQuZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoKS5lbnRyeVNldCgpKQorCQkJeworCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisJCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQlwcm9wZXJ0aWVzLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVN0cmluZyBzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PVVRQVVRfUFJPUEVSVElFUywgKFN0cmluZykgbnVsbCk7CisJCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQorCQkJeworCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSk7CisJCQkJcHJvcGVydGllcyA9IExhdW5jaFByb3BlcnRpZXMuZnJvbVhNTChpbnB1dFN0cmVhbSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTGF1bmNoQXR0cmlidXRlcyBoeWRyYXRlQXR0cmlidXRlcyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCXsKKwkJTGF1bmNoQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbnVsbDsKKwkJYm9vbGVhbiB1c2VEZWZhdWx0QXR0cmlidXRlcyA9IGZhbHNlOyAvL2NvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0ZFQVRVUkVTX0ZST01fUFJFRkVSRU5DRVMsIHRydWUpOworCQlpZiAodXNlRGVmYXVsdEF0dHJpYnV0ZXMpCisJCXsKKwkJCWF0dHJpYnV0ZXMgPSBuZXcgTGF1bmNoQXR0cmlidXRlcygpOworCQkJSVByb2Nlc3NvclR5cGUgcHQgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24pLmdldFByb2Nlc3NvclR5cGUoKTsKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gZnZhbHMgPSBwdC5nZXRBdHRyaWJ1dGVWYWx1ZXMoKTsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IGZ2YWxzLmVudHJ5U2V0KCkpCisJCQl7CisJCQkJU3RyaW5nIHVyaSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOworCQkJCUlBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlKHB0LmdldEF0dHJpYnV0ZXMoKSwgdXJpKTsKKwkJCQlhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZShuZXcgTGF1bmNoQXR0cmlidXRlKHVyaSwgInN0cmluZyIsIChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVN0cmluZyBzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9BVFRSSUJVVEVTLCAoU3RyaW5nKSBudWxsKTsKKwkJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCisJCQl7CisJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKTsKKwkJCQlhdHRyaWJ1dGVzID0gTGF1bmNoQXR0cmlidXRlcy5mcm9tWE1MKGlucHV0U3RyZWFtKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYXR0cmlidXRlczsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJQXR0cmlidXRlIGdldEF0dHJpYnV0ZShJQXR0cmlidXRlW10gYXR0cmlidXRlcywgU3RyaW5nIHVyaSkKKwl7CisJCWZvciAoSUF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBhdHRyaWJ1dGVzKQorCQl7CisJCQlpZiAoYXR0cmlidXRlLmdldFVSSSgpLmVxdWFscyh1cmkpKQorCQkJCXJldHVybiBhdHRyaWJ1dGU7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisKKwlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JJbnN0YWxsIGdldFByb2Nlc3Nvckluc3RhbGwoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCWJvb2xlYW4gdXNlRGVmYXVsdFByb2Nlc3NvciA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SLCB0cnVlKTsKKwkJaWYgKHVzZURlZmF1bHRQcm9jZXNzb3IpCisJCQlyZXR1cm4gSkFYUFJ1bnRpbWUuZ2V0RGVmYXVsdFByb2Nlc3NvcigpOworCQlTdHJpbmcgcHJvY2Vzc29ySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0NFU1NPUiwgIiIpOyAvLyROT04tTkxTLTEkCisJCUlQcm9jZXNzb3JJbnN0YWxsIHByb2Nlc3NvciA9IEpBWFBSdW50aW1lLmdldFByb2Nlc3Nvcihwcm9jZXNzb3JJZCk7CisJCXJldHVybiBwcm9jZXNzb3I7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgSVRyYW5zZm9ybWVyRmFjdG9yeSBoeWRyYXRlVHJhbnNmb3JtZXJGYWN0b3J5KElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCisJeworCQlJUHJvY2Vzc29yVHlwZSB0eXBlID0gZ2V0UHJvY2Vzc29ySW5zdGFsbChjb25maWd1cmF0aW9uKS5nZXRQcm9jZXNzb3JUeXBlKCk7CisJCWJvb2xlYW4gdXNlRGVmYXVsdEZhY3RvcnkgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiwgdHJ1ZSk7CisJCWlmICh1c2VEZWZhdWx0RmFjdG9yeSkKKwkJCXJldHVybiB0eXBlLmdldERlZmF1bHRUcmFuc2Zvcm1lckZhY3RvcnkoKTsKKwkJCisJCVN0cmluZyBmYWN0b3J5SWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RSQU5TRk9STUVSX0ZBQ1RPUlksIChTdHJpbmcpbnVsbCk7CisJCWlmIChmYWN0b3J5SWQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJZm9yIChJVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgOiB0eXBlLmdldFRyYW5zZm9ybWVyRmFjdG9yaWVzKCkpCisJCXsKKwkJCWlmIChmYWN0b3J5LmdldEZhY3RvcnlDbGFzcygpLmVxdWFscyhmYWN0b3J5SWQpKQorCQkJCXJldHVybiBmYWN0b3J5OworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBJVHJhbnNmb3JtZXJGYWN0b3J5IGdldFRyYW5zZm9ybWVyRmFjdG9yeSgpCisJeworCQlyZXR1cm4gdHJhbnNmb3JtZXJGYWN0b3J5OworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1ODcwMQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKKwkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOworCisJcHJpdmF0ZSBNZXNzYWdlcygpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvT3V0cHV0UHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9PdXRwdXRQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMGM5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvT3V0cHV0UHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JT3V0cHV0UHJvcGVydHk7CisKK3B1YmxpYyBjbGFzcyBPdXRwdXRQcm9wZXJ0eSBpbXBsZW1lbnRzIElPdXRwdXRQcm9wZXJ0eQoreworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzYzsKKworCXB1YmxpYyBPdXRwdXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgZGVzYykKKwl7CisJCXRoaXMubmFtZSA9IGtleTsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiBkZXNjOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKKwl7CisJCXJldHVybiBuYW1lOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL091dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9PdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3MzEzMwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9PdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5QcmVmZXJlbmNlVXRpbDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCitwdWJsaWMgY2xhc3MgT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcworeworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTWFwPFN0cmluZyxTdHJpbmc+PiB0eXBlUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZyxTdHJpbmc+PigpOworCisJcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyhTdHJpbmcgdHlwZUlkKQorCXsKKwkJcmV0dXJuIHR5cGVQcm9wZXJ0aWVzLmdldCh0eXBlSWQpOworCX0KKworCXB1YmxpYyB2b2lkIHNldE91dHB1dFByb3BlcnR5VmFsdWVzKFN0cmluZyB0eXBlSWQsIE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wZXJ0aWVzKQorCXsKKwkJdHlwZVByb3BlcnRpZXMucHV0KHR5cGVJZCwgcHJvcGVydGllcyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBc1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KKwl7CisJCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7CisJCUVsZW1lbnQgY29uZmlnID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAorCQlkb2MuYXBwZW5kQ2hpbGQoY29uZmlnKTsKKworCQlmb3IgKFN0cmluZyB0eXBlIDogdHlwZVByb3BlcnRpZXMua2V5U2V0KCkpCisJCXsKKwkJCUVsZW1lbnQgcHJvY2Vzc29yVHlwZUVsZW1lbnQgPSB0eXBlQXNFbGVtZW50KGRvYywgdHlwZSk7CisJCQlNYXA8U3RyaW5nLFN0cmluZz4gcHJvcGVydHlWYWx1ZXMgPSB0eXBlUHJvcGVydGllcy5nZXQodHlwZSk7CisJCQlmZWF0dXJlVmFsdWVzQXNFbGVtZW50KGRvYywgcHJvY2Vzc29yVHlwZUVsZW1lbnQsIHByb3BlcnR5VmFsdWVzKTsKKwkJCWNvbmZpZy5hcHBlbmRDaGlsZChwcm9jZXNzb3JUeXBlRWxlbWVudCk7CisJCX0KKworCQkvLyBTZXJpYWxpemUgdGhlIERvY3VtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBTdHJpbmcKKwkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLnNlcmlhbGl6ZURvY3VtZW50KGRvYyk7CisJfQorCisJcHVibGljIHN0YXRpYyBPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzIGZyb21YTUwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uCisJeworCQlPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzIHByZWZzID0gbmV3IE91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMoKTsKKworCQkvLyBEbyB0aGUgcGFyc2luZyBhbmQgb2J0YWluIHRoZSB0b3AtbGV2ZWwgbm9kZQorCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudChpbnB1dFN0cmVhbSk7CisJCUVsZW1lbnQgY29uZmlnID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworCisJCUVsZW1lbnRbXSBwcm9jZXNzb3JUeXBlRWxzID0gUHJlZmVyZW5jZVV0aWwuZ2V0Q2hpbGRFbGVtZW50cyhjb25maWcsICJwcm9jZXNzb3JUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzb3JUeXBlRWxzLmxlbmd0aDsgKytpKQorCQl7CisJCQlFbGVtZW50IHByb2Nlc3NvclR5cGVFbCA9IHByb2Nlc3NvclR5cGVFbHNbaV07CisJCQlTdHJpbmcgdHlwZSA9IGVsZW1lbnRBc1R5cGUocHJvY2Vzc29yVHlwZUVsKTsKKwkJCU1hcDxTdHJpbmcsU3RyaW5nPiBmZWF0dXJlVmFsdWVzID0gZWxlbWVudEFzUHJvcGVydHlWYWx1ZXMocHJvY2Vzc29yVHlwZUVsKTsKKwkJCXByZWZzLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKHR5cGUsIGZlYXR1cmVWYWx1ZXMpOworCQl9CisKKwkJcmV0dXJuIHByZWZzOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBlbGVtZW50QXNUeXBlKEVsZW1lbnQgcGFyZW50KQorCXsKKwkJU3RyaW5nIGlkID0gcGFyZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gaWQ7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCB0eXBlQXNFbGVtZW50KERvY3VtZW50IGRvYywgU3RyaW5nIHR5cGUpCisJeworCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicHJvY2Vzc29yVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJpZCIsIHR5cGUpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBlbGVtZW50OworCX0KKworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZWxlbWVudEFzUHJvcGVydHlWYWx1ZXMoRWxlbWVudCBlbGVtZW50KQorCXsKKwkJRWxlbWVudFtdIHByb3BlcnR5RWxzID0gUHJlZmVyZW5jZVV0aWwuZ2V0Q2hpbGRFbGVtZW50cyhlbGVtZW50LCAicHJvcGVydHkiKTsgLy8kTk9OLU5MUy0xJAorCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5VmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKKwkJZm9yIChFbGVtZW50IGZlYXR1cmVFbCA6IHByb3BlcnR5RWxzKQorCQl7CisJCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmVFbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIHZhbHVlID0gZmVhdHVyZUVsLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAorCQkJcHJvcGVydHlWYWx1ZXMucHV0KG5hbWUsIHZhbHVlKTsKKwkJfQorCQlyZXR1cm4gcHJvcGVydHlWYWx1ZXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBmZWF0dXJlVmFsdWVzQXNFbGVtZW50KERvY3VtZW50IGRvYywgRWxlbWVudCBmZWF0dXJlc0VsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5VmFsdWVzKQorCXsKKwkJaWYgKHByb3BlcnR5VmFsdWVzICE9IG51bGwpCisJCXsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHByb3BlcnR5VmFsdWVzLmVudHJ5U2V0KCkpCisJCQl7CisJCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwcm9wZXJ0eSIpOyAvLyROT04tTkxTLTEkCisJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAorCQkJCWZlYXR1cmVzRWwuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUGx1Z2luUHJvY2Vzc29ySmFyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUGx1Z2luUHJvY2Vzc29ySmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmMTAyNgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9QbHVnaW5Qcm9jZXNzb3JKYXIuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JKYXI7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIFBsdWdpblByb2Nlc3NvckphciBpbXBsZW1lbnRzIElQcm9jZXNzb3JKYXIKK3sKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBwbHVnaW5JZDsKKwlwcml2YXRlIGZpbmFsIElQYXRoIHBhdGg7CisKKwlwdWJsaWMgUGx1Z2luUHJvY2Vzc29ySmFyKFN0cmluZyBwbHVnaW5JZCwgSVBhdGggcGF0aCkKKwl7CisJCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKKwkJdGhpcy5wYXRoID0gcGF0aDsKKwl9CisKKwlwdWJsaWMgVVJMIGFzVVJMKCkKKwl7CisJCVVSTCB1cmwgPSBudWxsOworCQl0cnkKKwkJeworCQkJLy8gRklYTUUgdmVyeSBjbHVtc3kgd2F5IHRvIGdldCBsb2NhdGlvbiBvcmJpdCBqYXIgZmlsZQorCQkJLy8gVGhlcmUgaXMgc3VyZWx5IGEgYmV0dGVyIHdheSwgYnV0IEkgY2FuJ2QgZmluZCBpdC4KKwkJCWlmIChwYXRoID09IG51bGwpCisJCQl7CisJCQkJdXJsID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCisJCQkJdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOworCQkJCVN0cmluZyBzID0gdXJsLmdldFBhdGgoKTsKKwkJCQlpZiAocy5lbmRzV2l0aCgiIS8iKSkgLy8kTk9OLU5MUy0xJAorCQkJCXsKKwkJCQkJcyA9IHMuc3Vic3RyaW5nKDAscy5sZW5ndGgoKS0yKTsKKwkJCQl9CisJCQkJdXJsID0gbmV3IFVSTChzKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKKwkJCQlJUGF0aCBqYXJQYXRoID0gbmV3IFBhdGgoIi8iICsgcGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCQl1cmwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgamFyUGF0aCwgbnVsbCk7CisJCQkJaWYgKHVybCAhPSBudWxsKQorCQkJCQl1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisJCXsKKwkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOworCQl9CisJCXJldHVybiB1cmw7CisJfQorCisJcHVibGljIElQYXRoIGdldFBhdGgoKQorCXsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gIlBsdWdpbiAiICsgcGx1Z2luSWQgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlBsdWdpblByb2Nlc3Nvckphci4wIikgKyBwYXRoOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmMWJjYQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQUnVudGltZTsKKworLyoqCisgKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyCit7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKKwl7CisJCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEKTsKKworCQlQcm9jZXNzb3JQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBQcm9jZXNzb3JQcmVmZXJlbmNlcygpOworCQlwcmVmcy5zZXREZWZhdWx0UHJvY2Vzc29ySWQoSkFYUFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX0lEKTsKKworCQlPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzIG91dHB1dFByZWZzID0gbmV3IE91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMoKTsKKwkJb3V0cHV0UHJlZnMuc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoSkFYUFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX1RZUEVfSUQsIEpBWFBSdW50aW1lLmNyZWF0ZURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzKEpBWFBSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lEKSk7CisJCW91dHB1dFByZWZzLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlhBTEFOX1RZUEVfSUQsIEpBWFBSdW50aW1lLmNyZWF0ZURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlhBTEFOX1RZUEVfSUQpKTsKKwkJb3V0cHV0UHJlZnMuc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FYT05fVFlQRV9JRCwgSkFYUFJ1bnRpbWUuY3JlYXRlRGVmYXVsdE91dHB1dFByb3BlcnRpZXMoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FYT05fVFlQRV9JRCkpOworCQlvdXRwdXRQcmVmcy5zZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyhKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5TQVhPTl8xXzBfVFlQRV9JRCwgSkFYUFJ1bnRpbWUuY3JlYXRlRGVmYXVsdE91dHB1dFByb3BlcnRpZXMoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FYT05fMV8wX1RZUEVfSUQpKTsKKworCQl0cnkKKwkJeworCQkJU3RyaW5nIHhtbCA9IHByZWZzLmdldEFzWE1MKCk7CisJCQlub2RlLnB1dChKQVhQUnVudGltZS5QUkVGX1BST0NFU1NPUl9YTUwsIHhtbCk7CisKKwkJCXhtbCA9IG91dHB1dFByZWZzLmdldEFzWE1MKCk7CisJCQlub2RlLnB1dChKQVhQUnVudGltZS5QUkVGX09VVFBVVF9QUk9QRVJUSUVTX1hNTCwgeG1sKTsKKworCQkJbm9kZS5wdXQoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0RFQlVHR0lOR19JTlNUQUxMX0lELCAib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcueGFsYW4ucHJvY2Vzc29yIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQorCQl7CisJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKKwkJfQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKKwkJeworCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7CisJCX0KKwkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCisJCXsKKwkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1Byb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjkzYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1Byb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JJbnZva2VyOworCitwdWJsaWMgY2xhc3MgUHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IgaW1wbGVtZW50cyBJUHJvY2Vzc29ySW52b2tlcgoreworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaW52b2tlckNsYXNzOworCXByaXZhdGUgZmluYWwgU3RyaW5nW10gY2xhc3NwYXRoOworCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOworCXByaXZhdGUgZmluYWwgU3RyaW5nIGJ1bmRsZUlkOworCisJcHVibGljIFByb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIGJ1bmRsZUlkLCBTdHJpbmcgaW52b2tlckNsYXNzLCBTdHJpbmdbXSBjbGFzc3BhdGgpCisJeworCQl0aGlzLmlkID0gaWQ7CisJCXRoaXMuYnVuZGxlSWQgPSBidW5kbGVJZDsKKwkJdGhpcy5pbnZva2VyQ2xhc3MgPSBpbnZva2VyQ2xhc3M7CisJCXRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOworCX0KKworCXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkKKwl7CisJCXJldHVybiBjcmVhdGVFbnRyaWVzKGJ1bmRsZUlkLGNsYXNzcGF0aCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gY3JlYXRlRW50cmllcyhTdHJpbmcgYnVuZGxlSWQsIFN0cmluZ1tdIGNsYXNzcGF0aCkKKwl7CisJCUxpc3Q8U3RyaW5nPiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRyeSB7CisJCQkvLyBpZiBpbiBkZXYgbW9kZSwgdXNlIHRoZSBiaW4gZGlyCisJCQlpZiAoUGxhdGZvcm0uaW5EZXZlbG9wbWVudE1vZGUoKSkKKwkJCQllbnRyaWVzLmFkZChVdGlscy5nZXRGaWxlTG9jYXRpb24oYnVuZGxlSWQsICIvYmluIikpOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKFN0cmluZyBqYXIgOiBjbGFzc3BhdGgpCisJCQl7CisJCQkJU3RyaW5nIGVudHJ5ID0gbnVsbDsKKwkJCQlpZiAoamFyLnN0YXJ0c1dpdGgoIiR7ZWNsaXBzZV9vcmJpdDoiKSAmJiBqYXIuZW5kc1dpdGgoIn0iKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJeworCQkJCQlqYXIgPSBqYXIuc3Vic3RyaW5nKCIke2VjbGlwc2Vfb3JiaXQ6Ii5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJamFyID0gamFyLnN1YnN0cmluZygwLGphci5sZW5ndGgoKS0xKTsKKwkJCQkJdHJ5CisJCQkJCXsKKwkJCQkJCUZpbGUgYnVuZGxlRmlsZSA9IEZpbGVMb2NhdG9yLmdldEJ1bmRsZUZpbGUoUGxhdGZvcm0uZ2V0QnVuZGxlKGphcikpOworCQkJCQkJaWYgKGJ1bmRsZUZpbGUuaXNEaXJlY3RvcnkoKSkKKwkJCQkJCQllbnRyeSA9IFV0aWxzLmdldFBsdWdpbkxvY2F0aW9uKGphcikgKyAiL2JpbiI7CisJCQkJCQllbHNlCisJCQkJCQkJZW50cnkgPSBVdGlscy5nZXRQbHVnaW5Mb2NhdGlvbihqYXIpOworCQkJCQl9CisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQorCQkJCQl7fQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQllbnRyeSA9IFV0aWxzLmdldEZpbGVMb2NhdGlvbihidW5kbGVJZCxqYXIpOworCQkJCX0KKwkJCQlpZiAoZW50cnkhPW51bGwpCisJCQkJCWVudHJpZXMuYWRkKGVudHJ5KTsKKwkJCX0KKwkJfSAKKwkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgCisJCXsKKwkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOworCQl9CisJCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisJfQorCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBJUHJvY2Vzc29ySW52b2tlcgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SW52b2tlckNsYXNzTmFtZSgpCisJeworCQlyZXR1cm4gaW52b2tlckNsYXNzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKQorCXsKKwkJcmV0dXJuIGlkOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9Qcm9jZXNzb3JKYXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9Qcm9jZXNzb3JKYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTFjNzZhCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1Byb2Nlc3Nvckphci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOworCitwdWJsaWMgY2xhc3MgUHJvY2Vzc29ySmFyIGltcGxlbWVudHMgSVByb2Nlc3NvckphcgoreworCXByaXZhdGUgZmluYWwgSVBhdGggcGF0aDsKKworCXB1YmxpYyBQcm9jZXNzb3JKYXIoSVBhdGggcGF0aCkKKwl7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJfQorCisJcHVibGljIFVSTCBhc1VSTCgpCisJeworCQlVUkwgdXJsID0gbnVsbDsKKwkJdHJ5CisJCXsKKwkJCS8vIGZpcnN0IHRyeSB0byByZXNvbHZlIGFzIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoCisJCQlJUGF0aCByb290UGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKKwkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJvb3RQYXRoLmFwcGVuZChwYXRoKS50b09TU3RyaW5nKCkpOworCQkJaWYgKGZpbGUuZXhpc3RzKCkpCisJCQkJdXJsID0gZmlsZS50b1VSTCgpOworCQkJZWxzZQorCQkJeworCQkJCS8vIG5vdyB0cnkgdG8gcmVzb2x2ZSBhcyBhbiBhYnNvbHV0ZSBwYXRoCisJCQkJZmlsZSA9IG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsKKwkJCQl1cmwgPSBmaWxlLnRvVVJMKCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQorCQl7CisJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKKwkJfQorCQlyZXR1cm4gdXJsOworCX0KKworCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkKKwl7CisJCXJldHVybiBwYXRoOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUHJvY2Vzc29yUHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9Qcm9jZXNzb3JQcmVmZXJlbmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NzIyNzgKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUHJvY2Vzc29yUHJlZmVyZW5jZXMuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuUHJvY2Vzc29ySW5zdGFsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuUHJlZmVyZW5jZVV0aWw7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CisKK3B1YmxpYyBjbGFzcyBQcm9jZXNzb3JQcmVmZXJlbmNlcworeworCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRQcm9jZXNzb3JJZDsKKwlwcml2YXRlIExpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPigpOworCisJcHVibGljIHZvaWQgc2V0UHJvY2Vzc29ycyhMaXN0PElQcm9jZXNzb3JJbnN0YWxsPiBwcm9jZXNzb3JzKQorCXsKKwkJdGhpcy5wcm9jZXNzb3JzID0gcHJvY2Vzc29yczsKKwl9CisKKwlwdWJsaWMgTGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4gZ2V0UHJvY2Vzc29ycygpCisJeworCQlyZXR1cm4gcHJvY2Vzc29yczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQcm9jZXNzb3JJZCgpCisJeworCQlyZXR1cm4gZGVmYXVsdFByb2Nlc3NvcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRQcm9jZXNzb3JJZChTdHJpbmcgZGVmYXVsdFByb2Nlc3NvcklkKQorCXsKKwkJdGhpcy5kZWZhdWx0UHJvY2Vzc29ySWQgPSBkZWZhdWx0UHJvY2Vzc29ySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBc1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KKwl7CisJCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7CisJCUVsZW1lbnQgY29uZmlnID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb2Nlc3NvclNldHRpbmdzIik7ICAvLyROT04tTkxTLTEkCisJCWRvYy5hcHBlbmRDaGlsZChjb25maWcpOworCisJCS8vIFNldCB0aGUgZGVmYXVsdFZNIGF0dHJpYnV0ZSBvbiB0aGUgdG9wLWxldmVsIG5vZGUKKwkJaWYgKGRlZmF1bHRQcm9jZXNzb3JJZCAhPSBudWxsKQorCQl7CisJCQljb25maWcuc2V0QXR0cmlidXRlKCJkZWZhdWx0UHJvY2Vzc29yIiwgZGVmYXVsdFByb2Nlc3NvcklkKTsgIC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCWZvciAoSXRlcmF0b3I8SVByb2Nlc3Nvckluc3RhbGw+IGl0ZXIgPSBwcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKKwkJeworCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgaXRlci5uZXh0KCk7CisJCQlpZiAoIWluc3RhbGwuaXNDb250cmlidXRlZCgpKQorCQkJeworCQkJCUVsZW1lbnQgdm1UeXBlRWxlbWVudCA9IGluc3RhbGxBc0VsZW1lbnQoZG9jLCBpbnN0YWxsKTsKKwkJCQljb25maWcuYXBwZW5kQ2hpbGQodm1UeXBlRWxlbWVudCk7CisJCQl9CisJCX0KKworCQkvLyBTZXJpYWxpemUgdGhlIERvY3VtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBTdHJpbmcKKwkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLnNlcmlhbGl6ZURvY3VtZW50KGRvYyk7CisJfQorCisJcHVibGljIHN0YXRpYyBQcm9jZXNzb3JQcmVmZXJlbmNlcyBmcm9tWE1MKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCXsKKwkJUHJvY2Vzc29yUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgUHJvY2Vzc29yUHJlZmVyZW5jZXMoKTsKKworCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudChpbnB1dFN0cmVhbSk7CisJCUVsZW1lbnQgY29uZmlnID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworCisJCS8vIFBvcHVsYXRlIHRoZSBkZWZhdWx0IFZNLXJlbGF0ZWQgZmllbGRzCisJCXByZWZzLnNldERlZmF1bHRQcm9jZXNzb3JJZChjb25maWcuZ2V0QXR0cmlidXRlKCJkZWZhdWx0UHJvY2Vzc29yIikpOyAvLyROT04tTkxTLTEkCisKKwkJTGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4gcHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+KCk7CisJCS8vIFRyYXZlcnNlIHRoZSBwYXJzZWQgc3RydWN0dXJlIGFuZCBwb3B1bGF0ZSB0aGUgVk1UeXBlIHRvIFZNIE1hcAorCQlFbGVtZW50W10gcHJvY2Vzc29yRWxzID0gUHJlZmVyZW5jZVV0aWwuZ2V0Q2hpbGRFbGVtZW50cyhjb25maWcsICJwcm9jZXNzb3IiKTsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvckVscy5sZW5ndGg7ICsraSkKKwkJeworCQkJSVByb2Nlc3Nvckluc3RhbGwgcHJvY2Vzc29yID0gZWxlbWVudEFzSW5zdGFsbChwcm9jZXNzb3JFbHNbaV0pOworCQkJcHJvY2Vzc29ycy5hZGQocHJvY2Vzc29yKTsKKwkJfQorCisJCXByZWZzLnNldFByb2Nlc3NvcnMocHJvY2Vzc29ycyk7CisKKwkJcmV0dXJuIHByZWZzOworCX0KKworCXByaXZhdGUgc3RhdGljIElQcm9jZXNzb3JJbnN0YWxsIGVsZW1lbnRBc0luc3RhbGwoRWxlbWVudCBwYXJlbnQpCisJeworCQlTdHJpbmcgaWQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBsYWJlbCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIHR5cGVJZCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgc3VwcG9ydHMgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJzdXBwb3J0cyIpOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBkZWJ1Z2dlcklkID0gcGFyZW50LmdldEF0dHJpYnV0ZSgiZGVidWdnZXJJZCIpOyAvLyROT04tTkxTLTEkCisKKwkJSVByb2Nlc3NvckphcltdIGphcnMgPSBudWxsOworCQlFbGVtZW50W10gamFyc0VscyA9IFByZWZlcmVuY2VVdGlsLmdldENoaWxkRWxlbWVudHMocGFyZW50LCAiamFycyIpOyAvLyROT04tTkxTLTEkCisJCWlmIChqYXJzRWxzLmxlbmd0aCA9PSAxKQorCQl7CisJCQlqYXJzID0gZWxlbWVudEFzSmFycyhqYXJzRWxzWzBdKTsKKwkJfQorCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gbmV3IFByb2Nlc3Nvckluc3RhbGwoaWQsIGxhYmVsLCB0eXBlSWQsIGphcnMsIGRlYnVnZ2VySWQsIHN1cHBvcnRzLCBmYWxzZSk7CisJCXJldHVybiBpbnN0YWxsOworCX0KKworCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgaW5zdGFsbEFzRWxlbWVudChEb2N1bWVudCBkb2MsIElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwpCisJeworCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicHJvY2Vzc29yIik7IC8vJE5PTi1OTFMtMSQKKwkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImlkIiwgaW5zdGFsbC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAorCQllbGVtZW50LnNldEF0dHJpYnV0ZSgibGFiZWwiLCBpbnN0YWxsLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBpbnN0YWxsLmdldFByb2Nlc3NvclR5cGUoKS5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAorCQllbGVtZW50LnNldEF0dHJpYnV0ZSgic3VwcG9ydHMiLCBpbnN0YWxsLmdldFN1cHBvcnRzKCkpOyAvLyROT04tTkxTLTEkCisJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJkZWJ1Z2dlcklkIiwgaW5zdGFsbC5nZXREZWJ1Z2dlcigpICE9IG51bGwgPyBpbnN0YWxsLmdldERlYnVnZ2VyKCkuZ2V0SWQoKSA6IG51bGwpOyAvLyROT04tTkxTLTEkCisJCWVsZW1lbnQuYXBwZW5kQ2hpbGQoamFyc0FzRWxlbWVudChkb2MsIGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpKSk7CisJCXJldHVybiBlbGVtZW50OworCX0KKworCXByaXZhdGUgc3RhdGljIElQcm9jZXNzb3JKYXJbXSBlbGVtZW50QXNKYXJzKEVsZW1lbnQgZWxlbWVudCkKKwl7CisJCUVsZW1lbnRbXSBqYXJFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsICJqYXIiKTsgLy8kTk9OLU5MUy0xJAorCQlMaXN0PFByb2Nlc3Nvckphcj4gamFycyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc29ySmFyPihqYXJFbHMubGVuZ3RoKTsKKwkJZm9yIChFbGVtZW50IGphckVsIDogamFyRWxzKQorCQl7CisJCQlOb2RlIG5vZGUgPSBqYXJFbC5nZXRGaXJzdENoaWxkKCk7CisJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKKwkJCXsKKwkJCQlTdHJpbmcgcGF0aCA9ICgoVGV4dCkgbm9kZSkuZ2V0Tm9kZVZhbHVlKCk7CisJCQkJamFycy5hZGQobmV3IFByb2Nlc3NvckphcihQYXRoLmZyb21Qb3J0YWJsZVN0cmluZyhwYXRoKSkpOworCQkJfQorCQl9CisJCXJldHVybiAoSVByb2Nlc3NvckphcltdKSBqYXJzLnRvQXJyYXkobmV3IElQcm9jZXNzb3JKYXJbMF0pOworCX0KKworCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgamFyc0FzRWxlbWVudChEb2N1bWVudCBkb2MsIElQcm9jZXNzb3JKYXJbXSBqYXJzKQorCXsKKwkJRWxlbWVudCBqYXJzRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiamFycyIpOyAgLy8kTk9OLU5MUy0xJAorCQlmb3IgKElQcm9jZXNzb3JKYXIgamFyIDogamFycykKKwkJeworCQkJaWYgKGphciAhPSBudWxsICYmIGphci5nZXRQYXRoKCkgIT0gbnVsbCkKKwkJCXsKKwkJCQlFbGVtZW50IGphckVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImphciIpOyAvLyROT04tTkxTLTEkCisJCQkJVGV4dCB0ZXh0ID0gZG9jLmNyZWF0ZVRleHROb2RlKGphci5nZXRQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKKwkJCQlqYXJFbC5hcHBlbmRDaGlsZCh0ZXh0KTsKKwkJCQlqYXJzRWwuYXBwZW5kQ2hpbGQoamFyRWwpOworCQkJfQorCQl9CisJCXJldHVybiBqYXJzRWw7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1Byb2Nlc3NvclR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9Qcm9jZXNzb3JUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzNjkyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9Qcm9jZXNzb3JUeXBlLmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklPdXRwdXRQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOworCitwdWJsaWMgY2xhc3MgUHJvY2Vzc29yVHlwZSBpbXBsZW1lbnRzIElQcm9jZXNzb3JUeXBlCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NfU1VGRklYID0gIi5ERVNDIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NVRkZJWCA9ICIuVFlQRSI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBmaW5hbCBJVHJhbnNmb3JtZXJGYWN0b3J5W10gdHJhbnNmb3JtZXJGYWN0b3JpZXM7CisJcHJpdmF0ZSBmaW5hbCBVUkwgYXR0cmlidXRlUHJvcGVydGllc1VSTDsKKwlwcml2YXRlIGZpbmFsIFVSTCBvdXRwdXRQcm9wZXJ0aWVzVVJMOworCisJcHJpdmF0ZSBJQXR0cmlidXRlW10gYXR0cmlidXRlczsKKwlwcml2YXRlIElPdXRwdXRQcm9wZXJ0eVtdIG91dHB1dFByb3BlcnRpZXM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG91dHB1dFByb3BlcnR5VmFsdWVzOworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBhdHRyaWJ1dGVWYWx1ZXM7CisKKwlwdWJsaWMgUHJvY2Vzc29yVHlwZShTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBVUkwgYXR0cmlidXRlUHJvcGVydGllc1VSTCwgVVJMIG91dHB1dFByb3BlcnRpZXNVUkwsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlVmFsdWVzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG91dHB1dFByb3BlcnR5VmFsdWVzLCBJVHJhbnNmb3JtZXJGYWN0b3J5W10gdHJhbnNmb3JtZXJGYWN0b3JpZXMpCisJeworCQl0aGlzLmlkID0gaWQ7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuYXR0cmlidXRlUHJvcGVydGllc1VSTCA9IGF0dHJpYnV0ZVByb3BlcnRpZXNVUkw7CisJCXRoaXMub3V0cHV0UHJvcGVydGllc1VSTCA9IG91dHB1dFByb3BlcnRpZXNVUkw7CisJCXRoaXMuYXR0cmlidXRlVmFsdWVzID0gYXR0cmlidXRlVmFsdWVzOworCQl0aGlzLnRyYW5zZm9ybWVyRmFjdG9yaWVzID0gdHJhbnNmb3JtZXJGYWN0b3JpZXM7CisJCXRoaXMub3V0cHV0UHJvcGVydHlWYWx1ZXMgPSBvdXRwdXRQcm9wZXJ0eVZhbHVlczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldElkKCkKKwl7CisJCXJldHVybiBpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKKwl7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEF0dHJpYnV0ZVZhbHVlcygpCisJeworCQlyZXR1cm4gYXR0cmlidXRlVmFsdWVzOworCX0KKworCXB1YmxpYyBJQXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpCisJeworCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQorCQl7CisJCQlpZiAoYXR0cmlidXRlUHJvcGVydGllc1VSTCAhPSBudWxsKQorCQkJCWF0dHJpYnV0ZXMgPSBsb2FkQXR0cmlidXRlcygpOworCQkJZWxzZQorCQkJCWF0dHJpYnV0ZXMgPSBuZXcgSUF0dHJpYnV0ZVswXTsKKwkJfQorCQlyZXR1cm4gYXR0cmlidXRlczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IGdldE91dHB1dFByb3BlcnR5VmFsdWVzKCkKKwl7CisJCXJldHVybiBvdXRwdXRQcm9wZXJ0eVZhbHVlczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0pSRURlZmF1bHQoKQorCXsKKwkJcmV0dXJuIEpBWFBSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lELmVxdWFscyhpZCk7CisJfQorCisJcHVibGljIElUcmFuc2Zvcm1lckZhY3RvcnlbXSBnZXRUcmFuc2Zvcm1lckZhY3RvcmllcygpCisJeworCQlyZXR1cm4gdHJhbnNmb3JtZXJGYWN0b3JpZXM7CisJfQorCQorCXB1YmxpYyBJVHJhbnNmb3JtZXJGYWN0b3J5IGdldERlZmF1bHRUcmFuc2Zvcm1lckZhY3RvcnkoKQorCXsKKwkJaWYgKHRyYW5zZm9ybWVyRmFjdG9yaWVzLmxlbmd0aCA+IDApCisJCQlyZXR1cm4gdHJhbnNmb3JtZXJGYWN0b3JpZXNbMF07CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBJT3V0cHV0UHJvcGVydHlbXSBnZXRPdXRwdXRQcm9wZXJ0aWVzKCkKKwl7CisJCWlmIChvdXRwdXRQcm9wZXJ0aWVzID09IG51bGwpCisJCXsKKwkJCWlmIChvdXRwdXRQcm9wZXJ0aWVzVVJMICE9IG51bGwpCisJCQkJb3V0cHV0UHJvcGVydGllcyA9IGxvYWRPdXRwdXRQcm9wZXJ0aWVzKCk7CisJCQllbHNlCisJCQkJb3V0cHV0UHJvcGVydGllcyA9IG5ldyBJT3V0cHV0UHJvcGVydHlbMF07CisJCX0KKwkJcmV0dXJuIG91dHB1dFByb3BlcnRpZXM7CisJfQorCisJcHJpdmF0ZSBJT3V0cHV0UHJvcGVydHlbXSBsb2FkT3V0cHV0UHJvcGVydGllcygpCisJeworCQlCdWZmZXJlZElucHV0U3RyZWFtIGlzID0gbnVsbDsKKwkJTGlzdDxPdXRwdXRQcm9wZXJ0eT4gb3V0cHV0cyA9IG5ldyBBcnJheUxpc3Q8T3V0cHV0UHJvcGVydHk+KCk7CisJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworCQl0cnkKKwkJeworCisJCQlpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG91dHB1dFByb3BlcnRpZXNVUkwub3BlblN0cmVhbSgpKTsKKwkJCXByb3BzLmxvYWQoaXMpOworCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHByb3BzLmtleVNldCgpKQorCQkJeworCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbGVtZW50OworCQkJCWlmICgha2V5LmVuZHNXaXRoKERFU0NfU1VGRklYKSkKKwkJCQl7CisJCQkJCVN0cmluZyBuYW1lID0ga2V5OworCQkJCQlTdHJpbmcgdXJpID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKKwkJCQkJU3RyaW5nIGRlc2MgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkgKyBERVNDX1NVRkZJWCk7CisJCQkJCWlmICh1cmkgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwgJiYgZGVzYyAhPSBudWxsKQorCQkJCQl7CisJCQkJCQlPdXRwdXRQcm9wZXJ0eSBwcm9wID0gbmV3IE91dHB1dFByb3BlcnR5KHVyaS50cmltKCksIGRlc2MpOworCQkJCQkJb3V0cHV0cy5hZGQocHJvcCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLmdldFN0cmluZygiUHJvY2Vzc29yVHlwZS4yIikgKyBvdXRwdXRQcm9wZXJ0aWVzVVJMIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlByb2Nlc3NvclR5cGUuMyIpICsga2V5KSkpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisJCXsKKwkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJaWYgKGlzICE9IG51bGwpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlpcy5jbG9zZSgpOworCQkJCX0KKwkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKKwkJCQl7CisJCQkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gKElPdXRwdXRQcm9wZXJ0eVtdKSBvdXRwdXRzLnRvQXJyYXkobmV3IElPdXRwdXRQcm9wZXJ0eVswXSk7CisJfQorCisJcHJpdmF0ZSBJQXR0cmlidXRlW10gbG9hZEF0dHJpYnV0ZXMoKQorCXsKKwkJQnVmZmVyZWRJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisJCUxpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlPigpOworCQl0cnkKKwkJeworCQkJaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShhdHRyaWJ1dGVQcm9wZXJ0aWVzVVJMLm9wZW5TdHJlYW0oKSk7CisJCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJCXByb3BzLmxvYWQoaXMpOworCisJCQlmb3IgKE9iamVjdCBlbGVtZW50IDogcHJvcHMua2V5U2V0KCkpCisJCQl7CisJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVsZW1lbnQ7CisJCQkJaWYgKCFrZXkuZW5kc1dpdGgoREVTQ19TVUZGSVgpICYmICFrZXkuZW5kc1dpdGgoVFlQRV9TVUZGSVgpKQorCQkJCXsKKwkJCQkJU3RyaW5nIHVyaSA9IHByb3BzLmdldFByb3BlcnR5KGtleSk7CisJCQkJCVN0cmluZyB0eXBlID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgVFlQRV9TVUZGSVgpOworCQkJCQlTdHJpbmcgZGVzYyA9IHByb3BzLmdldFByb3BlcnR5KGtleSArIERFU0NfU1VGRklYKTsKKwkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHR5cGUgIT0gbnVsbCAmJiBkZXNjICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlKHVyaS50cmltKCksIHR5cGUudHJpbSgpLCBkZXNjKTsKKwkJCQkJCWF0dHJpYnV0ZXNMaXN0LmFkZChhdHRyaWJ1dGUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2cobmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBNZXNzYWdlcy5nZXRTdHJpbmcoIlByb2Nlc3NvclR5cGUuNCIpICsgYXR0cmlidXRlUHJvcGVydGllc1VSTCAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcm9jZXNzb3JUeXBlLjUiKSArIGtleSkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisJCXsKKwkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJaWYgKGlzICE9IG51bGwpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlpcy5jbG9zZSgpOworCQkJCX0KKwkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKKwkJCQl7CisJCQkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlJQXR0cmlidXRlW10gYXR0cmlidXRlcyA9IChJQXR0cmlidXRlW10pIGF0dHJpYnV0ZXNMaXN0LnRvQXJyYXkobmV3IElBdHRyaWJ1dGVbMF0pOworCQlBcnJheXMuc29ydChhdHRyaWJ1dGVzKTsKKwkJcmV0dXJuIGF0dHJpYnV0ZXM7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9UcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9UcmFuc2Zvcm1lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ5ZDQyCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1RyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVRyYW5zZm9ybWVyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIFRyYW5zZm9ybWVyRmFjdG9yeSBpbXBsZW1lbnRzIElUcmFuc2Zvcm1lckZhY3RvcnkKK3sKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBmYWN0b3J5Q2xhc3M7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKwkKKwlwdWJsaWMgVHJhbnNmb3JtZXJGYWN0b3J5KFN0cmluZyBuYW1lLFN0cmluZyBmYWN0b3J5Q2xhc3MpCisJeworCQlzdXBlcigpOworCQl0aGlzLmZhY3RvcnlDbGFzcyA9IGZhY3RvcnlDbGFzczsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpCisJeworCQlyZXR1cm4gZmFjdG9yeUNsYXNzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisJeworCQlyZXR1cm4gbmFtZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyZWJjNAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9VdGlscy5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKKworcHVibGljIGNsYXNzIFV0aWxzCit7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTG9jYXRpb24oU3RyaW5nIGJ1bmRsZUlkLCBTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24KKwl7CisJCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7CisJCXRyeQorCQl7CisJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoYnVuZGxlSWQpLCBuZXcgUGF0aChwYXRoKSwgbnVsbCk7CisJCQlpZiAodXJsICE9IG51bGwpCisJCQl7CisJCQkJVVJMIGZpbGVVcmwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwodXJsKTsKKwkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlVXJsLmdldEZpbGUoKSk7CisJCQkJbG9jYXRpb24gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworCQkJfQorCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQorCQl7CisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlV0aWxzLjAiKSArIHBhdGggKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlV0aWxzLjEiKSArIGJ1bmRsZUlkLCBlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9IAorCQlyZXR1cm4gbG9jYXRpb247CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luTG9jYXRpb24oU3RyaW5nIGJ1bmRsZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKKwkJdHJ5CisJCXsKKwkJCVVSTCB1cmwgPSBuZXcgVVJMKCJwbGF0Zm9ybTovcGx1Z2luLyIrYnVuZGxlSWQpOworCQkJaWYgKHVybCAhPSBudWxsKQorCQkJeworCQkJCVVSTCBmaWxlVXJsID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHVybCk7CisJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVVybC5nZXRGaWxlKCkpOworCQkJCWxvY2F0aW9uID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKKwkJeworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJVdGlscy4wIikgKyBidW5kbGVJZCArIE1lc3NhZ2VzLmdldFN0cmluZygiVXRpbHMuMSIpICsgYnVuZGxlSWQsIGUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0gCisJCXJldHVybiBsb2NhdGlvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmMmFmMAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjEgQEAKK0F0dHJpYnV0ZS4wPVZhbHVlIG11c3QgYmUgYSBkb3VibGUKK0F0dHJpYnV0ZS4xPVZhbHVlIG11c3QgYmUgYW4gaW50ZWdlcgorQXR0cmlidXRlLjI9VmFsaWQgdmFsdWVzIGFyZSAndHJ1ZScgb3IgJ2ZhbHNlJworQXR0cmlidXRlLjU9VmFsdWUgbXVzdCBiZSBhIGZsb2F0CitQbHVnaW5Qcm9jZXNzb3JKYXIuMD0sIHBhdGggCitQcm9jZXNzb3JUeXBlLjI9T3V0cHV0IHByb3BlcnRpZXMgZmlsZSAKK1Byb2Nlc3NvclR5cGUuMz1cIG5vdCBjb25maWd1cmVkIHByb3Blcmx5IGZvciBrZXkgCitQcm9jZXNzb3JUeXBlLjQ9QXR0cmlidXRlIHByb3BlcnRpZXMgZmlsZSAKK1Byb2Nlc3NvclR5cGUuNT1cIG5vdCBjb25maWd1cmVkIHByb3Blcmx5IGZvciBrZXkgCitVdGlscy4wPUVycm9yIGRldGVybWluaW5nIGphciBmaWxlIGxvY2F0aW9uOiAKK1V0aWxzLjE9XCBmcm9tIGJ1bmRsZTogCitYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjA9U3dpdGNoIHRvIERlZmF1bHQgRGVidWdnZXIKK1hTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuMT1UaGUgCitYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjI9XCBYU0xUIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZy5cbgorWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS4yMz1Db3VsZCBub3QgbG9jYXRlIGphciBmaWxlIAorWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS4zPVdvdWxkIHlvdSBsaWtlIHRvIGRlYnVnIHVzaW5nIHRoZSBkZWZhdWx0IAorWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS4zMT1cIHRvIAorWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS40PVwgcHJvY2Vzc29yIGluc3RlYWQ/CitYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjU9bGF1bmNoCitYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjY9bGF1bmNoLnhtbAorWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS43PUVycm9yIGNvcHlpbmcgdXJsIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0Fic3RyYWN0UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzODAyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwucmVnaXN0cnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5KQVhQTGF1bmNoaW5nUGx1Z2luOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWdpc3RyeVJlYWRlcgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nRXJyb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0KQorCXsKKwkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCkgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIkFic3RyYWN0UmVnaXN0cnlSZWFkZXIuMyIpICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCisJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIGJ1Zi50b1N0cmluZygpLCBudWxsKSkpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2dNaXNzaW5nQXR0cmlidXRlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKKwl7CisJCWxvZ0Vycm9yKGVsZW1lbnQsIE1lc3NhZ2VzLmdldFN0cmluZygiQWJzdHJhY3RSZWdpc3RyeVJlYWRlci41IikgKyBhdHRyaWJ1dGVOYW1lICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyLjYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2dNaXNzaW5nRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGVsZW1lbnROYW1lKQorCXsKKwkJbG9nRXJyb3IoZWxlbWVudCwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyLjciKSArIGVsZW1lbnROYW1lICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyLjgiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2dVbmtub3duRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKKwl7CisJCWxvZ0Vycm9yKGVsZW1lbnQsIE1lc3NhZ2VzLmdldFN0cmluZygiQWJzdHJhY3RSZWdpc3RyeVJlYWRlci45IikgKyBlbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgc3RhdGljIElFeHRlbnNpb25bXSBvcmRlckV4dGVuc2lvbnMoSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMpCisJeworCQlJRXh0ZW5zaW9uW10gc29ydGVkRXh0ZW5zaW9uID0gbmV3IElFeHRlbnNpb25bZXh0ZW5zaW9ucy5sZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KGV4dGVuc2lvbnMsIDAsIHNvcnRlZEV4dGVuc2lvbiwgMCwgZXh0ZW5zaW9ucy5sZW5ndGgpOworCQlDb21wYXJhdG9yPElFeHRlbnNpb24+IGNvbXBhcmVyID0gbmV3IENvbXBhcmF0b3I8SUV4dGVuc2lvbj4oKQorCQl7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoSUV4dGVuc2lvbiBhcmcwLCBJRXh0ZW5zaW9uIGFyZzEpCisJCQl7CisJCQkJU3RyaW5nIHMxID0gYXJnMC5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7CisJCQkJU3RyaW5nIHMyID0gYXJnMS5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7CisJCQkJcmV0dXJuIHMxLmNvbXBhcmVUb0lnbm9yZUNhc2UoczIpOworCQkJfQorCQl9OworCQlDb2xsZWN0aW9ucy5zb3J0KEFycmF5cy5hc0xpc3Qoc29ydGVkRXh0ZW5zaW9uKSwgY29tcGFyZXIpOworCQlyZXR1cm4gc29ydGVkRXh0ZW5zaW9uOworCX0KKworCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KTsKKworCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50Q2hpbGRyZW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCisJeworCQlyZWFkRWxlbWVudHMoZWxlbWVudC5nZXRDaGlsZHJlbigpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMpCisJeworCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAoIXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKSkKKwkJCQlsb2dVbmtub3duRWxlbWVudChlbGVtZW50c1tpXSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZWFkRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uKQorCXsKKwkJcmVhZEVsZW1lbnRzKGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSk7CisJfQorCisJcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpCisJeworCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOworCQlpZiAocG9pbnQgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7CisJCWV4dGVuc2lvbnMgPSBvcmRlckV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7CisJCWZvciAoSUV4dGVuc2lvbiBlbGVtZW50IDogZXh0ZW5zaW9ucykKKwkJCXJlYWRFeHRlbnNpb24oZWxlbWVudCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpCisJeworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZ0VsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKKwkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+PSAxKQorCQl7CisJCQlyZXR1cm4gY2hpbGRyZW5bMF0uZ2V0VmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc1ZhbHVlKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGVOYW1lKQorCXsKKwkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKGNsYXNzQXR0cmlidXRlTmFtZSk7CisJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkKKwkJCXJldHVybiBjbGFzc05hbWU7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNhbmRpZGF0ZUNoaWxkcmVuID0gY29uZmlnRWxlbWVudC5nZXRDaGlsZHJlbihjbGFzc0F0dHJpYnV0ZU5hbWUpOworCQlpZiAoY2FuZGlkYXRlQ2hpbGRyZW4ubGVuZ3RoID09IDApCisJCQlyZXR1cm4gbnVsbDsKKworCQlyZXR1cm4gY2FuZGlkYXRlQ2hpbGRyZW5bMF0uZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvRGVidWdnZXJSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMTQyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvRGVidWdnZXJSZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwucmVnaXN0cnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JRGVidWdnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5EZWJ1Z2dlckRlc2NyaXB0b3I7CisKK3B1YmxpYyBjbGFzcyBEZWJ1Z2dlclJlZ2lzdHJ5Cit7CisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBEZWJ1Z2dlckRlc2NyaXB0b3I+IGRlYnVnZ2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGVidWdnZXJEZXNjcmlwdG9yPigpOworCisJcHVibGljIERlYnVnZ2VyUmVnaXN0cnkoKQorCXsKKwkJRGVidWdnZXJSZWdpc3RyeVJlYWRlciByZWdpc3RyeVJlYWRlciA9IG5ldyBEZWJ1Z2dlclJlZ2lzdHJ5UmVhZGVyKCk7CisJCXJlZ2lzdHJ5UmVhZGVyLmFkZENvbmZpZ3ModGhpcyk7CisJfQorCisJcHVibGljIElEZWJ1Z2dlciBnZXREZWJ1Z2dlcihTdHJpbmcgaWQpCisJeworCQlyZXR1cm4gKElEZWJ1Z2dlcikgZGVidWdnZXJzLmdldChpZCk7CisJfQorCisJcHVibGljIElEZWJ1Z2dlcltdIGdldERlYnVnZ2VycygpCisJeworCQlyZXR1cm4gKElEZWJ1Z2dlcltdKSBkZWJ1Z2dlcnMudmFsdWVzKCkudG9BcnJheShuZXcgSURlYnVnZ2VyWzBdKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGREZWJ1Z2dlcihEZWJ1Z2dlckRlc2NyaXB0b3IgZGVzYykKKwl7CisJCWRlYnVnZ2Vycy5wdXQoZGVzYy5nZXRJZCgpLCBkZXNjKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvRGVidWdnZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0RlYnVnZ2VyUmVnaXN0cnlSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGI5ZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0RlYnVnZ2VyUmVnaXN0cnlSZWFkZXIuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkRlYnVnZ2VyRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkpBWFBMYXVuY2hpbmdQbHVnaW47CisKK3B1YmxpYyBjbGFzcyBEZWJ1Z2dlclJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RSZWdpc3RyeVJlYWRlcgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ERUJVR0dFUiA9ICJkZWJ1Z2dlciI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTUEFUSCA9ICJjbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJPQ0VTU09SX1RZUEVfSUQgPSAicHJvY2Vzc29yVHlwZUlkIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UUkFOU0ZPUk1FUl9GQUNUT1JZID0gInRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBEZWJ1Z2dlclJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCisJeworCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfREVCVUdHRVIpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7CisJCWlmIChpZCA9PSBudWxsKQorCQl7CisJCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9JRCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1NOQU1FKTsKKwkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKQorCQl7CisJCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9DTEFTU05BTUUpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlTdHJpbmcgY2xhc3NwYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTUEFUSCk7CisJCWlmIChjbGFzc3BhdGggPT0gbnVsbCkKKwkJeworCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfQ0xBU1NQQVRIKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJU3RyaW5nW10gZW50cmllcyA9IGNsYXNzcGF0aC5zcGxpdCgiOyIpOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKKwkJeworCQkJU3RyaW5nIHN0cmluZyA9IGVudHJpZXNbaV07CisJCQllbnRyaWVzW2ldID0gc3RyaW5nLnRyaW0oKTsKKwkJfQorCisJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOworCQlpZiAobmFtZSA9PSBudWxsKQorCQl7CisJCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9OQU1FKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJU3RyaW5nIHByb2Nlc3NvclR5cGVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUk9DRVNTT1JfVFlQRV9JRCk7CisJCWlmIChwcm9jZXNzb3JUeXBlSWQgPT0gbnVsbCkKKwkJeworCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfUFJPQ0VTU09SX1RZUEVfSUQpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJU3RyaW5nIHRGYWN0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RSQU5TRk9STUVSX0ZBQ1RPUlkpOworCisJCXJlZ2lzdHJ5LmFkZERlYnVnZ2VyKG5ldyBEZWJ1Z2dlckRlc2NyaXB0b3IoaWQsIGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGNsYXNzTmFtZSwgZW50cmllcywgbmFtZSwgcHJvY2Vzc29yVHlwZUlkLCB0RmFjdCkpOworCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIHJlYWRFbGVtZW50KERlYnVnZ2VyUmVnaXN0cnkgcmVnaXN0cnksIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQorCXsKKwkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OworCQlyZWFkRWxlbWVudChlbGVtZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDb25maWdzKERlYnVnZ2VyUmVnaXN0cnkgcmVnaXN0cnkpCisJeworCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7CisJCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsICJkZWJ1Z2dlciIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0ludm9rZXJSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0ludm9rZXJSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDA5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvSW52b2tlclJlZ2lzdHJ5LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JJbnZva2VyOworCitwdWJsaWMgY2xhc3MgSW52b2tlclJlZ2lzdHJ5Cit7CisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJUHJvY2Vzc29ySW52b2tlcj4gaW52b2tlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQcm9jZXNzb3JJbnZva2VyPigpOworCisJcHVibGljIEludm9rZXJSZWdpc3RyeSgpCisJeworCQlJbnZva2VyUmVnaXN0cnlSZWFkZXIgcmVnaXN0cnlSZWFkZXIgPSBuZXcgSW52b2tlclJlZ2lzdHJ5UmVhZGVyKCk7CisJCXJlZ2lzdHJ5UmVhZGVyLmFkZENvbmZpZ3ModGhpcyk7CisJfQorCisJcHVibGljIElQcm9jZXNzb3JJbnZva2VyIGdldFByb2Nlc3Nvckludm9rZXIoU3RyaW5nIGlkKQorCXsKKwkJcmV0dXJuIChJUHJvY2Vzc29ySW52b2tlcikgaW52b2tlcnMuZ2V0KGlkKTsKKwl9CisKKwlwdWJsaWMgSVByb2Nlc3Nvckludm9rZXJbXSBnZXRQcm9jZXNzb3JJbnZva2VycygpCisJeworCQlyZXR1cm4gKElQcm9jZXNzb3JJbnZva2VyW10pIGludm9rZXJzLnZhbHVlcygpLnRvQXJyYXkobmV3IElQcm9jZXNzb3JJbnZva2VyWzBdKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRJbnZva2VyRGVzY3JpcHRvcihJUHJvY2Vzc29ySW52b2tlciBkZXNjKQorCXsKKwkJaW52b2tlcnMucHV0KGRlc2MuZ2V0SWQoKSwgZGVzYyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0ludm9rZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0ludm9rZXJSZWdpc3RyeVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTYxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvSW52b2tlclJlZ2lzdHJ5UmVhZGVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5KQVhQTGF1bmNoaW5nUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuUHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3I7CisKK3B1YmxpYyBjbGFzcyBJbnZva2VyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lOVk9LRSA9ICJpbnZva2VyIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTUEFUSCA9ICJjbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIEludm9rZXJSZWdpc3RyeSByZWdpc3RyeTsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQorCXsKKwkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX0lOVk9LRSkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKKwkJaWYgKGlkID09IG51bGwpCisJCXsKKwkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0lEKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJU3RyaW5nIGNsYXNzbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7CisJCWlmIChjbGFzc25hbWUgPT0gbnVsbCkKKwkJeworCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfQ0xBU1MpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlTdHJpbmcgY2xhc3NwYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTUEFUSCk7CisJCWlmIChjbGFzc3BhdGggPT0gbnVsbCkKKwkJeworCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfQ0xBU1NQQVRIKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJU3RyaW5nW10gZW50cmllcyA9IGNsYXNzcGF0aC5zcGxpdCgiOyIpOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKKwkJeworCQkJU3RyaW5nIHN0cmluZyA9IGVudHJpZXNbaV07CisJCQllbnRyaWVzW2ldID0gc3RyaW5nLnRyaW0oKTsKKwkJfQorCisJCXJlZ2lzdHJ5LmFkZEludm9rZXJEZXNjcmlwdG9yKG5ldyBQcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvcihpZCwgZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSwgY2xhc3NuYW1lLCBlbnRyaWVzKSk7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIHZvaWQgcmVhZEVsZW1lbnQoSW52b2tlclJlZ2lzdHJ5IHJlZ2lzdHJ5LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKKwl7CisJCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKKwkJcmVhZEVsZW1lbnQoZWxlbWVudCk7CisJfQorCisJcHVibGljIHZvaWQgYWRkQ29uZmlncyhJbnZva2VyUmVnaXN0cnkgcmVnaXN0cnkpCisJeworCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7CisJCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsICJpbnZva2UiKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjOGViOQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeTsKKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5Lm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKKwkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOworCisJcHJpdmF0ZSBNZXNzYWdlcygpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhN2VlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnkuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JJbnN0YWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3NvckphcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuUHJvY2Vzc29ySW5zdGFsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkpBWFBMYXVuY2hpbmdQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5Qcm9jZXNzb3JQcmVmZXJlbmNlczsKKworcHVibGljIGNsYXNzIFByb2Nlc3NvclJlZ2lzdHJ5Cit7CisJcHJpdmF0ZSBmaW5hbCBMaXN0PFByb2Nlc3Nvckluc3RhbGw+IGNvbnRyaWJ1dGVkSW5zdGFsbHMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3Nvckluc3RhbGw+KCk7CisJcHJpdmF0ZSBMaXN0PElQcm9jZXNzb3JJbnN0YWxsPiB1c2VySW5zdGFsbHMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPigpOworCXByaXZhdGUgSVByb2Nlc3Nvckluc3RhbGwgZGVmYXVsdFByb2Nlc3NvcjsKKwlwcml2YXRlIElQcm9jZXNzb3JJbnN0YWxsIGpyZURlZmF1bHRQcm9jZXNzb3I7CisJcHJpdmF0ZSBJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzOworCisJcHVibGljIFByb2Nlc3NvclJlZ2lzdHJ5KCkKKwl7CisJCWluaXRpYWxpemVGcm9tU3RvcmFnZSgpOworCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRnJvbVN0b3JhZ2UoKQorCXsKKwkJLy8gcmVhZCBmcm9tIHRoZSByZWdpc3RyeQorCQlQcm9jZXNzb3JSZWdpc3RyeVJlYWRlciByZWdpc3RyeVJlYWRlciA9IG5ldyBQcm9jZXNzb3JSZWdpc3RyeVJlYWRlcigpOworCQlyZWdpc3RyeVJlYWRlci5hZGRDb25maWdzKHRoaXMpOworCQkvLyBmaW5kIHRoZSBqcmUgZGVmYXVsdAorCQlmb3IgKEl0ZXJhdG9yPFByb2Nlc3Nvckluc3RhbGw+IGl0ZXIgPSBjb250cmlidXRlZEluc3RhbGxzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKKwkJeworCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgaXRlci5uZXh0KCk7CisJCQlpZiAoaW5zdGFsbC5nZXRJZCgpLmVxdWFscyhKQVhQUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfSUQpKQorCQkJeworCQkJCWpyZURlZmF1bHRQcm9jZXNzb3IgPSBpbnN0YWxsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vIHJlYWQgZnJvbSB0aGUgcHJlZmVyZW5jZXMKKwkJYWRkUGVyc2lzdGVkVk1zKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFBlcnNpc3RlZFZNcygpCisJeworCQkvLyBUcnkgcmV0cmlldmluZyB0aGUgVk0gcHJlZmVyZW5jZXMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZQorCQlTdHJpbmcgdm1YTUxTdHJpbmcgPSBKQVhQTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhKQVhQUnVudGltZS5QUkVGX1BST0NFU1NPUl9YTUwpOworCisJCS8vIElmIHRoZSBwcmVmZXJlbmNlIHdhcyBmb3VuZCwgbG9hZCBWTXMgZnJvbSBpdCBpbnRvIG1lbW9yeQorCQlpZiAodm1YTUxTdHJpbmcubGVuZ3RoKCkgPiAwKQorCQl7CisJCQl0cnkKKwkJCXsKKwkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2bVhNTFN0cmluZy5nZXRCeXRlcygpKTsKKwkJCQlQcm9jZXNzb3JQcmVmZXJlbmNlcyBwcmVmcyA9IFByb2Nlc3NvclByZWZlcmVuY2VzLmZyb21YTUwoaW5wdXRTdHJlYW0pOworCQkJCVN0cmluZyBkZWZhdWx0UHJvY2Vzc29ySWQgPSBwcmVmcy5nZXREZWZhdWx0UHJvY2Vzc29ySWQoKTsKKwkJCQl1c2VySW5zdGFsbHMgPSBwcmVmcy5nZXRQcm9jZXNzb3JzKCk7CisJCQkJZm9yIChJdGVyYXRvcjxJUHJvY2Vzc29ySW5zdGFsbD4gaXRlciA9IHVzZXJJbnN0YWxscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCisJCQkJeworCQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBpdGVyLm5leHQoKTsKKwkJCQkJaWYgKGluc3RhbGwuZ2V0SWQoKS5lcXVhbHMoZGVmYXVsdFByb2Nlc3NvcklkKSkKKwkJCQkJeworCQkJCQkJZGVmYXVsdFByb2Nlc3NvciA9IGluc3RhbGw7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGRlZmF1bHRQcm9jZXNzb3IgPT0gbnVsbCkKKwkJCQl7CisJCQkJCWZvciAoSXRlcmF0b3I8UHJvY2Vzc29ySW5zdGFsbD4gaXRlciA9IGNvbnRyaWJ1dGVkSW5zdGFsbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQorCQkJCQl7CisJCQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBpdGVyLm5leHQoKTsKKwkJCQkJCWlmIChkZWZhdWx0UHJvY2Vzc29yID09IG51bGwgJiYgaW5zdGFsbC5nZXRJZCgpLmVxdWFscyhkZWZhdWx0UHJvY2Vzc29ySWQpKQorCQkJCQkJeworCQkJCQkJCWRlZmF1bHRQcm9jZXNzb3IgPSBpbnN0YWxsOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKKwkJCXsKKwkJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKKwkJCX0KKwkJfQorCQkvLyBtYWtlIHRoZSBKUkUgdGhlIGRlZmF1bHQgZGVmYXVsdAorCQlpZiAoZGVmYXVsdFByb2Nlc3NvciA9PSBudWxsKQorCQl7CisJCQlkZWZhdWx0UHJvY2Vzc29yID0ganJlRGVmYXVsdFByb2Nlc3NvcjsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGFkZFByb2Nlc3NvcihTdHJpbmcgYnVuZGxlSWQsIFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgcHJvY2Vzc29yVHlwZUlkLCBTdHJpbmcgY2xhc3NwYXRoLCBTdHJpbmcgZGVidWdnZXJJZCwgU3RyaW5nIHN1cHBvcnRzKQorCXsKKwkJSVByb2Nlc3NvckphcltdIGphcnMgPSBQcm9jZXNzb3JJbnN0YWxsLmNyZWF0ZUphcnMoYnVuZGxlSWQsIGNsYXNzcGF0aCk7CisJCWNvbnRyaWJ1dGVkSW5zdGFsbHMuYWRkKG5ldyBQcm9jZXNzb3JJbnN0YWxsKGlkLCBsYWJlbCwgcHJvY2Vzc29yVHlwZUlkLCBqYXJzLCBkZWJ1Z2dlcklkLCBzdXBwb3J0cywgdHJ1ZSkpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFByb2Nlc3NvcihJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQorCXsKKwkJaWYgKCFpbnN0YWxsLmlzQ29udHJpYnV0ZWQoKSkKKwkJCXVzZXJJbnN0YWxscy5hZGQoaW5zdGFsbCk7CisJCUlQcm9jZXNzb3JJbnN0YWxsW10gbmV3aW5zdGFsbHMgPSBuZXcgSVByb2Nlc3Nvckluc3RhbGxbaW5zdGFsbHMubGVuZ3RoICsgMV07CisJCVN5c3RlbS5hcnJheWNvcHkoaW5zdGFsbHMsIDAsIG5ld2luc3RhbGxzLCAwLCBpbnN0YWxscy5sZW5ndGgpOworCQluZXdpbnN0YWxsc1tpbnN0YWxscy5sZW5ndGhdID0gaW5zdGFsbDsKKwkJaW5zdGFsbHMgPSBuZXdpbnN0YWxsczsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVQcm9jZXNzb3IoaW50IGluZGV4KQorCXsKKwkJSVByb2Nlc3Nvckluc3RhbGwgcmVtb3ZlZCA9IGluc3RhbGxzW2luZGV4XTsKKwkJaWYgKCFyZW1vdmVkLmlzQ29udHJpYnV0ZWQoKSkKKwkJCXVzZXJJbnN0YWxscy5yZW1vdmUocmVtb3ZlZCk7CisJCUlQcm9jZXNzb3JJbnN0YWxsW10gbmV3aW5zdGFsbHMgPSBuZXcgSVByb2Nlc3Nvckluc3RhbGxbaW5zdGFsbHMubGVuZ3RoIC0gMV07CisJCVN5c3RlbS5hcnJheWNvcHkoaW5zdGFsbHMsIDAsIG5ld2luc3RhbGxzLCAwLCBpbmRleCk7CisJCVN5c3RlbS5hcnJheWNvcHkoaW5zdGFsbHMsIGluZGV4ICsgMSwgbmV3aW5zdGFsbHMsIGluZGV4LCBuZXdpbnN0YWxscy5sZW5ndGggLSBpbmRleCk7CisJCWluc3RhbGxzID0gbmV3aW5zdGFsbHM7CisJfQorCisJcHVibGljIElQcm9jZXNzb3JJbnN0YWxsW10gZ2V0UHJvY2Vzc29ycygpCisJeworCQlpZiAoaW5zdGFsbHMgPT0gbnVsbCkKKwkJeworCQkJaW5zdGFsbHMgPSBuZXcgSVByb2Nlc3Nvckluc3RhbGxbY29udHJpYnV0ZWRJbnN0YWxscy5zaXplKCkgKyB1c2VySW5zdGFsbHMuc2l6ZSgpXTsKKwkJCWludCBzdGFydEluZGV4ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0ZWRJbnN0YWxscy5zaXplKCk7IGkrKykKKwkJCXsKKwkJCQlpbnN0YWxsc1tpXSA9IChJUHJvY2Vzc29ySW5zdGFsbCkgY29udHJpYnV0ZWRJbnN0YWxscy5nZXQoaSk7CisJCQkJc3RhcnRJbmRleCA9IGkgKyAxOworCQkJfQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1c2VySW5zdGFsbHMuc2l6ZSgpOyBpKyspCisJCQl7CisJCQkJaW5zdGFsbHNbc3RhcnRJbmRleCArIGldID0gKElQcm9jZXNzb3JJbnN0YWxsKSB1c2VySW5zdGFsbHMuZ2V0KGkpOworCQkJfQorCQl9CisJCXJldHVybiBpbnN0YWxsczsKKwl9CisKKwlwdWJsaWMgSVByb2Nlc3Nvckluc3RhbGxbXSBnZXRQcm9jZXNzb3JzKFN0cmluZyBpZCkKKwl7CisJCUlQcm9jZXNzb3JJbnN0YWxsW10gaW5zdGFsbHMgPSBnZXRQcm9jZXNzb3JzKCk7CisJCUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+KCk7CisJCWZvciAoSVByb2Nlc3Nvckluc3RhbGwgdHlwZSA6IGluc3RhbGxzKQorCQl7CisJCQlpZiAodHlwZS5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoaWQpKQorCQkJCXJlc3VsdC5hZGQodHlwZSk7CisJCX0KKwkJcmV0dXJuIChJUHJvY2Vzc29ySW5zdGFsbFtdKSByZXN1bHQudG9BcnJheShuZXcgSVByb2Nlc3Nvckluc3RhbGxbMF0pOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRQcm9jZXNzb3IoSVByb2Nlc3Nvckluc3RhbGwgZGVmYXVsdEluc3RhbGwpCisJeworCQlkZWZhdWx0UHJvY2Vzc29yID0gZGVmYXVsdEluc3RhbGw7CisJfQorCisJcHVibGljIElQcm9jZXNzb3JJbnN0YWxsIGdldERlZmF1bHRQcm9jZXNzb3IoKQorCXsKKwkJcmV0dXJuIGRlZmF1bHRQcm9jZXNzb3I7CisJfQorCisJcHVibGljIElQcm9jZXNzb3JJbnN0YWxsIGdldEpSRURlZmF1bHRQcm9jZXNzb3IoKQorCXsKKwkJcmV0dXJuIGpyZURlZmF1bHRQcm9jZXNzb3I7CisJfQorCisJcHVibGljIElQcm9jZXNzb3JJbnN0YWxsW10gZ2V0Q29udHJpYnV0ZWRQcm9jZXNzb3JzKCkKKwl7CisJCXJldHVybiAoSVByb2Nlc3Nvckluc3RhbGxbXSkgY29udHJpYnV0ZWRJbnN0YWxscy50b0FycmF5KG5ldyBJUHJvY2Vzc29ySW5zdGFsbFswXSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L1Byb2Nlc3NvclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnlSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmUzZDMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L1Byb2Nlc3NvclJlZ2lzdHJ5UmVhZGVyLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5KQVhQTGF1bmNoaW5nUGx1Z2luOworCitwdWJsaWMgY2xhc3MgUHJvY2Vzc29yUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX3Byb2Nlc3NvciA9ICJwcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9MQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRV9JRCA9ICJwcm9jZXNzb3JUeXBlSWQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RFQlVHR0VSX0lEID0gImRlYnVnZ2VySWQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTUEFUSCA9ICJjbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1NVUFBPUlRTID0gInN1cHBvcnRzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBQcm9jZXNzb3JSZWdpc3RyeSByZWdpc3RyeTsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQorCXsKKwkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX3Byb2Nlc3NvcikpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKKwkJaWYgKGlkID09IG51bGwpCisJCXsKKwkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0lEKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xBQkVMKTsKKwkJaWYgKGxhYmVsID09IG51bGwpCisJCXsKKwkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0xBQkVMKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJU3RyaW5nIHByb2Nlc3NvclR5cGVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFX0lEKTsKKwkJaWYgKHByb2Nlc3NvclR5cGVJZCA9PSBudWxsKQorCQl7CisJCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9UWVBFX0lEKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJU3RyaW5nIGNsYXNzcGF0aCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU1BBVEgpOworCQlpZiAoY2xhc3NwYXRoID09IG51bGwpCisJCXsKKwkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0NMQVNTUEFUSCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCVN0cmluZyBkZWJ1Z2dlcklkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFQlVHR0VSX0lEKTsKKworCQlTdHJpbmcgc3VwcG9ydHMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU1VQUE9SVFMpOworCQlpZiAoY2xhc3NwYXRoID09IG51bGwpCisJCXsKKwkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX1NVUFBPUlRTKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmVnaXN0cnkuYWRkUHJvY2Vzc29yKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGlkLCBsYWJlbCwgcHJvY2Vzc29yVHlwZUlkLCBjbGFzc3BhdGgsIGRlYnVnZ2VySWQsIHN1cHBvcnRzKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWFkRWxlbWVudChQcm9jZXNzb3JSZWdpc3RyeSByZWdpc3RyeSwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCisJeworCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7CisJCXJlYWRFbGVtZW50KGVsZW1lbnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3MoUHJvY2Vzc29yUmVnaXN0cnkgcmVnaXN0cnkpCisJeworCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7CisJCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsICJwcm9jZXNzb3IiKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTNlNTIwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L1Byb2Nlc3NvclR5cGVSZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuRmVhdHVyZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuSkFYUExhdW5jaGluZ1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLk91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5Qcm9jZXNzb3JUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuVHJhbnNmb3JtZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5Cit7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ19TVUZGSVggPSAiLkRFU0MiOyAvLyROT04tTkxTLTEkCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVUZGSVggPSAiLlRZUEUiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIGZpbmFsIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOworCXByaXZhdGUgSVByb2Nlc3NvclR5cGVbXSBpbnN0YWxsVHlwZXM7CisKKwlwdWJsaWMgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5KCkKKwl7CisJCVByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlciByZWdpc3RyeVJlYWRlciA9IG5ldyBQcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIoKTsKKwkJcmVnaXN0cnlSZWFkZXIuYWRkQ29uZmlncyh0aGlzKTsKKwl9CisKKwlwdWJsaWMgSVByb2Nlc3NvclR5cGVbXSBnZXRQcm9jZXNzb3JUeXBlcygpCisJeworCQlpZiAoaW5zdGFsbFR5cGVzID09IG51bGwpCisJCXsKKwkJCUxpc3Q8UHJvY2Vzc29yVHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NvclR5cGU+KCk7CisJCQlTdHJpbmcgZmVhdHVyZVhNTFN0cmluZyA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEpBWFBSdW50aW1lLlBSRUZfRkVBVFVSRV9YTUwpOworCQkJLy8gSWYgdGhlIHByZWZlcmVuY2Ugd2FzIGZvdW5kLCBsb2FkIFZNcyBmcm9tIGl0IGludG8gbWVtb3J5CisJCQlGZWF0dXJlUHJlZmVyZW5jZXMgcHJlZnMgPSBudWxsOworCQkJaWYgKGZlYXR1cmVYTUxTdHJpbmcubGVuZ3RoKCkgPiAwKQorCQkJeworCQkJCXRyeQorCQkJCXsKKwkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZmVhdHVyZVhNTFN0cmluZy5nZXRCeXRlcygpKTsKKwkJCQkJcHJlZnMgPSBGZWF0dXJlUHJlZmVyZW5jZXMuZnJvbVhNTChpbnB1dFN0cmVhbSk7CisJCQkJfQorCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCisJCQkJeworCQkJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKKwkJCQl9CisJCQl9CisKKwkJCVN0cmluZyBwcm9wWE1MU3RyaW5nID0gSkFYUExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSkFYUFJ1bnRpbWUuUFJFRl9PVVRQVVRfUFJPUEVSVElFU19YTUwpOworCQkJLy8gSWYgdGhlIHByZWZlcmVuY2Ugd2FzIGZvdW5kLCBsb2FkIFZNcyBmcm9tIGl0IGludG8gbWVtb3J5CisJCQlPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzIG91dHB1dHByZWZzID0gbnVsbDsKKwkJCWlmIChwcm9wWE1MU3RyaW5nLmxlbmd0aCgpID4gMCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHByb3BYTUxTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisJCQkJCW91dHB1dHByZWZzID0gT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcy5mcm9tWE1MKGlucHV0U3RyZWFtKTsKKwkJCQl9CisJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKKwkJCQl7CisJCQkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOworCQkJCX0KKwkJCX0KKworCQkJZm9yIChJdGVyYXRvcjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCisJCQl7CisJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBpdGVyLm5leHQoKTsKKwkJCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShQcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuQVRUX0lEKTsKKwkJCQlTdHJpbmcgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShQcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuQVRUX0xBQkVMKTsKKwkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5VmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCQkJaWYgKHByZWZzICE9IG51bGwgJiYgcHJlZnMuZ2V0RmVhdHVyZXNWYWx1ZXMoaWQpICE9IG51bGwpCisJCQkJCWZlYXR1cmVWYWx1ZXMucHV0QWxsKHByZWZzLmdldEZlYXR1cmVzVmFsdWVzKGlkKSk7CisJCQkJaWYgKG91dHB1dHByZWZzICE9IG51bGwgJiYgb3V0cHV0cHJlZnMuZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoaWQpICE9IG51bGwpCisJCQkJCXByb3BlcnR5VmFsdWVzLnB1dEFsbChvdXRwdXRwcmVmcy5nZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyhpZCkpOworCisJCQkJU3RyaW5nIG91dHB1dFByb3BlcnRpZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShQcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuQVRUX09VVFBVVF9QUk9QRVJUSUVTKTsKKwkJCQlVUkwgb3V0cHV0UHJvcGVydGllc1VSTCA9IEZpbGVMb2NhdG9yLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpLCBuZXcgUGF0aChvdXRwdXRQcm9wZXJ0aWVzKSwgbnVsbCk7CisJCQkJU3RyaW5nIGZlYXR1cmVQcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9BVFRSSUJVVEVfUFJPUEVSVElFUyk7CisJCQkJVVJMIGZlYXR1cmVQcm9wZXJ0aWVzVVJMID0gRmlsZUxvY2F0b3IuZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSksIG5ldyBQYXRoKGZlYXR1cmVQcm9wZXJ0aWVzKSwgbnVsbCk7CisJCQkJCisJCQkJTGlzdDxJVHJhbnNmb3JtZXJGYWN0b3J5PiB0cmFuc0ZhY3RvcnlMaXN0ID0gbmV3IEFycmF5TGlzdDxJVHJhbnNmb3JtZXJGYWN0b3J5PigpOworCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHRyYW5zRmFjdEVscyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkVMX1RSQU5TRk9STUVSX0ZBQ1RPUlkpOworCQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHRyYW5zRmFjdEVsIDogdHJhbnNGYWN0RWxzKQorCQkJCXsKKwkJCQkJU3RyaW5nIHRyYW5zRmFjdG9yeU5hbWUgPSB0cmFuc0ZhY3RFbC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9UUkFOU0ZPUk1FUl9GQUNUT1JZX05BTUUpOworCQkJCQlTdHJpbmcgdHJhbnNGYWN0b3J5Q2xhc3MgPSB0cmFuc0ZhY3RFbC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9UUkFOU0ZPUk1FUl9GQUNUT1JZX0NMQVNTKTsKKwkJCQkJdHJhbnNGYWN0b3J5TGlzdC5hZGQobmV3IFRyYW5zZm9ybWVyRmFjdG9yeSh0cmFuc0ZhY3RvcnlOYW1lLHRyYW5zRmFjdG9yeUNsYXNzKSk7CisJCQkJfQorCQkJCQorCQkJCXR5cGVzLmFkZChuZXcgUHJvY2Vzc29yVHlwZShpZCwgbGFiZWwsIGZlYXR1cmVQcm9wZXJ0aWVzVVJMLCBvdXRwdXRQcm9wZXJ0aWVzVVJMLCBmZWF0dXJlVmFsdWVzLCBwcm9wZXJ0eVZhbHVlcywgdHJhbnNGYWN0b3J5TGlzdC50b0FycmF5KG5ldyBJVHJhbnNmb3JtZXJGYWN0b3J5WzBdKSkpOworCQkJfQorCQkJaW5zdGFsbFR5cGVzID0gdHlwZXMudG9BcnJheShuZXcgSVByb2Nlc3NvclR5cGVbMF0pOworCQl9CisJCXJldHVybiBpbnN0YWxsVHlwZXM7CisJfQorCisJcHVibGljIElQcm9jZXNzb3JUeXBlW10gZ2V0UHJvY2Vzc29yVHlwZXNFeGNsSlJFRGVmYXVsdCgpCisJeworCQlJUHJvY2Vzc29yVHlwZVtdIGluc3RhbGxUeXBlcyA9IGdldFByb2Nlc3NvclR5cGVzKCk7CisJCUxpc3Q8SVByb2Nlc3NvclR5cGU+IGV4Y2xUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SVByb2Nlc3NvclR5cGU+KGluc3RhbGxUeXBlcy5sZW5ndGggLSAxKTsKKwkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogaW5zdGFsbFR5cGVzKQorCQl7CisJCQlpZiAoIXR5cGUuaXNKUkVEZWZhdWx0KCkpCisJCQkJZXhjbFR5cGVzLmFkZCh0eXBlKTsKKwkJfQorCQlyZXR1cm4gKElQcm9jZXNzb3JUeXBlW10pIGV4Y2xUeXBlcy50b0FycmF5KG5ldyBJUHJvY2Vzc29yVHlwZVswXSk7CisJfQorCisJcHVibGljIHZvaWQgYWRkVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKKwl7CisJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKKwl9CisKKwlwdWJsaWMgSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZShTdHJpbmcgaWQpCisJeworCQlJUHJvY2Vzc29yVHlwZVtdIGluc3RhbGxUeXBlcyA9IGdldFByb2Nlc3NvclR5cGVzKCk7CisJCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IGluc3RhbGxUeXBlcykKKwkJeworCQkJaWYgKHR5cGUuZ2V0SWQoKS5lcXVhbHMoaWQpKQorCQkJCXJldHVybiB0eXBlOworCQl9CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFlMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L1Byb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwucmVnaXN0cnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuSkFYUExhdW5jaGluZ1BsdWdpbjsKKworcHVibGljIGNsYXNzIFByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlciBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlSZWFkZXIKK3sKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcHJvY2Vzc29yVHlwZSA9ICJwcm9jZXNzb3JUeXBlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTEFCRUwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX09VVFBVVF9QUk9QRVJUSUVTID0gIm91dHB1dFByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0FUVFJJQlVURV9QUk9QRVJUSUVTID0gImF0dHJpYnV0ZVByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfVFJBTlNGT1JNRVJfRkFDVE9SWSA9ICJ0cmFuc2Zvcm1lckZhY3RvcnkiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UUkFOU0ZPUk1FUl9GQUNUT1JZX05BTUUgPSAibmFtZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RSQU5TRk9STUVSX0ZBQ1RPUllfQ0xBU1MgPSAiZmFjdG9yeUNsYXNzIjsKKworCXByaXZhdGUgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCisJeworCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfcHJvY2Vzc29yVHlwZSkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKKwkJaWYgKGlkID09IG51bGwpCisJCXsKKwkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0lEKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xBQkVMKTsKKwkJaWYgKGxhYmVsID09IG51bGwpCisJCXsKKwkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0xBQkVMKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJU3RyaW5nIG91dHB1dFByb3BlcnRpZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfT1VUUFVUX1BST1BFUlRJRVMpOworCQlpZiAob3V0cHV0UHJvcGVydGllcyA9PSBudWxsKQorCQl7CisJCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9PVVRQVVRfUFJPUEVSVElFUyk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCVN0cmluZyBmZWF0dXJlUHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9BVFRSSUJVVEVfUFJPUEVSVElFUyk7CisJCWlmIChmZWF0dXJlUHJvcGVydGllcyA9PSBudWxsKQorCQl7CisJCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9BVFRSSUJVVEVfUFJPUEVSVElFUyk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJlZ2lzdHJ5LmFkZFR5cGUoZWxlbWVudCk7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIHZvaWQgcmVhZEVsZW1lbnQoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKKwl7CisJCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKKwkJcmVhZEVsZW1lbnQoZWxlbWVudCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkQ29uZmlncyhQcm9jZXNzb3JUeXBlUmVnaXN0cnkgcmVnaXN0cnkpCisJeworCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7CisJCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsICJwcm9jZXNzb3JUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjQwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDYgQEAKK0Fic3RyYWN0UmVnaXN0cnlSZWFkZXIuMz0sIGV4dGVuc2lvbiAKK0Fic3RyYWN0UmVnaXN0cnlSZWFkZXIuNT1SZXF1aXJlZCBhdHRyaWJ1dGUgJworQWJzdHJhY3RSZWdpc3RyeVJlYWRlci42PScgbm90IGRlZmluZWQKK0Fic3RyYWN0UmVnaXN0cnlSZWFkZXIuNz1SZXF1aXJlZCBzdWIgZWxlbWVudCAnCitBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyLjg9JyBub3QgZGVmaW5lZAorQWJzdHJhY3RSZWdpc3RyeVJlYWRlci45PVVua25vd24gZXh0ZW5zaW9uIHRhZyBmb3VuZDogCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjA0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDYgQEAKK1hTTFRSdW50aW1lLjEwPUZhaWxlZCB0byBzYXZlIHByb2Nlc3MgcHJlZmVyZW5jZXMKK1hTTFRSdW50aW1lLjU9U2F2aW5nIGF0dHJpYnV0ZXMuLi4KK1hTTFRSdW50aW1lLjY9RmFpbGVkIHRvIHNhdmUgYXR0cmlidXRlIHByZWZlcmVuY2VzCitYU0xUUnVudGltZS43PVNhdmluZyBwcm9wZXJ0aWVzLi4uCitYU0xUUnVudGltZS44PUZhaWxlZCB0byBzYXZlIG91dHB1dCBwcm9wZXJ0eSBwcmVmZXJlbmNlcworWFNMVFJ1bnRpbWUuOT1TYXZpbmcgcHJvY2Vzc29ycy4uLgo=